bash 中的日志文件写入实用程序(记录器不创建文件)?

bash 中的日志文件写入实用程序(记录器不创建文件)?

在制作大型或复杂的 bash 脚本以帮助调试或只是跟踪程序流程时,我经常在 /tmp 或 /var 中写入日志文件。我通常会做一些类似的事情echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/log,但不是可以很容易地摄入到需要“标准”系统日志格式的程序中的事情(除了 Apache 的笑话)。我尝试过logger在某处获取创建新日志文件的命令,但似乎没有选项。我怀疑这部分留给了 syslogd 及其设施配置。

我可以修改上面的“标准”格式以包括主机名、双层设施和 PID,但可能还有其他细微差别和格式我可能会忽略,但有人已经发现了。

是否有类似的实用程序logger可以编写 RFCxxx 格式的日志文件而无需通过 syslog?

答案1

我认为你可以用手做到这一点......

有趣的部分是各种格式。这是 Bash 生成两者的函数RFC 5424RFC 3164风格的消息。第一个时间戳中的%06N和格式%:z可能需要 GNU 日期,我不确定。

#!/bin/bash

# print RFC 5424 syslog message, without structured data,
# somewhat like 'logger -i --rfc5424=notq', e.g.
# <13>1 2021-10-28T14:48:10.613772+03:00 myhost ilkkachu 20415 - - a problem happened
# format is
# <prio>version date host tag pid - - message
lognew() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift 
        local prio=$(( facility*8 + severity ))
        local version=1
        local date=$(date +"%Y-%m-%dT%H:%M:%S.%06N%:z")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%d %s %s %s %d - - %s\n" "$prio" "$version" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

# print RFC 3164 syslog message,
# somewhat like 'logger -i --rfc3164'
# <13>Oct 28 14:49:13 myhost ilkkachu[20418]: another problem happened
# format:
# <prio>date host tag[pid]: message
logold() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift
        local prio=$(( facility*8 + severity ))
        local date=$(LC_ALL=C date +"%b %_d %H:%M:%S")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%s %s %s[%d]: %s\n" "$prio" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

log_facility=1 # user
log_tag="test"

# 6 = info
lognew 6 testing messaging
# 4 = warning
logold 4 obsolete message format

打印的 PID 是脚本的 PID,输出如下:

<14>1 2021-10-28T15:06:17.413125+03:00 myhost test 20499 - - testing messaging
<12>Oct 28 15:06:17 myhost test[20499]: obsolete message format

相关内容