名前

logger - システムログにメッセージを書き込む

書式

logger [options] message

説明

logger はシステムログにメッセージを記入する。

任意の引数 message が存在すれば、それがログに書き込まれる。 引数 message が存在せず、 -f オプションも指定されていない場合は、 標準入力がログに記録される。

オプション

-d, --udp

データグラム (UDP) のみを使用する。 デフォルトでは、 /etc/services で定義されている syslog ポートに接続が試みられる。 それは、たいてい 514 番である。

接続先の指定については、--server--socket も参照のこと。

-e, --skip-empty

ファイルを処理する際に空行を無視する。 空行とは、文字を一つも含まない行のことである。 したがって、ホワイトスペースのみからなる行は、 空行とは見なされない。 なお、--prio-prefix オプションが指定された場合、 優先度指定の部分は行の一部ではないことに気をつけること。 つまり、このモードでの空行とは、 優先度を表すプレフィックス (たとえば、<13>) の後ろに文字が全く存在しない行のことである。

-f, --file file

指定した file の内容をログに記入する。 このオプションは、コマンドラインにおけるメッセージ指定と併用することはできない。

-i

各行に logger プロセスの PID を記入する。

--id[=id]

各行に logger プロセスの PID を記入する。 指定が任意の引数 id を指定すると、 それが logger コマンドの PID の代わりに使用される。 複数のメッセージを送出するスクリプトでは、 --id=$$ (PPID) を使用するとよい。

なお、システムのロギングを下支えしているものが (たとえば、 /dev/log をリッスンしている systemd が)、ローカルソケットの資格情報 (credentials) に従って、 メッセージ中の指定された PID を上書きしてしまうことがあるのに注意していただきたい。 logger は、そうしたソケットの資格情報の値を、指定された id にすることができるわけだが、それは、ユーザーがルート権限を持ち、しかも指定された PID を持つプロセスが存在するときだけであって、 そうでなければ、ソケットの資格情報は変更されず、その問題は、 何も出力されず単に無視される。

--journald[=file]

systemd のジャーナルに書き込みをする。記入事項 (entry) は、file を指定していれば、そのファイルから読み込まれ、指定していなければ、標準入力から読み込まれる。 各行は journald の解するフィールドで始まっていなければならない。 詳細については systemd.journal-fields(7) を参照のこと。 MESSAGE_ID フィールドを使用するのは、記入事項の検索を容易にするので、一般によい考えである。 たとえば以下のとおりである。

logger --journald <<end
MESSAGE_ID=67feb6ffbaf24c5cbec13c008dd72309
MESSAGE=The dogs bark, but the caravan goes on.
DOGS=bark
CARAVAN=goes on
end
logger --journald=entry.txt


--journald は、たとえば優先度 (priority) のような、他のオプションの値を無視することに注意すること。 だから、優先度が必要なら、それを入力に含めなければならない。つまり、PRIORITY フィールドを使用するのである。なお、単に journalctl(1) を実行するだけだと、MESSAGE フィールドしか表示されない。残りのフィールドも見るには、journalctl --output json-pretty を使用すればよい。

+ MESSAGE に改行を入れるには、 MESSAGE を複数回指定する。 これは特例処理であり、複数回現れるのが他のフィールドの場合は、 配列として journal に格納されることになる。

--msgid msgid

以下に示す RFC 5424 <https://tools.ietf.org/html/rfc5424> MSGID フィールドを指定する。 msgid 内ではスペース文字が使えない点に注意すること。 このオプションが有効なのは、--rfc5424 をともに指定したときだけである。 そうでない場合は、何も出力されずただ無視される。

-n, --server server

システムログのソケットではなく、指定されたリモートの syslog サーバー、server に書き込む。 --udp--tcp が指定されていない場合、 logger は、まず UDP を使用しようとし、それに失敗すると、TCP 接続を試みる。

--no-act

ログメッセージをシステムログに書き込むこと以外のすべてを実行し、 その後、ジャーナルへの接続を切る。 このオプションは、テストのために --stderr と一緒に使うことができる。

--octet-count

以下に示す RFC 6587 <https://tools.ietf.org/html/rfc6587> メッセージの送信にオクテット計算フレーミングメソッド (octet counting framing method) を使用する。 このオプションを使用しない場合、 デフォルトのメソッドは、UDP ではノーフレーミングであり、TCP では RFC6587 の非透過フレーミング (octet stuffing としても知られる) である。

