PR
PR

loggerコマンドでシステムログと標準出力(画面)に同時出力する方法

記事内に広告が含まれています。

loggerコマンドで標準出力にもメッセージを表示させたい場合

「logger」コマンドには、システムログにメッセージを記録しながら「標準出力(stdout)」にも同時にメッセージを出力するオプションは存在しません。

画面にも表示させるオプションとして「-s」が用意されていますが、これはあくまでも「標準エラー出力(stderr)」にメッセージを出力するものになります。

では、シェルスクリプトなどで「システムログに残しつつ、標準出力として次の処理にメッセージを渡したい」という場合はどうすればよいでしょうか?

そんな需要に応えるための、以下の2つの解決方法を紹介します。

  • teeコマンドと組み合わせる方法
  • -s オプションの出力を標準出力にリダイレクトする方法

teeコマンドと組み合わせる方法

「tee」コマンドとBashのプロセス置換機能「>(コマンド)」を組み合わせることで、標準出力へのメッセージ表示と、システムログへの記録を同時に行うことができます。

echo "メッセージ" | tee >(logger)

実行例

実際に「tee」コマンドと組み合わせて実行してみると、メッセージがそのまま標準出力(画面)に表示されていることが確認できます。

$ echo "tee syslog message" | tee >(logger)
tee syslog message

次に、システムログの内容を「grep」コマンドで確認してみます。

$ sudo grep "tee syslog message" /var/log/syslog
2026-07-15T10:00:18.828102+09:00 www tamohiko: tee syslog message

システムログにもしっかりとメッセージが記録されていることが確認できました。

-s オプションの出力を標準出力にリダイレクトする方法

「logger」コマンドの「-s」オプションを使用すると、「標準エラー出力(stderr)」と「システムログ」の両方にメッセージを出力させることができます。

この機能を利用して、「標準エラー出力」を「標準出力」へリダイレクトさせてあげることで、結果的に「標準出力」へメッセージを出力することができます。

実行例

コマンドの末尾に 2>&1 を付け加えて、「標準エラー出力」を「標準出力」へリダイレクトします。

$ logger -s "redirect message." 2>&1
<13>Jul 15 10:06:52 tamohiko: redirect message.

システムログを「grep」コマンドで確認すると、メッセージが出力されていることが確認できました。

$ sudo grep "redirect message." /var/log/syslog
2026-07-15T10:06:52.834166+09:00 www tamohiko: redirect message.

補足:メッセージの先頭に表示されている<13>について

リダイレクトを使った実行例の際、画面に表示されたメッセージの先頭に「<13>」という数字が表示されています。

この数値は、syslog(システムログ)の規格で定められている「プライオリティ(優先度)値」と呼ばれるものです。

これは、ログメッセージが「どの機能(ファシリティ)」から「どの重要度(レベル)」で出力されたのかを、システムが瞬時に判別できるように数値化した値になります。

なぜ「13」になるのか?

プライオリティ値は、以下の計算式を使って算出されています。

プライオリティ値 = ファシリティの値 * 8 + ログレベルの値

「ファシリティの値」と「ログレベルの値」は、以下の通り定義されています。

ファシリティの値
キーワード 説明
0 kern カーネルメッセージ
1 user ユーザーレベルメッセージ(デフォルト)
2 mail メールシステム
3 daemon システムデーモン
4 auth セキュリティ/認証メッセージ
5 syslog syslogデーモン自身の内部メッセージ
6 lpr ラインプリンタサブシステム
7 news ネットワークニュースサブシステム
8 uucp UUCPサブシステム
9 cron cronデーモン(cronやatなど)
10 authpriv セキュリティ/認証メッセージ(プライベート)
11 ftp FTPデーモン
12 ntp NTPサブシステム(※数値指定のみ対応)
13 audit ログ監査(※数値指定のみ対応)
14 alert ログアラート(※数値指定のみ対応)
15 clock クロックデーモン(※数値指定のみ対応)
16 - 23 local0 - local7 ローカルで使用可能なカスタム領域(自由定義用)

「ntp」「audit」「alert」「clock」については、文字列でファシリティを指定することができないため、数値で指定する必要があります。

その場合は、プライオリティ値を算出する計算式に基づいて、ログレベルとあわせて計算した数値で指定する必要があります。

文字列で指定すると、以下のようにエラーとなってしまいます。

$ logger -p ntp.info test
logger: unknown facility name: ntp

なお、「ファシリティの値.ログレベル」といった混ざった形式も使用できません。

$ logger -p 12.info test
logger: unknown facility name: 12
ログレベルの値
キーワード 説明
0 emerg システムが使用不能な壊滅的状態
1 alert 即座に対処が必要な状態
2 crit 深刻なシステムエラーが発生している状態
3 err 一般的なエラーが発生している状態
4 warn (warning) エラーの一歩手前の警告状態
5 notice 正常だが注意すべき状態
6 info プログラムの動作履歴などの一般的な情報
7 debug 開発時やトラブルシューティング用の詳細情報

「logger」コマンドのデフォルト設定の数値は以下の通りです。

  • ファシリティ: user(数値は 1)
  • レベル: notice(数値は 5)

この数値を計算式に当てはめると、以下のように「13」という値になります。

ファシリティ値(1) * 8 + ログレベル値(5) = 13

なので、今回は「13」という数値が表示されています。

なぜシステムログでは見えなくて、リダイレクトすると見えるの?

普段、「/var/log/syslog」の中身を表示したときには、この<13>は記録されていません。

これは、ログを受け取ったログ管理デーモン(rsyslogなど)が、この数値を読み取って解析し人間が見やすいようにログファイルから自動的に消してくれているからです。

しかし、「logger -s」コマンドを使うと、「logger」コマンド自身が「プライオリティ値を含むログの規格通りのデータ」として「標準エラー出力」に出力します。

それを リダイレクト(2>&1)で「標準出力」に渡して画面に表示させたため、システムログには出力されていない「<13>」がそのまま画面に表示されてしまっているというわけです。

コメント

タイトルとURLをコピーしました