bashファイルを実行するシステムサービスがあります。このスクリプトのすべての出力は systemd ログに書き込まれ、systemd によってそのデバイスに正しく帰属されます。
# myservice.sh
echo "PROGRESS 1/5"
echo "PROGRESS 2/5"
echo "PROGRESS 3/10"
echo "PROGRESS 9/10"
> journalctl -eu my-service
oct. 19 16:01:38 my-computer systemd[1]: Started My service.
oct. 19 16:01:40 my-computer my-service[137083]: PROGRESS: 1/5
oct. 19 16:01:42 my-computer my-service[137083]: PROGRESS: 2/5
oct. 19 16:01:44 my-computer my-service[137083]: PROGRESS: 3/10
oct. 19 16:01:46 my-computer my-service[137083]: PROGRESS: 9/10
oct. 19 16:01:46 my-computer systemd[1]: my-service.service: Succeeded.
しかし、新しいフィールドを追加してログエントリに追加情報を追加したいと思います。この方法を試してみましたlogger
が、成功しませんでした。フィールドが正しく保存されておらず、記録された行がmy-service.serviceからのものとしてマークされていません。
# myservice.sh
function log_progress() {
logger --tag my-service --priority user.info \
--rfc5424
--sd-id lcupdater@1 \
--sd-param "PROGRESS_VALUE=\"$2\"" \
--sd-param "PROGRESS_TO=\"$3\"" \
"$1"
}
log_progress "Doing stuff" 1 5
log_progress "Doing more stuff" 2 5
log_progress "Going on..." 3 10
log_progress "Almost done..." 9 10
> journalctl -e -o json
{
"_UID": "0",
"_GID": "0",
"_PID": "147370",
"_SOURCE_REALTIME_TIMESTAMP": "1603120378691356",
"MESSAGE": "1 2020-10-19T17:12:58.691328+02:00 my-computer my-service - - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"132000\"][lcupdater@1 PROGRESS_VALUE=\"9\" PROGRESS_TO=\"10\"] Almost d
one...",
"__MONOTONIC_TIMESTAMP": "28976809066",
"_TRANSPORT": "syslog",
"SYSLOG_RAW": "<14>1 2020-10-19T17:12:58.691328+02:00 my-computer my-service - - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"132000\"][lcupdater@1 PROGRESS_VALUE=\"9\" PROGRESS_TO=\"10\"] A
lmost done...",
"SYSLOG_FACILITY": "1",
"PRIORITY": "6",
"__REALTIME_TIMESTAMP": "1603120378691368"
}
_SYSLOG_UNITフィールドが欠落しており、PROGRESS_VALUEとPROGRESS_TOが正しく保存されていません。これを達成する方法はありますか?
編集する:
これを達成するための詳細でより正確な方法は、次のものを使用することですlogger --journald
。
function log_progress() {
logger --journald <<EOF
MESSAGE=$1
PROGRESS_VALUE=$2
PROGRESS_TO=$3
SYSLOG_IDENTIFIER=my-service
SYSLOG_FACILITY=3
PRIORITY=6
_SYSTEMD_UNIT=my-service.service
EOF
}
ただし、_SYSTEMD_UNITフィールドはsystemdのみが機能できるため削除されます。
答え1
絶対にベースsystemd.journal - フィールドドキュメント(「新しいフィールドはアプリケーションで自由に定義できますが、[...]」私が見つけた唯一の解決策Journald-socketとc-libraryを介してデフォルトのメッセージングを使用します。シェルスクリプトで簡単に利用できるものが見つかりませんでした。システム猫jsonを入力として受け入れます。
これまでの最も簡単な方法は、おそらくPythonでアプリケーションを再構築し、次を使用することです。systemd.journal - モジュール