我有一个自定义日志记录类,它为流程的每个实例创建一个日志,并为日志文件名添加唯一的 ID,例如:
- 进程.1234.日志
- 进程.1235.日志
另外我也可以添加日期/时间戳,例如:
- 进程.1234.03012012.log
- 进程.1235.03012012.log
LogRotate 是否可以使用正则表达式,以便我可以按日期和/或进程 ID 存档日志文件?
答案1
我不知道后续版本是否支持,但经过进一步研究,我发现 shell 通配符是受支持的。*
(匹配多个字符) 和?
(匹配单个字符) 可以组合起来以匹配特定文件。
例如,以下是与您的用例相匹配的模式以及可以在以下位置找到的文件的其余部分/etc/logrotate.d/process
/path/to/my/logfiles/process.????.????????.log
/path/to/my/logfiles/process.????.log
{
# Look for previously matched log files and rotate daily if found
daily
# use date as a suffix of the rotated file
dateext
# Compress log file, optional if the files are small enough
compress
# Allow for a log file pattern to NOT match in order to support both
# filename formats
missingok
# Do not create replacement log files, the application will do that
nocreate
# Keep 30 days worth of rotated logs
maxage 30
}
然而如果你打算process
将其作为实际进程 ID 的占位符,那么我相信你可以使用通配符代替进程 ID 号,如下所示:
/path/to/my/logfiles/*.????.????????.log
/path/to/my/logfiles/*.????.log
{
...
}
希望这能有所帮助。我也去寻找一种可行的正则表达式方法,最后决定使用 shell 通配符,而不是我认为可行但更复杂的解决方案。
一个例子:
在搜索正则表达式解决方案时,我发现了一篇博客文章,标题为“从 logrotate 通配符匹配中排除文件“它提供了这个解决方案:
/var/log/upstart/*.log {
daily
missingok
rotate 7
compress
notifempty
nocreate
nosharedscripts
prerotate
bash -c "[[ ! $1 =~ testprogram ]]"
endscript
}
我最终从该示例中抽取了两个项目并稍微修改了匹配。在我的情形下,我想轮换目录中的所有文件除了对于一些具有.inp
扩展名的输入文件。
这就是我想出的:
# Force the prerotate "script" below to be run on each individual file
# in order to verify that it isn't an unprocessed input file
nosharedscripts
# Skip rotating any unprocessed input files (*.inp extension)
prerotate
bash -c "[[ ! $1 =~ \.inp$ ]]"
endscript
据说logrotate -d /etc/logrotate.d/myfilename
它似乎有效。但是,正如我提到的,我选择了 shell 通配符方法,因为对于在我后面的人来说,这似乎更容易维护。