シェルスクリプトを記述している際に、「処理の途中で独自のメッセージをシステムのログファイルに記録したい」「バッチ処理の成否を他のシステムログと一緒に管理したい」と考えたことはないでしょうか。標準出力への echo だけでは、いつ、どのスクリプトから出力されたメッセージなのかが分かりにくく、運用管理の場面でログの追跡が難しくなる課題があります。
この記事を読むと、LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルの標準機能である logger コマンドを活用して、コマンドラインやシェルスクリプトからシステムログ(syslog)に任意のメッセージを記録できるようになります。これにより、ログの一元管理や障害時の原因切り分けが効率的に行えるようになります。
確認した環境
この記事の検証は以下の環境で行っています。
- OSOS [オーエス]Operating System。基本ソフトウェア: UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS / AlmaLinux 9.4
- シェル: Bash
loggerコマンドとは?syslogに直接メッセージを送る基本機能
logger コマンドは、Linuxシステムのログ記録機構である syslog に対して、コマンドラインやシェルスクリプトから直接メッセージを送信するためのコマンドです。
logger コマンドはメッセージをシステムのログ記録機構(syslog / systemd-journald)へ送信する役割を持ちます。送信されたメッセージは systemd-journald や rsyslog などによって処理されます。実際にどのログファイルへ保存されるか(あるいはファイルとして出力されるかどうか)は、OSの構成やログ管理サービスの設定・フィルタリングルールによって異なります。
loggerコマンドの仕組みとメリット
Linuxシステムでは、カーネルや各種デーモン(SSHSSH [エスエスエイチ]Secure Shell。暗号化されたリモート接続プロトコルやcroncron [クーロン / クロン]Unix系システムにおいて、設定したスケジュールで自動的にコマンドを実行するデーモンなど)が動作状況やエラー情報をログ管理機構へ送信します。ログはsystemd-journaldやrsyslogなどによって処理され、システムの設定に応じて、/var/log/syslog や /var/log/messages などのファイルに記録されます。
logger コマンドを使用するメリットは以下の通りです。
- アプリケーションやシェルスクリプト独自のログを、システムログとまとめて管理できる
- ログ管理サービス側で出力先やローテーションを設定することで、個別のログファイル管理の負担を軽減できる
- 重要度(プライオリティ)やファシリティを指定できるため、ログのフィルタリングや監視に活用できる
基本的な構文と使い方
logger コマンドの基本的な構文は非常にシンプルです。
logger [オプション] <メッセージ>最もシンプルな使い方として、オプションを指定せずにメッセージを送信してみます。
logger "テストメッセージを出力します"実行後、システムログ(Ubuntuの場合は /var/log/syslog、RedHat系の場合は /var/log/messages など)を確認すると、以下のように記録されます。
Ubuntu 24.04(/var/log/syslog)の場合:
2026-10-31T10:00:00.123456+09:00 hostname username: テストメッセージを出力しますAlmaLinux 9(/var/log/messages)の場合:
Oct 31 10:00:00 hostname username: テストメッセージを出力しますログのタイムスタンプの形式は、ログ管理サービスや設定によって異なります。rsyslogでは、RFC 3339形式のタイムスタンプを使用する設定も可能です。記事内のログ出力例は表示形式の一例であり、実際の表示は環境によって異なります。
オプションを指定しない場合、タグには通常、端末にログインしているユーザー名(または実効ユーザーIDに基づくユーザー名)が使用されます。デフォルトのファシリティは user、プライオリティは notice です。スクリプトからログを送信する場合は、-t オプションでスクリプト名などを明示すると、ログの送信元を識別しやすくなります。
記録されたログを確認する方法
記録されたログは、grep でログファイルを検索するか、journalctl コマンドで確認できます。
# ログファイルから検索する(Ubuntuの場合の例)sudo grep "テストメッセージ" /var/log/syslog
# loggerのデフォルトタグ(実行ユーザー名)で検索する場合(usernameは実際のユーザー名に置き換え)journalctl -t username
# logger -t my-batch-script でタグを指定して記録した場合journalctl -t my-batch-scriptjournalctl -t は、ログの識別子(SYSLOG_IDENTIFIER)を指定して検索するオプションです。
なお、journalctl で参照する systemd-journald のバイナリジャーナルと、rsyslogなどが出力する /var/log 配下のテキストログファイルは、管理の仕組みが異なります。テキストログファイルが出力されていない構成でも、systemd-journaldが対象のログを保持していれば、journalctl から確認できます。ただし、ジャーナルの閲覧にも適切な権限が必要です。
Ubuntuでは、/var/log/syslog の閲覧権限が制限されている場合があります。権限がない場合は sudo を付けて確認するか、管理者に適切な閲覧権限を設定してもらいましょう。実際の所有者やパーミッションは ls -l コマンドで確認できます。
ls -l /var/log/syslogなお、AlmaLinuxなどのRedHat系ディストリビューションでは /var/log/messages などのテキストログファイルがrsyslogによって記録されますが、利用可能なファイルやパーミッション設定はシステムの構成によって異なります。
実務で役立つloggerのオプションと使い方
実務の運用管理では、どのスクリプトやアプリケーションから出力されたログなのかを明確にし、重要度に応じた処理を行うためにオプションを活用します。
タグ(tag)を付けてログの送信元を明確にする
複数のシェルスクリプトやコマンドからログを送信する場合、デフォルトのユーザー名だけではどの処理のログか識別できません。-t(または --tag)オプションを使用すると、ログの先頭に任意の識別子(タグ)を付与できます。
logger -t my-batch-script "バッチ処理を開始しました"出力例:
Oct 31 10:05:00 hostname my-batch-script: バッチ処理を開始しましたこのようにタグを指定することで、grep コマンドなどで特定のスクリプトに関連するログだけを効率的に抽出できるようになります。
優先度(プライオリティ / ファシリティ)を指定して記録する
logger コマンドでは、ログの重要度を示すプライオリティ(優先度)や、ログのカテゴリを示すファシリティを指定できます。-p(または --priority)オプションを使用します。
構文は <ファシリティ>.<プライオリティ> の形式で指定します。
主なプライオリティ(重要度の高い順):
emerg(緊急)alert(警戒)crit(致命的)err(エラー)warning(警告)notice(注意)info(情報)debug(デバッグ)
使用例(エラーレベルのログとして記録する):
logger -p user.err "データベースへの接続に失敗しました"記録されたログは、journalctl -p err のようにプライオリティを指定して絞り込むこともできます。journalctl -p err を実行すると、エラーレベル(err)だけでなく、それ以上の重要度を持つ crit、alert、emerg も表示対象となります。
util-linux版の logger では、warn は warning の別名、error は err の別名として扱われます。これらは非推奨の表記とされているため、この記事では標準的な warning と err を使用します。なお、warn や error を指定してもログの重要度として別の意味を持つわけではありません。
リモートのsyslogサーバーへ送信する
-n(または --server)オプションを使用すると、ローカルではなくリモートのsyslogサーバーへメッセージを送信できます。ローカルに記録するだけであれば指定は不要です。
# リモートのsyslogサーバー(TCP/514)へ送信するlogger -n 192.168.1.10 -P 514 -T -t my-app "リモートへ送信するメッセージ"| オプション | 説明 |
|---|---|
-n <サーバー> | 送信先のsyslogサーバーを指定する |
-P <ポート> | 送信先のポート番号を指定する。省略時は、UDP接続では通常514番、TCPTCP [ティーシーピー]Transmission Control Protocol。信頼性の高い通信プロトコル接続では通常601番が使用されます(/etc/services の設定などに依存します)。なお、プロトコルを明示しない場合の接続動作は、logger の仕様に従います |
-T | TCPのみを使用する |
-d | UDPのみを使用する |
-n で送信先だけを指定した場合は、通常UDPで接続を試み、接続に失敗するとTCP接続を試みます。通信方式を明確に指定したい場合は、-d(UDPのみ)または -T(TCPのみ)を使用してください。TCPで514番ポートを使用する場合は、今回の例のように -P 514 を明示します。送信先のsyslogサーバー側でも、同じプロトコルとポート番号で受信できるように設定(rsyslogの imtcp / imudp モジュールなど)する必要があります。
シェルスクリプトに組み込む実践的な活用例
ここからは、実際のシェルスクリプト内で logger コマンドを活用する具体的なサンプルコードを紹介します。
エラー発生時に標準エラー出力とsyslogの両方へ記録する
シェルスクリプトの実行中にエラーが発生した際、コンソール(標準エラー出力)とシステムログの両方に記録を残すと、後からの調査がスムーズになります。
#!/bin/bash
# エラーメッセージを標準エラー出力へ表示し、syslogにも記録する関数log_error() { local message="$1" echo "[ERROR] $message" >&2 logger -t backup-script -p user.err "$message"}
# 処理の例:ディレクトリが存在するか確認TARGET_DIR="/mnt/backup"
if [ ! -d "$TARGET_DIR" ]; then log_error "バックアップ先ディレクトリが存在しません: $TARGET_DIR" exit 1fi上記のスクリプトでは、条件を満たさない場合に標準エラー出力へエラーメッセージを表示した後、logger コマンドでsyslogへも記録します。-p user.err を指定しているため、ファシリティは user、プライオリティは err となります。
なお、echo による出力と logger による記録の両方が必ず成功することを保証するものではありません(loggerコマンド側のエラーハンドリングが必要な場合は、必要に応じて戻り値のチェックを追加してください)。
バッチ処理の開始・終了をログに残すサンプルコード
定期実行されるバッチ処理において、処理の開始と正常終了、異常終了を明確に記録する構成例です。
#!/bin/bash
TAG="daily-report"
# 開始ログlogger -t "$TAG" -p user.info "日次レポート作成バッチを開始します"
# 実際の処理を実行(※/path/to/create-report.sh は実際の処理コマンドに置き換えてください)if /path/to/create-report.sh; then # 正常終了ログ logger -t "$TAG" -p user.info "日次レポート作成バッチが正常に終了しました"else # 異常終了ログ(終了ステータスを保持して記録) status=$? logger -t "$TAG" -p user.err "日次レポート作成バッチが異常終了しました。終了ステータス: $status" exit "$status"fiこの構成を定期実行(cronなど)に組み込むことで、バッチが意図通りに動作しているかをシステムログ経由で一元的に監視できるようになります。
実際の処理の終了ステータスを正しくログに残すため、else ブロックの最初で $? を変数 status に保持してログに出力し、スクリプト自体もそのステータスで終了するようにしています。
注意点として、このサンプルでは logger コマンド自体の失敗をバッチ処理の失敗として扱う設計にはしていません。ログ記録自体の失敗も監視対象にする場合は、必要に応じて別途エラー処理を設計してください。
まとめ:loggerコマンドでインフラ運用の監視・デバッグを効率化しよう
この記事では、Linuxの logger コマンドの基本的な仕組みから、実務で役立つオプション、シェルスクリプトへの組み込み例までを解説しました。
本記事のポイントは以下の通りです。
loggerコマンドを使用することで、コマンドラインやシェルスクリプトから簡単にsyslogへメッセージを送信できる。-tオプションでタグを付与することにより、ログの送信元を明確にし、後からの検索やフィルタリングが容易になる。-pオプションでファシリティやプライオリティを指定し、重要度に応じたログ管理が行える。- シェルスクリプトのエラー処理やバッチ処理のライフサイクルに組み込むことで、インフラ運用の監視・デバッグ効率が大幅に向上する。
ぜひ日々の運用管理やスクリプト作成に logger コマンドを活用してみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。