更改系统日志中的日期格式
Posted
技术标签:
【中文标题】更改系统日志中的日期格式【英文标题】:Changing date format in syslog 【发布时间】:2013-12-05 14:08:46 【问题描述】:我们是否可以更改 syslog 记录的特定日志文件中的日期格式?我不想改变所有日志的记录方式,而只是通过日志文件。
编辑:我正在使用 syslogd(在 FreeBSD 中)
这就是我的文件现在的样子:
Dec 5 07:52:10 Log data 1
Dec 5 07:52:10 Log data 2
Dec 5 07:52:10 Log data 3
这就是我想要的样子:
20131205 07:52:10 Log data 1
20131205 07:52:10 Log data 2
20131205 07:52:10 Log data 3
我的 syslog.conf 看起来像这样,其中 /var/log/my_log.log 是我的日志文件:
+@
*.notice;local0.none;local1.none;local2.none;authpriv.none;kern.debug;mail.crit;news.err /var/log/messages
security.* /var/log/security
auth.info;authpriv.info /var/log/auth.log
mail.info /var/log/maillog
ftp.info /var/log/xferlog
cron.* /var/log/cron
*.=debug /var/log/debug.log
console.info /var/log/console.log
local1.info /var/log/my_log.log
【问题讨论】:
这在很大程度上取决于您使用的系统日志守护程序。使用此信息编辑问题,您可能会得到更好的答复。date -d"Dec 5 07:52:10" "+%Y%m%d %T"
会给你像20131205 07:52:10
这样的输出。我不知道的是如何在 syslog.conf 中设置格式。
【参考方案1】:
即使你找到了不同的解决方案,我也给别人一个答案。
编辑您的系统日志配置文件(例如在 Debian 上:/etc/syslog-ng/syslog-ng.conf
)。
然后像这样声明一个新模板:
模板 template_date_format 模板("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC $HOST $MSGHDR$MSG\n"); 模板转义(否); ;这是一个示例,但您可以根据user9645 的答案中链接的 syslog 文档使用不同的宏。
之后,在这个配置文件中,找到所有你想改变输出格式的文件,然后应用这个模板。
比如我想改/var/log/auth.log
输出格式,那么我改:
destination d_auth file("/var/log/auth.log"); ;
到:
destination d_auth file("/var/log/auth.log" template(template_date_format)); ;
然后重新启动系统日志 (service syslog-ng restart
) 并尝试登录以查看您的 auth.log
中的更改。
【讨论】:
这很有趣,我一定会试试的。【参考方案2】:我在使用 FreeBSD 9.2 和 Zabbix 系统监视器 GUI 时遇到了同样的问题,它无法处理系统日志消息中日期戳 (!) 中的“一月”或“二月”之类的内容。
我所做的是安装 sysutils/syslog-ng
端口,并使用 convert-syslogconf.awk 脚本将我的 /etc/syslog.conf
迁移到 /usr/local/etc/syslog-ng.conf
(谢天谢地,即使是相当复杂的config) 并将此自定义格式模板添加到所有file()
目的地:
template t_msgfmt
template("$ISODATE $HOST $FACILITY $LEVEL $MSGHDR$MSG\n");
template_escape(no);
;
您可以在 syslog-ng manual section 11.1 中找到(很多)更多格式信息。它对我有好处(到目前为止)希望它对你有帮助!
【讨论】:
【参考方案3】:我最终使用 awk 脚本来运行日志文件并替换日期字段
awk 'getDate="date -j -f \"%b %d %H:%M:%S\" \""$1" "$2" "$3"\" \"+%Y%m%d %H:%M:%S\""
while ( ( getDate | getline date ) > 0 )
close(getDate);
print date,$2,$3,$4,$5' Temp1 > Temp2
【讨论】:
【参考方案4】:日期问题总是有一个新选项,只需添加几行。
我的解决方案是添加一个文件到/etc/rsyslog.d/
,例如myrsyslog.conf
,然后添加您选择的格式,我的是:
$template myformat,"%TIMESTAMP:1:10:date-rfc3339% %TIMESTAMP:19:12:date-rfc3339% %syslogtag%%msg%\n"
$ActionFileDefaultTemplate myformat
这会将新格式应用于您的日志,使其易于解析。
之前
Sep 3 12:52:37 whs dhcpcd[477]: wlan0: expired address ...
Sep 3 12:52:37 whs dhcpcd[477]: wlan0: part of Router Advertisement expired
Sep 3 12:52:37 whs dhcpcd[477]: wlan0: deleting route to ...
之后
2020-09-03 13:00:49 systemd[1]: rsyslog.service: Succeeded.
2020-09-03 13:00:49 systemd[1]: Stopped System Logging Service.
2020-09-03 13:00:49 systemd[1]: Starting System Logging Service...
【讨论】:
以上是关于更改系统日志中的日期格式的主要内容,如果未能解决你的问题,请参考以下文章