rsyslog日志格式以及自动换行,丢失问题的解决记录📝
rsyslog日志格式以及自动换行,丢失问题的解决记录📝

rsyslog日志格式以及自动换行,丢失问题的解决记录📝

内容纲要

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 のログフォーマットを変更する

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-basic_configuration_of_rsyslog#s2-Templates

在上次我通过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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注