这是一个虚构的命令行,其中“pushtolog”是一个实用程序,它从管道接受文本行并将它们记录到文件名包含今天日期的文件中:
tail -F mylatestlogfile.log | grep "ERROR" | pushtolog -d /tmp/myerrors/ -f yyyy-MM-dd -r errors -e log
在 2017 年 2 月 17 日运行时,输出将记录到文件中:
/tmp/myerrors/errors.2017-02-17.log
2017 年 2 月 18 日午夜,该文件将关闭,任何进一步的输出都将记录到文件中:
/tmp/myerrors/errors.2017-02-18.log
切换会自动发生。由于相关日志行的数量很少,性能相当无关紧要,因此在最坏的情况下,实用程序每次写入日志行时检查日期就可以了。
将运行该程序的 GNU/Linux 服务器安装了最少的实用程序集。它安装了Python 2,我可以自己编写一个实用程序。在采取这一步之前,明智的做法是询问是否有一种工具可以完成这项工作,或者是否有一种惯用的替代方法可以完成这项工作。
logrotate 是可用的,但我宁愿避免每次都进行轮换,因为一步步完成这一切似乎“更简单”。
多日志似乎解决了切换目标日志文件的类似问题,但是当日志文件已满时而不是当日期更改时。我没有 root 访问权限,也无法运行包管理器来获取它;我还没有调查是否可以使用我拥有的权限从源代码成功构建它。如果它显然是这项工作的工具,那么我会选择这个选项。
答案1
我使用 Awk 的功能来评估构造一个文件名,包括每次评估的今天日期(对于来自日志的每一行),并最终得到:
tail -F mylatestlogfile.log | grep "ERROR" | awk '{print >> "/tmp/myerrors/errors." strftime("%Y-%m-%d") ".log"}'
答案2
您可以尝试将以下代码作为bash
脚本:
#!/bin/bash
while getopts "d:f:e:r:a" opt; do
case $opt in
f) FDATE=$(awk -v fmt="$OPTARG" '{print strftime(fmt)}'<<<DUMMY) ;;
r) PREFIX="$OPTARG" ;;
e) SUFFIX="$OPTARG" ;;
d) DEST="$OPTARG" ;;
a) APPEND=true ;;
esac
done
if [ ! $APPEND ]
then
> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}
fi
while read line; do echo ${line} >> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}; done
您还可以用以下内容包围脚本主体:
pushtolog()
{
...
}
并获取它的来源。
我还添加了一个标志,以便能够附加到现有数据。当设置特定选项时,应该很容易将脚本更改为默认附加和覆盖。
注1:日期格式应符合strftime
(请参阅man strftime
),因此使用"%Y-%m-%d"
笔记2:该变量APPEND
实际上不是布尔值,我只是想象它是。也许使用APPEND="true"
起来更好if [ -z "$APPEND" ]