-
Notifications
You must be signed in to change notification settings - Fork 15
/
18、系统日志
534 lines (384 loc) · 16 KB
/
18、系统日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
系统日志一般被设计为只有 root 权限才能查看
系统日志 主要存储在如下几个地方
/var/log/boot.log
本次开机过程中,内核检测与启动硬件、启动内核相关程序 的日志
/var/log/cron
crontab 的日志
/var/log/dmesg
开机硬件检测信息
/var/log/lastlog
系统中,各种用户最后一次登录系统的 设备 IP 时间
/var/log/maillog 或 /var/log/mail/*
邮件往来信息,主要记录 postfix(SMTP 服务) 和 dovecot(POP3 服务) 产生的信息
/var/log/messages
系统错误信息
/var/log/secure
只要涉及到“输入密码”这项操作,就会被记录到这个日志里面
/var/log/wtmp /var/log/failog
记录 成功/失败 登录系统的账号信息
/var/log/httpd/* /var/log/samba/*
httpd 与 samba 网络服务的日志
与日志相关的服务和命令
systemd-journald.service 由 systemd 提供的,系统级别的日志记录服务
rsyslog.service 与 登录 和 网络服务 相关的信息
logrotate 日志轮替工具
以及部分程序会自定义自身的日志记录方法
一条日志,一般包含以下内容
<1> 事件发生的日期与时间
<2> 发生事件的主机名
<3> 启动该事件的 服务名/指令/函数
<4> 实际记录的信息
rsyslog.service 的 配置文件 /etc/rsyslog.conf
以 mail 行为例
mail.* -/var/log/maillog
<服务名称>.[=!]<日志等级> <记录日志的文件路径/设备名/主机名>
1、服务名称(facility)
kernel 中 syslog 函数内置的几类 facility
auth 安全/认证信息
authpriv 安全/认证信息(私有内容)
cron 计划任务类的信息
daemon 系统服务类的信息
ftp 与 FTP 相关的信息
kern 内核信息(不可从用户进程中产生)
local0 至 local7 预留给本机使用的 facility 类别
lpr 打印机相关的信息
mail 邮件相关的信息
news 与网络新闻相关的信息
syslog 由 syslogd 内部产生的信息
user 【默认】通用用户信息
uucp Unix to Unix Copy Protocol 早期的 Unit 系统间程序信息交换
如果不同的程序要使用 syslog 函数来记录日志,就会将自己定义为上述某个 facility
2、日志等级(level/priority)
kernel 中 syslog 函数内置的几类 level/priority
emerg 0 系统不可用
alert 1 需要立刻获得反应
crit 2 严重错误
err 3 错误状态
warning 4 警告状态
notice 5 重要的信息
info 6 一般的信息
debug 7 查错级别信息
特殊的符号
* 表示所有的 facility 或 priority
none 表示不含指定的 facility 的任何一个 priority
3、分隔符与其扩展
. facility 和 priority 之间的间隔,任何 priority 大于指定 priority 的日志都会被记录
.= 仅记录指定的 priority
.! 仅记比指定等级低的日志
4、多 facility 与 多 priority 定义
eg1.多 facility 同 priority 同文件
cron,mail,daemon.err /var/log/errors
eg2.多 facility 多 priority 同文件
cron.debug;mail.err,daemon.info /var/log/messup
5、记录日志的文件路径/设备名/主机名
日志文件的绝对路径 比如 /var/log/maillog 表示记录到文件中
日志文件的输出设备 比如 /dev/lp0 表示从打印机输出
使用者名 比如 eP 表示显示给用户
远程主机 比如 @eP.ePCt 表示输出至支持 syslog 的远程主机
* 表示输出至当前在线的所有人(类似 wall 命令)
在路径前加 - 表示每次有 写操作 时,仅存在 buffer 中,不立刻 sync 入硬盘
在 syslog 的 v3 版本之后,这个是默认操作(可在 $ActionFileEnableSync 中定义)
6、三个相关的名词 syslog rsyslogd rsyslog.service
syslog 内核的函数
rsyslogd 将 syslog 产生的 message 记录成为日志
rsyslog.service 由 systemd 总控下的 rsyslogd 服务的配置文件
建立 syslog 收集服务器/发送客户端
修改 收集服务器的 /etc/rsyslog.conf
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
将 UDP 或 TCP 字段的 注释去掉即可
修改 发送客户端的 /etc/rsyslog.conf
在指定的 <facility>.<priority> 之后接上 @<服务器 IP> 即可
logrotate 日志的轮替
请注意 rsyslogd 是由 systemd 控制的,也就是说,一旦有日志需要被产生, rsyslogd 就起作用
而 logrotate 则是由 cron 控制的,也就是在 固定的时间点 进行 日志轮替
具体的命令行存在于 /etc/cron.daily/logrotate 文件中
也就是说,logrotate 默认是一个每日执行的任务
logrotate 的配置文件
/etc/logrotate.conf 主要配置文件
/etc/logrotate.d/ 增补配置内容
<1> 局部配置将 override 全局配置
<2> 后续的配置条目将 override 先前的配置的条目
EG.
# sample logrotate configuration file <= 这里是注释
compress <= 全局配置
/var/log/messages { <= 针对指定 log 文件的配置
rotate 5
weekly
postrotate
/sbin/killall -HUP syslogd
endscript
}
"/var/log/httpd/access.log" /var/log/httpd/error.log { <= 多重 log 文件相同配置,可用 空格 或 回车 隔开
rotate 5 + 可使用引号屏蔽空格转义,可使用反斜线来转义
mail [email protected] + 可以使用 星号 来进行通配
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
/var/log/news/news.crit {
monthly
rotate 2
olddir /var/log/news/old
missingok
postrotate
kill -HUP `cat /var/run/inn.pid`
endscript
nocompress
}
logrotate 配置文件的关键字
compress
旧版 log 文件 将被压缩,默认使用 gzip
compresscmd
自定义 压缩 将使用的 命令
uncompresscmd
自定义 解压缩 将使用的 命令,默认使用 gunzip
compressext
自定压缩后文件的后缀名,默认是 压缩命令 定义的后缀名
compressoptions
将传入 压缩命令 的参数
若使用默认的 gzip ,则默认传入的参数是 “-9”(也即最大压缩)
copy
不变更当前的 log 文件,仅将当前的 log 文件做一个拷贝(类似于 snapshot)
此选项将使 create 选项无效化
copytruncate
为当前的 log 文件做一个备份,并截短 当前的 log 文件
此选项将使 create 选项无效化
有别于普通的 将当前的 log 文件变成备份文件,并创建新的 当前 log 文件
用于部分程序不能关闭自身的 log 文件
create <mode> <owner> <group> 或 create <owner> <group>
当 轮替动作 结束后,立刻(先于 postrotate 脚本)创建一个 与被轮替文件名相同的文件
<mode> 定义了新文件的基础权限(同 chmod)
<owner> 定义了文件的所有者
<group> 定义了文件的所有组
若三个参数中的任何一个未被定义,则使用 被轮替之前 文件的参数
createolddir <mode> <owner> <group>
如果被 olddir 选项定义的目录并不存在,就创建之
<mode> 定义了目录的基础权限(同 chmod)
<owner> 定义了目录的所有者
<group> 定义了目录的所有组
daily
每日轮替文件
dateext
轮替的旧文件将用时间戳(YYYYMMDD)作为后缀,而非简单的增量数值
时间戳的形式可以使用 dateformat 和 dateyesterday 选项定义
dateformat <formate string>
指定 时间戳 后缀的日期格式
可使用的变量有
%Y 四位数字形式年份
%m 数字形式月份
%d 数字形式日期
%s 从 1970-01-01 00:00:00 至今的秒数
若要使 %s 正常工作,需要将系统时间设置在 2001年9月9日之后
请使用顺次排序时间单位的方法排序时间,因为 logrotate 会直接排序文件名来决定文件的新旧
dateyesterday
使用昨天而非当下的时间戳
这样可以使文件的时间戳和最后一条日志的时间戳处在同一天
delaycompress
将 log 文件的 压缩 延迟到下个 轮替循环 中执行
仅在 和 compress 连用下有效
防止部分程序不能关闭 log 文件而造成的压缩后依旧在写入 log 文件
extension <ext>
log 文件在轮替后将赋予的后缀名,若使用了压缩,则压缩名将出现在 该后缀名 之后
hourly
每小时执行轮替
这个设置需要同时修改 cron 中对 logrotate 的设置,才能使其正常工作
ifempty
即使 log 文件是空的也进行轮替动作
将 override notifempty 选项
ifempty 是默认值
include <文件或目录>
将指定的文件/目录中的文件的内容当成 行内选项 传入
若文件非 regular file 将被忽略
若文件以 tabooext 中定义的某个后缀作为后缀,则也会被忽略
include 不可以出现在对 log file 的单独定义中
mail <address>
当 轮替的文件 被轮替至移出硬盘时,会发送给指定的地址
nomail 可以让 mail 无效化
mailfirst
与 mail 连用
将刚轮替的最新文件发送给指定的地址
maillast
与 mail 连用
将即将过期(即将被移出硬盘)的轮替文件发给指定的地址
maxage <count>
当轮替发生时,移除/邮寄大于 <count> 天数 的旧文件
maxsize <size>
当文件大小大于 <size> 的时候,就会执行轮替动作
同时会重置轮替时间间隔,让其以本次轮替作为轮替的开始计时时间
minsize <size>
若达到轮替的时间间隔,但文件大小未达到 <size> 的时候,就不执行轮替动作
missingok
若 log 文件丢失,也执行下去,而不报错
monthly
每月轮替文件
nocompress
旧的 log 文件将不会被压缩
nocopy
不要复制原始 log 文件
override copy 选项
nocopytruncate
在创建备份之后,不要截短原始 log 文件
override copytruncate 选项
nocreate
不要创建新文件
override create 选项
nocreateolddir
nodelaycompress
不要延迟压缩
override delaycompress 选项
nodateext
不要使用 时间戳 作为 旧文件的后缀
override dateext 选项
nomail
不要发送邮件
nomissingok
如果一个 log 文件丢失了,就发布错误
默认设置
noolddir
在 log 所在的目录存储的 旧文件
nosharedscripts
只要轮替一个 log 文件,就执行一遍 prerotate 和 postrotate 中的脚本
若执行出现错误,则仅有针对该 log 文件的剩余操作不会被执行
默认参数
override sharedscripts 选项
noshred
在删除旧文件时,不使用 shred 命令
notifempty
如果 log 文件为空,则不执行轮替
override ifempty 选项
olddir <目录>
已经被轮替的旧 log 文件将放置于这个目录中
默认使用相对于 被轮替的 log 文件的相对路径
可以使用绝对路径
可被 nooldir 选项
postrotate/endscript
在 上述两个名称之间的行
会在 log 文件被轮替 之后 执行
log 文件的绝对路径会作为第一个参数传入定义的脚本中
这个选项 必须 被定义在 针对 指定 log 的配置中
prerotate/endscript
若 log 文件的轮替 将实际被执行
在 上述两个名称之间的行
会在 log 文件实际轮替 之前 执行
log 文件的绝对路径会作为第一个参数传入定义的脚本中
这个选项 必须 被定义在 针对 指定 log 的配置中
firstaction/endscript
若有至少一个 log 文件将要被轮替
则在 prerotate 字段执行前被执行
log 文件的绝对路径会作为第一个参数传入定义的脚本中
若执行出现错误,则不会继续执行任何操作
这个选项 必须 被定义在 针对 指定 log 的配置中
lastaction/endscript
若有任何一个 log 文件被轮替
则在 postrotate 字段执行后被执行
log 文件的绝对路径会作为第一个参数传入定义的脚本中
这个选项 必须 被定义在 针对 指定 log 的配置中
preremove/endscript
若有一个旧 log 文件将被移除
则在移除动作前执行
log 文件的绝对路径会作为第一个参数传入定义的脚本中
这个选项 必须 被定义在 针对 指定 log 的配置中
rotate <count>
log 文件将经历 <count> 次操作后被移除或邮寄
如果 <count> 为 0,则旧文件会直接移除,而非轮替
size <size>
当文件大小大于 <size> 的时候就会被轮替
默认使用的单位为 bytes,可使用的单位有 k M G
这个操作独立于时间间隔轮替操作
sharedscripts
对于多个轮替的 log 文件,只执行一次 prerotate 和 postrotate
若执行出现错误,则剩余的操作都不会被执行
log 文件的路径会顺次作为参数传入脚本中
shred
在删除 log 文件的时候,使用 shred -u 命令复写数据块并删除,而非 unlink() 函数
这保证了 log 文件在删除之后不可被还原
shredcycles <count>
在使用 shred 复写删除的时候,指定复写的次数
start <count>
若使用数字作为后缀名,则定义起始的编号为 <count>
su <user> <group>
使用自定义的 用户 和 组 来执行轮替工作
tabooext [+] <list>
替换当前的 taboo 列表内容,作用见 include 选项
若使用了 加号,则表示向 taboo 列表中增加内容
默认的后缀列表见帮助文件
weekly
每周进行轮替操作
yearly
每年进行轮替操作
logrotate 命令——手动执行 log rotate
logrotate [-dv] [-f] [-m <command>] [-s <file>] <config file> ..
-d, --debug 除错模式,自带 -v 参数,不会对 log 文件和 logrotate 状态文件(state file)做任何实际的更改
-f, --force 强制执行 logrotate,完全无视一个 log 文件是否需要被执行轮替
-m, --mail <command> 当 logrotate 执行邮寄 log 任务时,实际执行的命令
<command> 需要接受两个参数,第一个是信息的主题,第二个是收信人
接着这个命令就会从 StdIn 读取信息,并邮寄给收信人
默认使用 /bin/mail -s
-s, --state <state file> 使用指定的文件作为 logrotate 的 state 文件(其中记录了最后一次 log 文件被轮替的时间)
默认使用 /var/lib/logrorate.status
--usage 输出一段用量信息
-v, --verbose 使用详细输出
systemd-journald.service
systemd-journald 使用内存来记录 log,所以这个 log 只能存留在本次关机之前的 log
将 systemd-journald 的 log 文件从 /run/log/ 移动至硬盘中
只需要在指定目录新建文件夹,接着修改目录的权限即可
EG.
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2775 /var/log/journal
journalctl 罗列 systemd-journald 记录的内容
journalctl [OPTIONS...] [MATCHES...]
[OPTIONS]常用参数
-n, --lines=<num>
显示最新的 <num> 行,若不指定,则默认使用 10 行
-r, --reverse
从新至旧输出 systemd log,默认是从旧向新输出
-p, --priority=
仅输出比指定 log 等级(参见上文 日志等级)相同或更高(数值小)的日志
-f, --follow
不断刷新显示最新的日志,内含 -n 选项
[MATCHES]常用参数
_SYSTEMD_UNIT=
仅输出 指定的 Unit 名 所产生的 log
_COMM=
仅输出 指定 进程名 所产生的 log
_EXE=
仅输出 指定的 二进制文件 产生的 进程 所产生的 log
_CMDLINE=
仅输出 指定的 命令行 产生的 进程 所产生的 log
_SELINUX_CONTEXT=
仅输出 带有指定的 SELinux Context 的 log
_PID=
仅输出 指定的 PID 产生的 log
_UID=
仅输出 具有指定 UID 的进程 产生的 log
_GID=
仅输出 具有指定 GID 的进程 产生的 log
_HOSTNAME=
仅输出 指定的 主机名 产生的 log
SYSLOG_FACILITY=
仅输出 指定的 facility (参见上文 服务名称)产生的 log
# [MATCH]字段的使用规则
# 对于同一个 字段,反复指定表示 或,也就是只要符合其中一个就输出
eg. SYSLOG_FACILITY=cron SYSLOG_FACILITY=daemon
表示只要是 cron 类型或 daemon 类型的 log 都输出
# 对于不同的 字段,多重指定表示 且,也就是必须全部符合才能输出
eg. _SYSTEMD_UNIT=crond.service _UID=0
表示仅显示由 root 权限执行的 Unit 名为 crond 输出的 log
# 可以使用 加号 + 作为 或 链接符使用
eg. MATCH1 + MATCH2 MATCH3 + MATCH4 MATCH5
表示 (MATCH1) OR (MATCH2 MATCH3) OR (MATCH4 MATCH5)
logger 将自定义的信息记录至 log 中
logger [-p <服务名称>.<等级>] "<log 内容>"
eg.
[eP@ePCt ~]$ logger -p user.info "Whoo~Ho~"
[eP@ePCt ~]$ journalctl SYSLOG_FACILITY=1 -n 3
# 返回的最后一行是:
# 12月 07 18:48:04 ePCt eP[2922]: Whoo~Ho~