https://zhuanlan.zhihu.com/p/92804167
rsyslog负责写入日志, logrotate负责备份和删除旧日志, 以及更新日志文件
Linux的日志记录了用户在系统上一切操作,看日志去分析系统的状态是运维人员必须掌握的基本功。
rsyslog日志服务器的优势:
1、日志统一,集中式管理
2、日志实时传送到一个更加安全的远端服务器上,真正记录用户行为,使日志的2次更改可能性大大降低,从而能够对日志进行真实回放,便于问题追踪。
rsyslog的新功能:
rsyslog是一个加强版的syslog,具有各种各样的新功能,典型的有:
1、直接将日志写入到数据库。
2、日志队列(内存队列和磁盘队列)。
3、灵活的模板机制,可以得到多种输出格式。
4、插件式结构,多种多样的输入、输出模块。
5、可以把日志存放在MySQL ,PostgreSQL,Oracle等数据库中
/etc/rsyslog.conf
重启rsyslog
service rsyslog restart
service rsyslog status
日志滚动-logrotate
覆盖之前的日志 保证随着日志的增长 磁盘空间不增长
2.1) logrotate日志滚动的介绍
所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费,同时也加快了管理员查看日志所用的时间。因而logrotate就非常有存在的必要了,Redhat系统中已经默然安装logrotate且利用logrotate设置了相关对rsyslog日志迅速增长的设置。
logrotate的执行由crond服务实现。在/etc/cron.daily目录中,有个文logrotate,它实际上是个shell script,用来启动logrotate。
logrotate程序每天由cron在指定的时间(/etc/crontab)启动。
logrotate的执行由crond服务实现。在/etc/cron.daily目录中,有个文logrotate,它实际上是个shell script,用来启动logrotate。
logrotate程序每天由cron在指定的时间(/etc/crontab)启动。
daily: 日志文件分割频度。可选值为 daily,monthly,weekly,yearly
rotate 7: 一次将存储7个归档日志。对于第8个归档,时间最久的归档将被删除。
missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
dateext 使用日期作为命名格式
compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
nocompress: 如果你不希望对日志文件进行压缩,设置这个参数即可
delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
notifempty: 如果日志文件为空,轮循不会进行。
sharedscripts 表示postrotate脚本在压缩了日志之后只执行一次
create 644 www root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript: 最通常的作用是让应用重启,以便切换到新的日志文件, 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,nginx 进程将立即再次读取其配置并继续运行。
举例:
include /etc/logrotate.d #包含/etc/logrotate.d目录下的所有配置文件
/var/log/wtmp { #对/var/log/wtmp这个日志文件按照下面的设定日志回滚
monthly #每月轮转一次
create 0664 root utmp #设置wtmp这个日志文件的权限,属主,属组
minsize 1M #日志文件必须大于1M才会去轮换(回滚)
rotate 1 #保存一个轮换日志
}
/var/log/btmp {
missingok #如果文件丢失不报错
monthly
create 0600 root utmp
rotate 1
}
[root@rhel6_1 ~]# cat /etc/logrotate.d/syslog
/var/log/cron #这些文件是rsyslog.conf文件中全局配置定义中指定的Target的路径
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate # 轮换之后重启rsyslog服务
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
选项 | 用途 |
---|---|
nocompress,compress | 不压缩,压缩 |
delaycompress | 不压缩前一个截断的文件(需要与compress一起用) |
daily,weekly,monthly | 每天/周/月轮转一次 |
copytruncate | 清空原有文件,而不是创建一个新文件 |
create 0644 root utmp | 新建日志文件,权限、属主、组 |
ifempty | 即使用空文件也转储 |
notifempty | 日志文件为空不进行转储 |
olddir <dir> | 转储后的日志存放目录,必须和当前日志文件在同一个文件系统 |
rotate 5 | 保留最近的5个日志文件 |
minisize 1M | 必须大于1MB才会转转 |
size 50M | 超过50MB后轮转日志 |
mail www@my.org | 轮换后的把日志发给邮箱 |
missingok | 如果日志文件不存在,不报错 |
prerotate,endscript | 在logrotate之前执行的命令,如/usr/bin/charrt -a /var/log/logfile |
postrotate,endscript | 在logrotate之后执行的命令,如/usr/bin/charrt +a /var/log/logfile |
/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2>/dev/null) &>/dev/null | |
/usr/bin/killall -HUP httpd | |
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) | |
sharedscripts | 共享脚本,表示切换时只执行一次脚本 |
dateext | 增加日期作为后缀,不然会是一串无意义的数字 |
dateformat .%s | 切换后文件名,必须配合dateext使用 |
- /etc/logrotate.conf
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
# see "man logrotate" for details
# rotate log files weekly
weekly
#–每周轮转一次
# keep 4 weeks worth of backlogs
rotate 4
#–保留四个
# create new (empty) log files after rotating old ones
create
#–rotate后,创建一个新的空文件
# uncomment this if you want your log files compressed
#compress #–默认是不压缩的
# RPM packages drop log rotation information into this directory
include
/etc/logrotate
.d
#–这个目录下面配置文件生效
# no packages own wtmp - we'll rotate them here
/var/log/wtmp
{
#–定义/var/log/wtmp这个日志文件
monthly
#–每月轮转一次,取代了上面的全局设定的每周轮转一次
minsize 1M
#–定义日志必须要大于1M大小才会去轮转
create 0664 root utmp
#–新的日志文件的权限,属主,属主
rotate 1
#–保留一个,取代了上面的全局设定的保留四个
}
/var/log/btmp
{
missingok
#-如果日志丢失, 不报错
monthly
create 0600 root utmp
rotate 1
}
- logrotate.conf范例
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
# sample logrotate configuration file
compress
# 全局设置, 压缩
/var/log/messages
{
rotate 5
# 保留5份日志
weekly
# 每周轮换一次
postrotate
# 轮换之后重启syslogd服务
/usr/bin/killall
-HUP syslogd
# rhel6中为:/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
# 可查看/etc/logrotate.d/下的配置文件
endscript
}
"/var/log/httpd/access.log"
/var/log/httpd/error
.log {
# 指定多个文件, 如果有特殊字符需要用单引号
rotate 5
mail www@my.org
size 100k
# 超过100k后切换日志, 并把老的日志发送邮件给www@my.org
sharedscripts
# 共享脚本.下面的postrotate脚本只运行一次.
postrotate
/usr/bin/killall
-HUP httpd
endscript
}
/var/log/news/
* {
# 少用通配符, 因会它会包括已经切换过的日志, 要用的话最好在*号后加上扩展名, 如*.log
monthly
rotate 2
olddir
/var/log/news/old
missingok
postrotate
kill
-HUP
'cat /var/run/inn.pid'
endscript
nocompress
}
/var/log/ipwall/messages
.log {
#日志路径一定要和rsyslog定义的日志文件路径一致
rotate 65535
#滚动65535次
create 0777 syslog adm
#设置权限,方便windows连接samba服务器
compress
#采用压缩
size 50M
#文件大小50M以上的分割日志
dateext
dateformat .%s
#定义文件切割后的文件名,必须配合dateext使用
#posrotate/endscript这段脚本使rsyslog程序重新读取配置文件,程序释放对messages.log文件持有的文件描述符
postrotate
/bin/kill
-HUP $(
/bin/cat
/var/run/rsyslogd
.pid 2>
/dev/null
) &>
/dev/null
endscript
}
- 强制轮转
1
2
3
4
5
6
logrotate -f
/etc/logrotate
.conf
# –强制轮转
logrotate -vf
/etc/logrotate
.conf
# –再加一个-v参数查看轮转的过程
logger -t
'aaaa'
'bbbbbb'
#–在日志里加一个内容tag和内容
tail
/var/log/messages
# Jun 12 20:34:22 kadefor aaaa: bbbbbb