-P, --port port

指定された port を使用する。 このオプションが指定されない場合、 ポートはデフォルトが使われる。 すなわち、UDP接続では syslog、TCP 接続では syslog-conn である。

-p, --priority priority

指定された優先度 priority でログにメッセージを記入する。 優先度は、数値で指定してもよく、facility.level の組み合わせで指定してもよい。たとえば、-p local3.info と指定すると、ファシリティが local3、レベルは informational としてメッセージが記録される。 デフォルトは user.notice である。

--prio-prefix

標準入力から読み込むすべての行で sysylog のプレフィックスを探す。 この接頭辞は、山かぎカッコ (<>) で囲まれた 10 進数であり、 ファシリティとレベルの両方をエンコードしたものである。 数値は、ファシリティを 8 倍し、 それにレベルを加えて作る。 たとえば、local0.info なら、ファシリティは 16、レベルは 6 なので <134> になる。

プレフィックスがファシリティを含んでいない場合、ファシリティは、-p オプションで指定したものがデフォルトである。 同様に、プレフィックスが全く指定されていない場合、その行は、-p で指定された優先度 priority を使ってログに記録される。

このオプションは、コマンドライン引数として指定したメッセージに対しては働かない。

--rfc3164

以下に示す RFC 3164 <https://tools.ietf.org/html/rfc3164> リモートサーバーにメッセージを送るのに BSD syslog プロトコルを使用する。

--rfc5424[=without]

以下に示す RFC 5424 <https://tools.ietf.org/html/rfc5424> リモートサーバーにメッセージを送るのに syslog プロトコルを使用する。 任意指定の引数 without には、notq, notime, nohost という値をカンマで区切ったリストが使用できる。

notq という値は、送信するメッセージに時間品質構造化データ (time-quality structured data) を記入しないようにする。 この時間品質情報が示すのは、ローカルクロックが同期されていたかどうか、および、タイムスタンプがずれるかもしれない最大のマイクロ秒数である。 時間品質は、--sd-id timeQuality が指定された場合にも自動的に抑制される。

notime という値は (暗黙裡に notq も設定する)、ISO-8601 フォーマットの省略なしの送信側タイムスタンプを記入しないようにする。 マイクロ秒やタイムゾーンを含むフォーマットのことである。

nohost という値は、メッセージのヘッダーに gethostname(2) の情報を入れないようにする。

RFC 5424 プロトコルは、バージョン 2.26 以来、logger のデフォルトになっている。

-s, --stderr

メッセージをシステムログだけでなく、標準エラーにも出力する。

--sd-id name[@digits]

RFC 5424 メッセージヘッダーで使う構造化データ要素の識別名 (structured data element ID) を指定する。 新しい要素を導入するには、このオプションを --sd-param の前で使わなければならない。 構造化データ要素の数には上限がない。 ID (識別名。name には @digit が続くこともある) は、大文字小文字を区別し、要素のタイプと用途を一意に同定している。 同じ ID は、一つのメッセージに 1 回しか現れてはならない。 @digit の部分は、ユーザーが定義した非標準的な ID では必須である。

現在 logger が生成するのは、 標準要素 timeQuality のみである。 RFC 5424 には、そのほか origin 要素 と meta 要素が記述されている (前者には、ip, enterpriseId, software, swVersion といったパラメーターが、 後者には sequenceId, sysUpTime, language といったパラメーターがある)。 こうした要素 ID は、 @digits というサフィックスなしで指定することができる。

--sd-param name=value

構造化データ要素のパラメーターを、名前と値の組み合わせで指定する。 このオプションを使うときは、--sd-id の後ろに置かなければならない。 なお、同じ要素について、2 回以上指定することもできる。 value を囲む引用符は必須であり、しかも、 コマンドライン上ではエスケープしなければならないことに注意していただきたい。

    logger --rfc5424 --sd-id zoo@123             \
                     --sd-param tiger="hungry"   \
                     --sd-param zebra="running"  \
                     --sd-id manager@123         \
                     --sd-param onMeeting="yes"  \
                     "this is message"

上のコマンドは、次のようなメッセージを生成する。

<13>1 2015-10-01T14:07:59.168662+02:00 ws kzak - - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="218616"][zoo@123 tiger="hungry" zebra="running"][manager@123 onMeeting="yes"] this is message

