Linux日志机制的核心是rsyslog
守护进程,该服务负责监听Linux下的日志信息,并把日志信息追加到对应的日志文件中,一般在/var/log
目录下。它还可以把日志信息通过网络协议发送到另一台Linux服务器上,或者将日志存储在MySQL或Oracle等数据库中。本文将简要介绍一下rsyslog
的配置文件的配置,以及如何使用logrotate
进行日志滚动。
rsyslog
配置文件
rsyslog
的配置文件为/etc/rsyslog.conf
和/etc/rsyslog.d/
目录内的文件。 rsyslog.conf
文件配置了rsyslog
守护进程在哪里保存日志信息。
rsyslog.conf
配置文件主要包括以下几个部分:
全局配置
配置ryslog
守护进程的全局属性,比如主信息队列大小($MainMessageQueueSize
),加载外部模块($ModLoad
)等等。
规则(选择器+动作)
每个规则行由两部分组成,selector
部分和action
部分,这两部分由一个或多个空格或tab
分隔,selector
部分指定源和日志等级,action
部分指定对应的操作。
选择器 SELECTORS
selector
也由两部分组成,设施和优先级,由点号.
分隔。第一部分为消息源或称为日志设施,第二部分为日志级别。 下面给出一个rsyslog.conf
的例子:
# rsyslog v5 configuration file ... ... # Include all config files in /etc/rsyslog.d/ IncludeConfig /etc/rsyslog.d/*.conf #### RULES #### # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp, news.crit /var/log/spooler # Save boot messages als o to boot.log local7.* /var/log/boot.log ... ...
日志设施有:
auth(security)
,authpriv
: 授权和安全相关的消息kern
: 来自Linux内核的消息mail
: 由mail子系统产生的消息cron
: cron守护进程相关的信息daemon
: 守护进程产生的信息news
: 网络消息子系统lpr
: 打印相关的日志信息user
: 用户进程相关的信息local0 to local7
: 保留,本地使用
日志级别有(升序):
debug
:包含详细的开发情报的信息,通常只在调试一个程序时使用。info
:情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。notice
: 不是错误情况,也不需要立即处理。warning
: 警告信息,不是错误,比如系统磁盘使用了85%等。err
:错误,不是非常紧急,在一定时间内修复即可。crit
:重要情况,如硬盘错误,备用连接丢失。alert
:应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失。emerg
:紧急情况,需要立即通知技术人员。
思考下面的例子:
cron.* /var/log/cron
把所有来自cron守护进程的消息保存到/var/log/cron
文件中。 当指定日志级别时,所有等于或大于该日志等级的信息都要被处理。比如在下面的例子中,mail子系统所有warning及以上信息的日志都保存在/var/log/mail.warn
文件中。
mail.warn /var/log/mail.warn
使用=可以指定日志等级,比如我们只想保留info信息,可以使用下面的写法:
mail.=info /var/log/mail.info
使用!可以排除这类信息,比如:
mail.!info /var/log/mail.info
动作 ACTION
action是规则描述的一部分,规则用于处理消息。总的来说,消息内容被写到一种日志文件上,但也可以执行其他动作,比如写到数据库表中或转发到其他主机。
模板
模板允许你指定日志信息的格式,可用于生成动态文件名,或在规则中使用。其定义如下所示,其中TEMPLATE_NAME
是模板的名字,PROPERTY
是rsyslog
本身支持的一些属性参数。
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
下面给出一个模板定义及使用的例子:
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log" *.* ?DynamicFile
输出频道
输出频道为用户可能想要的输出类型提供了保护,在规则中使用前要先定义.其定义如下所示,其中NAME
指定输出频道的名称,FILE_NAME
指定输出文件,MAX_SIZE
指定日志文件的大小,单位是bytes
, ACTION
指定日志文件到达MAX_SIZE
时的操作。
$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION
在规则中使用输出频道按照如下的格式:
FILTER :omfile:$NAME
下面给出使用输出频道的一个例子:
$outchannel log_rotation, /var/log/test_log.log, 104857600, /home/joe/log_rotation_script *.* :omfile:$log_rotation
转发到远程机器
有3种方式转发消息:
传统方式的UDP传输,有损耗
基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
RELP传输,不会丢失信息,但只在rsyslogd 3.15.0
及以上版本中可用
写法:
UDP 在主机名前加"@"
TCP 在主机名前加"@@"
RELP 在主机名前加":omrelp:"
例: *.* @192.168.0.1
将所有日志信息通过UDP协议发送到192.168.0.1
如果你只想要转发服务器上的指定设备的日志消息,比如说内核设备,那么你可以在rsyslog
配置文件中使用以下声明。
kern.* @192.168.1.25:514
非 syslog
日志的转发
在另外一种环境中,让我们假定你已经在机器上安装了一个名为“foobar
”的应用程序,它会在/var/log
下生成foobar.log
日志文件。现在,你想要将它的日志定向到rsyslog
服务器,这可以通过像下面这样在rsyslog
配置文件中加载imfile
模块来实现。
首先,加载imfile
模块,这只需做一次。
module(load="imfile" PollingInterval="5")
然后,指定日志文件的路径以便imfile
模块可以检测到:
input(type="imfile" File="/var/log/foobar.log" Tag="foobar" Severity="error" Facility="local7")
最后,定向local7
设备到远程rsyslog
服务器:
local7.* @192.168.1.25:514
日志文件Rotating
随着日志文件越来越大,这不仅会带来性能问题,同时对日志的管理也非常棘手。 当一个日志文件被rotated
,会创建一个新的日志文件,同时旧的日志文件会被重命名。这些文件在一段时间内被保留,一旦产生一定数量的旧的日志,系统就会删除一部分旧的日志。
logrotate
配置文件
logrotate
的配置文件为/etc/logrotate.conf
,下面给一个例子:
# 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 # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 } # system-specific logs may be configured here
默认情况下,每周对日志文件进行一次rotate
,并且保留4份旧日志。 这里wtmp
和btmp
有些例外,wtmp
记录系统登录日志,btmp
记录错误的登录尝试。这两个日志文件每月进行一次rotate
。 自定义的log rotation
配置文件在/etc/logrotate.d
目录下。请看下面的例子:
cat /etc/logrotate.d/rsyslog
/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog reload > /dev/null endscript } /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload > /dev/null endscript }
选项:
compress
通过gzip 压缩转储以后的日志
nocompress
不需要压缩时,用这个参数
copytruncate
用于还在打开中的日志文件,把当前日志备份并截断
missingok
如果日志丢失,不报错继续滚动下一个日志
nocopytruncate
备份日志文件但是不截断
create mode owner group
转储文件,使用指定的文件模式创建新的日志文件
nocreate
不建立新的日志文件
delaycompress
总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
nodelaycompress
覆盖 delaycompress 选项,转储同时压缩。
errors address
专储时的错误信息发送到指定的Email 地址
ifempty
即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty
如果是空文件的话,不转储
mail address
把转储的日志文件发送到指定的E-mail 地址
nomail
转储时不发送日志文件
olddir directory
转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir
转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript
在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript
在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily
指定转储周期为每天
weekly
指定转储周期为每周
monthly
指定转储周期为每月
rotate count
指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list
让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size
当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
logrotate
命令
logrotate [-vf] logfile
-v
显示模式
-f
强制执行rotate
范例:
logrotate -vf /etc/logrotate.conf
syslog
的日志文件每天被rotated
,保留7份旧的日志。其他的日志文件每周进行一次rotate
,并保留4份旧的日志。
参考 & 扩展阅读:
- http://blog.clanzx.net/2013/12/31/rsyslog.html
- https://mos.meituan.com/library/5/how-to-config-rsyslog/
- https://linux.cn/article-4835-1.html