rsyslog日志格式以及自动换行,丢失问题的解决记录📝
前言
在之前我写了一个将Apache日志通过Syslog输出的记录。
将Apache日志输出到Syslog服务器
在那里之后,我重新定义了Apache的输出格式,内容大致是:
httpd.conf
# 时间戳 远程主机 XFF 头部 状态码 请求方法 请求 URI 查询字符串 引荐 URL 用户代理 请求大小 Cookie
LogFormat "%{%Y-%m-%d %H:%M:%S}t %a (\"%{x-forwarded-for}i\") %>s %m %U%q %{Referer}i %{User-Agent}i %B %{Cookie}i" custom_format
因为Cookie很长,发现rsyslog
部分日志丢失。也就是会在莫名的位置进行换行,导致从新生成一排日志,类似于
Oct 5 17:08:41 localhost root[1488]: xxxxxxxxxxxte
Oct 5 17:08:41 localhost root[1488]: stxxxxxx
经过调查,知道了rsyslog大小默认是1024byte超过这个长度就会自动换行。
修改了配置后全部日志能正常显示,记录处理过程。
环境
- Redhat8
rsyslog配置修改
我们主要先来解决自动换行的问题。
rsyslog用于在Linux系统中管理日志的生成、收集、处理和转发。
rsyslog的配置文件通常在/etc/rsyslog.conf
或/etc/rsyslog.d/*.conf
。
检查下面配置:
$MaxMessageSize
发现rsyslog.conf里面并没有$MaxMessageSize
的内容的话直接添加
$MaxMessageSize 2k
添加上面的内容用于控制syslog能处理的最大消息大小为2kb。
超过此大小的日志消息会被截断。
Ratelimit.Interval
限制日志消息速率的时间间隔。
例如设置为60,意味着每60秒内只接受指定数量的日志消息。
Ratelimit.Burst
在Ratelimit.Interval内允许的最大日志消息数。
表示一次能接受的最大消息量。
默认为60秒内20000条消息。
rsyslog在限速时间段内丢弃超过最大burst值后的消息。
修改配置如下:
$MaxMessageSize 2k
Ratelimit.Interval="60"
Ratelimit.Burst="20000"
消息最大16KB。
60秒内允许20000条消息。
重新加载rsyslog配置
修改配置后重新加载:
sudo rsyslogd -N1 #配置文件语法检查
sudo systemctl restart rsyslog #重启rsyslog
sudo systemctl status rsyslog #检查状态
定义日志格式模版
rsyslog默认提供多种模板。
命令格式:
$ sudo logger -p user.info (模板名)
模板输出示例:
RSYSLOG_FileFormat
标准文件输出格式。
2023-10-05T17:07:48.579056+09:00 localhost root[1470]: RSYSLOG_FileFormat
RSYSLOG_TraditionalFileFormat
文件输出格式,日期时间格式不同。
Oct 5 17:08:41 localhost root[1488]: RSYSLOG_TraditionalFileFormat
RSYSLOG_TraditionalForwardFormat
消息转发格式,包含设施优先级信息,消息之间无换行。
<14>Oct 5 17:10:02 localhost root[1516]: RSYSLOG_TraditionalForwardFormat1<14>Oct 5 17:10:06 localhost root[1519]: RSYSLOG_TraditionalForwardFormat2
RSYSLOG_SysklogdFileFormat
Sysklogd兼容格式。
Oct 5 17:11:11 localhost root[1537]: RSYSLOG_SysklogdFileFormat
RSYSLOG_ForwardFormat
消息转发格式,高精度时间。
<14>2023-10-05T17:13:27.885552+09:00 localhost root[1556]: RSYSLOG_ForwardFormat1<14>2023-10-05T17:13:29.345266+09:00 localhost root[1559]: RSYSLOG_ForwardFormat2
RSYSLOG_SyslogProtocol23Format
遵循RFC3164的格式。
<14>1 2023-10-05T17:14:23.036526+09:00 localhost root 1577 - - RSYSLOG_SyslogProtocol23Format
RSYSLOG_DebugFormat
调试格式,包含详细消息信息。
Debug line with all properties:
FROMHOST: 'localhost', fromhost-ip: '127.0.0.1', HOSTNAME: 'localhost', PRI: 14,
syslogtag 'root[1598]:', programname: 'root', APP-NAME: 'root', PROCID: '1598', MSGID: '-',
TIMESTAMP: 'Oct 5 17:15:29', STRUCTURED-DATA: '-',
msg: 'RSYSLOG_DebugFormat'
escaped msg: 'RSYSLOG_DebugFormat'
inputname: imjournal rawmsg: 'RSYSLOG_DebugFormat'
$!:{ "PRIORITY": "6", "_UID": "0", "_GID": "0", "_CAP_EFFECTIVE": "1ffffffffff", "_BOOT_ID": "fbce3ad9615f45a8ac9993712fc70471", "_MACHINE_ID": "ec2c11400b83ffad7cf987a814357b32", "_HOSTNAME": "localhost", "_RUNTIME_SCOPE": "system", "_TRANSPORT": "syslog", "_AUDIT_LOGINUID": "1000", "_SYSTEMD_OWNER_UID": "1000", "_SYSTEMD_SLICE": "user-1000.slice", "_SYSTEMD_USER_SLICE": "-.slice", "_SELINUX_CONTEXT": "unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023", "_AUDIT_SESSION": "1", "_SYSTEMD_CGROUP": "\/user.slice\/user-1000.slice\/session-1.scope", "_SYSTEMD_SESSION": "1", "_SYSTEMD_UNIT": "session-1.scope", "_SYSTEMD_INVOCATION_ID": "3a4d5789be63415bb097619a80873398", "SYSLOG_FACILITY": "1", "SYSLOG_IDENTIFIER": "root", "_COMM": "logger", "SYSLOG_TIMESTAMP": "Oct 5 17:15:29 ", "MESSAGE": "RSYSLOG_DebugFormat", "_PID": "1598", "_SOURCE_REALTIME_TIMESTAMP": "1696493729391167" }
$.:
$/:
如果需要自定义日志模版,还可以参考这位大佬的文章和redhat的官方文档:
在上次我通过rsyslog定义了Apache的输出日志,因为Apache的访问日志已经通过rsyslog来管理了,所以在定义apache的日志后面添加需要输出的格式模版就行。以RSYSLOG_SyslogProtocol23Format格式为例,用;号隔开:
## 略
## ↓修改
## *.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local3.none;local4.none;local5.none;local6.none; /var/log/messages
## 略
##新增 ↓
local5.* /var/log/httpd/access_log;RSYSLOG_SyslogProtocol23Format
local6.* /var/log/httpd/error_log;RSYSLOG_SyslogProtocol23Format
## 略
检查日志
目标服务器/var/log/messages
或者自己定义的输出日志中不再出现问题。
检查日志命令:
sudo fgrep "rsyslog" /var/log/messages | tail
注意全部输出日志会增大磁盘压力,需权衡。
参考
rsyslog のログフォーマットを変更する
rsyslogでログが欠落する時の対応
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-basic_configuration_of_rsyslog#s2-Templates