-S, --size size

メッセージの許可される最大のサイズを size にする。 デフォルトは、1KiB の文字である。 これは、昔から使われている上限であり、RFC 3167 で規定されている。 なお、RFC 5424 で、この上限は融通が利くようになった。 受信側が RFC 5424 に準じているならば、少なくとも 4KiB のメッセージを処理できると考えて、 まず間違いがない。

どんなタイプの syslog プロトコルを使っていようと、たいていの受信側が 1 KiB より大きいメッセージを受け入れる。したがって、この --size オプションが (--rfc5424 を使用した場合だけではなく) あらゆる場合に logger に対して働くことになる。

注意: メッセージサイズの上限というのは、syslog のヘッダーを含む、メッセージサイズ全体の上限である。 ヘッダーのサイズは、選択したオプションやホスト名の長さによって変わってくる。 大雑把に言って、ヘッダーが 50 から 80 文字 (characters) より長いことはあまりない。メッセージの最大ザイズを選択するときは、 受信側の方でもその最大サイズをサポートするようにしておくことが重要である。 さもないと、メッセージは、尻尾がちょん切られてしまうかもしれない。 もう一度大雑把に言うと、2 から 4 KiB のメッセージサイズなら、たいてい問題がないはずだ。 それより大きい場合は、ちゃんと動作するか確認するべきである。

--socket-errors[=mode]

Unix ソケット接続に関するエラーを表示する。mode の値は、off, on, auto のいずれかである。 モードが auto の場合、 logger は init プロセスが systemd(1) かどうか検出しようとする。 そして、もしそうならば、 /dev/log がブートの早い段階から使用可能になっていると想定する。 他の init システムで、 /dev/log を欠いている場合、ここで述べているようなエラーが起きることはない。 そのへんは、 openlog(3) システムコールを使用するメッセージ処理と同じことである。logger(1) も、 バージョン 2.26 より前は openlog(3) を使用していた。 そのため、Unix ソケットに送信したメッセージが消失しても、当時は検出できなかったのである。

デフォルトの mode は、auto である。 エラー表示が有効ではないと、 メッセージの消失があっても通知されず、 logger の実行は、 成功のステータスで終わることになる。

-T, --tcp

ストリーム (TCP) のみを使用する。 デフォルトでは、/etc/service で定義されている syslog-conn ポートに接続が試みられる。 それは、たいてい 601 番である。

接続先の指定については、--server--socket も参照のこと。

-t, --tag tag

ログに記録されるすべての行に tag という指標を付ける。 デフォルトのタグは、 端末にログインしているユーザーの名前 (あるいは、実効ユーザー ID に基づいたユーザー名) である。

-u, --socket socket

システムログのソケットの代わりに、指定された socket に書き込む。

--

引数のリストの終わりを示す。 これを使えば、message をハイフン (-) で始めることができる。

-h, --help

ヘルプを表示して終了する。

-V, --version

バージョンを表示して終了する。

終了ステータス

logger ユーティリティーは、実行に成功すると、0 の終了ステータスで、エラーが起きた場合は、0 より大きい終了ステータスで終了する。

ファシリティとレベル

有効なファシリティ名 (メッセージの分類):

auth
authpriv 取り扱いに注意を要するセキュリティ情報用
cron

daemon
ftp
kern ユーザー空間プロセスからは生成できない。 自動的に user に変更される。

lpr
mail
news
syslog
user
uucp
local0
から
local7
security 非推奨、auth と同義

有効なレベル名 (重大度):

emerg
alert
crit
err
warning
notice
info
debug
panic 非推奨、emerg と同義
error 非推奨、err と同義
warn 非推奨、warning と同義

こうしたファシリティやレベルの優先順位や目的については、syslog(3) を参照のこと。

準拠

この logger コマンドは IEEE Std 1003.2 ("POSIX.2") に準拠しているはずである。

logger System rebooted logger -p local0.notice -t HOSTIDM -f /dev/idmc logger -n loghost.example.com System rebooted

作者

オリジナルの logger コマンドが書かれたのは、カルフォルニア大学で、1983 年から 1993 年のことだった。その後、 以下によって書き直しが行われている。

,

関連項目

journalctl(1), syslog(3), systemd.journal-fields(7)

バグ報告

バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

logger コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.