Bash
bash 中的日誌文件寫入實用程序(記錄器不創建文件)?
在製作大型或複雜的 bash 腳本時,我經常在 /tmp 或 /var 中編寫日誌文件以幫助調試或僅跟踪程序流。我通常會做一些類似於
echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/log
這很好的事情,但不是可以很容易地吸收到期望“標準”系統日誌格式的程序中的事情(Apache 開玩笑)。我試過讓logger
命令在某處創建一個新的日誌文件,但似乎沒有它的選項。我懷疑它把那部分留給了 syslogd 和它的設施配置。我可以修改我上面的“標準”格式以包括主機名、雙層設施和 PID,但可能還有其他細微差別和格式我可能會忽略,有人已經想通了。
是否有類似的實用程序
logger
可以在不通過 syslog 的情況下編寫 RFCxxx 格式的日誌文件?
我想你可以用手來做…
有趣的部分是各種格式。這是 Bash 生成RFC 5424和RFC 3164樣式消息的函式。第一個時間戳中的
%06N
and%: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