我通过 rsyslog 引入日志文件,我的配置如下所示:
root@rhel:/etc/rsyslog.d# head mail_prod_logs.conf
if $fromhost-ip=="10.10.10.10" and $programname=="AMP_Logs" then -/var/log/mail_logs/amp.log
我的日志全部存储在/var/log/mail_logs/amp.log
文件夹中:
Oct 18 13:29:28 server.com AMP_Logs: Info: Begin Logfile
Oct 18 14:29:28 server.com AMP_Logs: Info: Version: 12.1.0-000 SN: .....
Oct 18 14:29:28 server.com AMP_Logs: Info: Time offset from UTC: -14400 seconds
Oct 18 15:29:23 server.com AMP_Logs: Info: Response received for.....
Oct 18 15:29:23 server.com AMP_Logs: Info: File reputation query.....
Oct 19 13:29:23 server.com AMP_Logs: Info: Response received for fil....
Oct 19 13:29:58 server.com AMP_Logs: Info: File reputation query ....
Oct 19 13:29:58 server.com AMP_Logs: Info: File reputation query ....
我想使用datetime
日志的一部分将这些内容放入当月内每日文件夹内的每小时文件夹中,同时通过编辑mail_prod_logs.conf
.
所以它看起来像:
/var/log/mail_logs/Sep/30/23.log
/var/log/mail_logs/Oct/01/00.log
/var/log/mail_logs/Oct/01/01.log
/var/log/mail_logs/Oct/01/02.log
...
我怎样才能做到这一点?
答案1
您可以使用动态文件模板来完成此操作。用一个财产更换者选择%timestamp%
属性的部分,特别是选项date-day
和date-hour
以及字符 1 到 3 date-rfc3164
(这是一个类似于“Oct 9 09:47:08”的字符串)。通常,在示例中,模板称为DynFile
:
$template DynFile,"/var/log/mail_logs/%timestamp:1:3:date-rfc3164%/%timestamp:::date-day%/%timestamp:::date-hour%.log"
要使用模板,请将其替换...then -/var/log/mail_logs/amp.log
为...then -?DynFile
如果您考虑将 3 个字母的月份(Jan、Feb...)替换为 2 位数的月份以便于处理,请改用
$template DynFile,"/var/log/mail_logs/%timestamp:::date-month%/%timestamp:::date-day%/%timestamp:::date-hour%.log
答案2
假设您的日志行的格式如代码片段所示,那么这将是一个开始:
awk '{
dir=$1 "/" $2; log_file=dir "/" substr($3, 1, 2) ".log"
if (!exists[dir]++) {system("mkdir -p " dir)};
print > log_file
}' amp.log
您将在 中执行此操作/var/log/mail_logs/
。
如果特定于日期的目录不存在,则调用外部命令会创建该目录system
。mkdir
通过会-p
导致根据需要创建父目录(因此当十月第一次发挥作用Oct
时会创建目录)。mkdir -p /Oct/01
另外,如果目录已存在-p
,请确保mkdir
不会报告错误。
调用将print
日志行写入一个文件,该文件的名称是根据日志时间组件编写的。每个新日志文件都是在命令生命周期内首次写入和追加时创建的。
如果您希望附加上次运行中基于日期时间的日志文件而不是覆盖,则可以更改为print >
。print >>
awk