bash のログファイル書き込みユーティリティ (ロガーはファイルを作成しません)?

bash のログファイル書き込みユーティリティ (ロガーはファイルを作成しません)?

デバッグに役立てるため、または単にプログラム フローを追跡するために、大規模または複雑な bash スクリプトを作成するときに、ログ ファイルを /tmp または /var に書き込むことがよくあります。通常は、 のようなことを行いますecho "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/logが、これは問題ありませんが、「標準」syslog 形式 (Apache のジョークはさておき) を期待するプログラムに簡単に取り込めるものではありません。どこかに新しいログ ファイルを作成するコマンドを取得しようとしましたloggerが、そのためのオプションがないようです。その部分は syslogd とその機能構成に任されているのではないかと思います。

上記の「標準」形式を変更して、ホスト名、バンク ファシリティ、および PID を含めることもできますが、おそらく、誰かがすでに理解している他のニュアンスや形式を見落としている可能性があります。

loggersyslog を経由せずに RFCxxx 形式のログファイルを書き込むことができる同様のユーティリティはありますか?

答え1

手作業でできると思いますが...

面白いのは、さまざまなフォーマットがあることです。Bashで両方を生成する関数は次のとおりです。RFC 5424そしてRFC 3164スタイルのメッセージ。最初のメッセージのタイムスタンプの%06Nと形式には GNU date が必要かもしれませんが、よくわかりません。%:z

#!/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

関連情報