通过管道传输到文件名中包含今天日期的日志文件

通过管道传输到文件名中包含今天日期的日志文件

这是一个虚构的命令行,其中“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" ]

相关内容