loggerコマンドでシステムログに任意のメッセージを記録する方法|rsyslog転送やシェルスクリプト活用も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > loggerコマンドでシステムログに任意のメッセージを記録する方法|rsyslog転送やシェルスクリプト活用も
「シェルスクリプトが正常に実行されたか後から確認できない」——サーバー運用の現場でよく耳にする悩みです。
cronで動かしているスクリプトのエラーを見逃したり、いつ何が実行されたか追跡できなかったりするケースは少なくありません。

この記事では、logger コマンドの使い方を解説します。システムログへの書き込み方法から、syslogファシリティ・プライオリティの指定、シェルスクリプトとの組み合わせ、リモートホストへのログ転送まで、実務で即使える内容を網羅します。

この記事のポイント

・logger コマンドでシェルから /var/log/messages(syslog)に直接書き込める
・-t でタグを付けるとスクリプト名で絞り込み検索できる
・-p でファシリティとプライオリティを指定してログの重要度を明示できる
・シェルスクリプトに組み込むことで cronジョブの実行記録・エラー検知が容易になる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

loggerコマンドとは何か

logger はシェルの中から直接 syslog(rsyslog/systemd-journald)にメッセージを書き込むコマンドです。通常はシステムデーモンやカーネルが自動でログを出力しますが、logger を使うとシェルスクリプトやユーザーの操作からも同じ仕組みに乗ってログを残せます。

実務で logger が役立つ場面は主に以下の3つです。

cronジョブの実行記録:スクリプトの開始・終了・エラーを /var/log/messages に残す
監査目的のログ:重要な設定変更や操作を syslog に記録する
リモートログサーバーへの集約:複数サーバーのスクリプトログを一箇所に転送する

logger は util-linux パッケージに含まれており、RHEL・Rocky Linux・Ubuntu など主要ディストリビューションで標準インストール済みです。追加のインストール作業は不要です。

# バージョン確認(インストール確認) $ logger --version logger from util-linux 2.37.4 # RHEL9 / Rocky Linux 9 の環境例 # Ubuntu 24.04 LTS でも同様に動作する

loggerコマンドの基本的な使い方

1. シンプルなメッセージ書き込み

logger の最も基本的な使い方は、メッセージをそのまま引数で渡すだけです。

# 書式 logger "メッセージ" # 実際のコマンド例 $ logger "バックアップスクリプトを開始しました" # /var/log/messages への記録確認 $ tail -3 /var/log/messages Apr 30 10:15:23 webserver01 tomohiro: バックアップスクリプトを開始しました

ログには自動的に「日時」「ホスト名」「コマンドを実行したユーザー名」が付加されます。後から誰がいつ実行したのかが追跡できます。

Ubuntu / Debian 系では /var/log/messages が存在しない場合があり、代わりに /var/log/syslog にログが書き込まれます。

# Ubuntu / Debian の場合 $ tail -3 /var/log/syslog Apr 30 10:15:23 ubuntu-server tomohiro: バックアップスクリプトを開始しました

2. -t オプションでタグを指定する

-t タグ名 を付けると、ログの「ユーザー名」部分にタグが入ります。スクリプト名をタグにしておくと、grep で絞り込みやすくなるため実務では必ず指定します。

# タグを付けてログを書き込む $ logger -t backup_script "バックアップ処理を開始" $ logger -t backup_script "バックアップ処理が正常に完了しました" # 確認 $ tail -5 /var/log/messages Apr 30 10:30:01 webserver01 backup_script: バックアップ処理を開始 Apr 30 10:30:45 webserver01 backup_script: バックアップ処理が正常に完了しました # タグで絞り込む $ grep "backup_script" /var/log/messages Apr 30 10:30:01 webserver01 backup_script: バックアップ処理を開始 Apr 30 10:30:45 webserver01 backup_script: バックアップ処理が正常に完了しました

-t にスクリプト名や機能名を入れると、後から grep タグ名 /var/log/messages でそのスクリプトの実行ログだけを一瞬で抽出できます。

3. -p オプションでファシリティとプライオリティを指定する

-p ファシリティ.プライオリティ でログの種別と重要度を指定できます。デフォルトは user.notice です。

# エラーレベルで書き込む $ logger -t backup_script -p local0.err "バックアップ先に接続できませんでした" # 情報レベルで書き込む $ logger -t backup_script -p local0.info "バックアップ処理を開始します" # 警告レベルで書き込む $ logger -t backup_script -p local0.warn "ディスク使用率が80%を超えました"

よく使うプライオリティは以下の通りです。

プライオリティ 意味 使う場面
emerg 緊急(システム停止レベル) 致命的障害
alert 即時対応が必要 深刻なエラー
crit 重大なエラー ハードウェア障害等
err エラー スクリプトのエラー終了
warn 警告 ディスク残量警告等
notice 通常だが注目すべき 設定変更、サービス再起動
info 情報 正常処理の記録
debug デバッグ情報 開発・テスト時の詳細ログ

4. 標準入力からメッセージを渡す

コマンドの出力を logger にパイプで渡すこともできます。スクリプトの実行結果をそのままログに記録する場合に便利です。

# コマンド出力をloggerに渡す $ df -h / | logger -t disk_check # 確認 $ grep "disk_check" /var/log/messages | tail -5 Apr 30 10:45:10 webserver01 disk_check: Filesystem Size Used Avail Use% Mounted on Apr 30 10:45:10 webserver01 disk_check: /dev/sda1 50G 38G 9.5G 81% / # /dev/stdinを経由しての記録(-fオプション) $ cat /tmp/result.txt | logger -t batch_output

応用・実務Tips

1. cronジョブにloggerを組み込む(最頻出パターン)

logger の最大の実務価値は、cronジョブのスクリプトへの組み込みです。スクリプトの開始・終了・エラーを全てsyslogに記録することで、後から実行履歴をいつでも追跡できます。

#!/bin/bash # backup.sh - loggerでジョブ実行を記録するサンプル SCRIPT_NAME="backup_nightly" BACKUP_SRC="/var/www/html" BACKUP_DEST="/mnt/nas/backup" # 開始ログ logger -t "$SCRIPT_NAME" -p local0.info "バックアップ開始: $BACKUP_SRC -> $BACKUP_DEST" # バックアップ実行 if rsync -a "$BACKUP_SRC" "$BACKUP_DEST"; then # 成功ログ logger -t "$SCRIPT_NAME" -p local0.info "バックアップ正常完了" else # エラーログ(errプライオリティ) logger -t "$SCRIPT_NAME" -p local0.err "バックアップ失敗: rsync が終了コード$?を返しました" exit 1 fi

このスクリプトを crontab に登録すれば、/var/log/messages に実行記録が自動的に残ります。エラー発生時は local0.err で記録されるため、rsyslog の設定でアラートメールを飛ばすことも可能です。

2. ファシリティ local0~local7 でアプリケーションを分類する

local0 から local7 はユーザー(アプリケーション)用のファシリティです。rsyslog でファシリティ別にログファイルを分けて管理できます。

# /etc/rsyslog.d/99-local.conf に追記(rsyslogの設定例) # local0.* -> バックアップスクリプトのログ local0.* /var/log/backup.log # local1.* -> デプロイスクリプトのログ local1.* /var/log/deploy.log # rsyslog を再起動して設定を反映 $ sudo systemctl restart rsyslog # 以降、logger -p local0.info で書いたログは /var/log/backup.log に記録される $ logger -t backup_script -p local0.info "テスト書き込み" $ tail -1 /var/log/backup.log Apr 30 11:00:05 webserver01 backup_script: テスト書き込み

ファシリティを用途別に使い分けることで、バックアップのログ・デプロイのログ・監視のログを別ファイルに分けて管理でき、問題発生時の原因特定が素早くなります。

3. -s オプションで標準エラーにも出力する

-s オプションを付けると、syslogへの書き込みと同時に標準エラー出力にも表示されます。テスト・デバッグ時に実際に何が記録されるかを確認するのに便利です。

# -s で端末にも表示しながら syslog に記録 $ logger -s -t test_script "これはテストメッセージです" test_script: これはテストメッセージです # 端末に表示された後、syslogにも書き込まれている $ tail -1 /var/log/messages Apr 30 11:15:22 webserver01 test_script: これはテストメッセージです

リモートホストへのログ転送

1. -n オプションでリモートsyslogサーバーに直接送信する

logger は rsyslog の設定を変えなくても、-n ホスト名 -P ポート番号 でリモートの syslog サーバーに直接ログを送信できます。

# リモートsyslogサーバー(192.168.1.100)のUDP 514番ポートへ送信 $ logger -n 192.168.1.100 -P 514 -t web01_backup "バックアップ完了" # TCP での送信(--tcp オプションを追加) $ logger --tcp -n 192.168.1.100 -P 514 -t web01_backup "バックアップ完了"

複数台のサーバーからまとめて1台の中央ログサーバーにログを集約する構成では、この方法が最も手軽です。rsyslog の転送設定と組み合わせて使う場面が多いです。

2. -f オプションでファイルの内容を送信する

-f ファイル名 でファイルの内容を1行ずつ syslog に送信できます。既存のログファイルや処理結果ファイルをそのままsyslogに取り込む際に役立ちます。

# スクリプトの実行結果ファイルをsyslogに転送 $ logger -t result_check -f /tmp/job_result.txt # job_result.txtの中身 $ cat /tmp/job_result.txt 処理件数: 1523件 エラー件数: 0件 処理時間: 3分42秒 # syslogへの記録確認 $ grep "result_check" /var/log/messages Apr 30 11:30:10 webserver01 result_check: 処理件数: 1523件 Apr 30 11:30:10 webserver01 result_check: エラー件数: 0件 Apr 30 11:30:10 webserver01 result_check: 処理時間: 3分42秒

トラブルシュート・よくあるミス

「logger: write error: Connection refused」が出る場合

rsyslog サービスが停止していたり、syslog ソケットが存在しない場合にこのエラーが発生します。

# rsyslogの状態確認 $ sudo systemctl status rsyslog * rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled) Active: inactive (dead) ← 停止中 # rsyslogを起動する $ sudo systemctl start rsyslog $ sudo systemctl enable rsyslog # 再度loggerを試す $ logger -t test "rsyslog再起動後のテスト" $ tail -1 /var/log/messages Apr 30 11:40:05 webserver01 test: rsyslog再起動後のテスト

journaldを使う環境でloggerが記録されない場合

systemd を採用している環境では、rsyslog が無効でも logger は journald に記録されます。journalctl で確認してください。

# journaldで確認 $ journalctl -t backup_script --since "1 hour ago" Apr 30 11:00:05 webserver01 backup_script[12345]: バックアップ開始 # /var/log/messages に記録されない場合でも journalctl で取得できる # タグ(-t)で絞り込み可能なので logger の -t 指定は journald でも有効

ログが /var/log/messages に記録されない(Ubuntu / Debian 系)

Ubuntu では /var/log/messages が存在せず /var/log/syslog に書き込まれます。確認先を間違えないよう注意してください。

# Ubuntu / Debian系の確認コマンド $ grep "backup_script" /var/log/syslog # どちらの環境か分からない場合はjournalctlで確認するのが確実 $ journalctl -t backup_script --no-pager | tail -10

マルチバイト文字(日本語)を含むメッセージが文字化けする

ロケールが適切に設定されていない cron 環境では、日本語メッセージが文字化けすることがあります。スクリプトの先頭で環境変数を明示的に設定することで回避できます。

#!/bin/bash # cron から呼ばれる場合は LANG を明示する export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8 logger -t batch_job "処理件数: 1523件"

本記事のまとめ

やりたいこと コマンド
シンプルにsyslogに書き込む logger "メッセージ"
タグを付けて絞り込み可能にする logger -t タグ名 "メッセージ"
エラーレベルで書き込む logger -t タグ -p local0.err "メッセージ"
端末にも同時表示する logger -s -t タグ "メッセージ"
ファイルの内容をsyslogに送る logger -t タグ -f ファイル名
リモートsyslogサーバーに送信 logger -n ホスト名 -P 514 "メッセージ"
journaldで確認する journalctl -t タグ名
タグでログを絞り込む grep "タグ名" /var/log/messages
logger はシンプルなコマンドですが、シェルスクリプトに組み込むことでサーバー運用の品質が大きく変わります。cronジョブが「動いたのかどうか分からない」状態から抜け出すために、まずはスクリプトの開始・終了の記録から始めてみてください。

syslogのログ管理全体を理解するうえでは、systemd-analyze で起動時間計測の知識も合わせて持っておくと、システム起動からサービス稼働まで一連のログを体系的に把握できます。

また、ログに記録したい「どのタイミングでサービスが起動・停止したか」という情報は、ntpd 時刻同期設定で時刻がずれていないことを前提とします。ログの時刻精度はトラブル対応の命綱なので、合わせて確認しておくと万全です。

よくある質問(FAQ)

Q. logger コマンドは root 権限がなくても使えますか?

使えます。logger は一般ユーザーの権限でも実行でき、syslog に書き込めます。書き込まれたログには実行ユーザー名が自動付加されます。

Q. cronスクリプトで logger を使う際に注意することは?

cron の実行環境は PATH が最小限に設定されているため、logger のフルパス(/usr/bin/logger)を指定するか、スクリプト先頭で PATH を明示的に設定することを推奨します。また、LANG の設定も合わせて行うと日本語の文字化けを防げます。

#!/bin/bash # cronから呼ばれるスクリプトの先頭に追記 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export LANG=ja_JP.UTF-8 /usr/bin/logger -t my_job "cronスクリプト開始"

Q. logger で書いたログを自動削除(ローテーション)するにはどうすればいいですか?

logger の書き込み先である /var/log/messages は通常 logrotate で自動ローテーションされます。独自のファシリティ(local0 など)を使って別ファイルに書き出した場合は、/etc/logrotate.d/ にそのファイルのローテーション設定を追加してください。

Q. ログの重要度(プライオリティ)をまとめて高いほうから並べると?

emerg(最高)> alert > crit > err > warn > notice > info > debug(最低)の順です。rsyslog では指定したプライオリティ以上のログのみを特定ファイルに書き出す設定も可能です。

loggerでログ管理が改善されたなら、Linuxサーバー運用の全体像を体系的に学びませんか?

シェルスクリプトとloggerを組み合わせたログ管理は、現場で信頼されるサーバー管理者の必須スキルです。しかし個別コマンドの知識だけでは、本番環境での障害に冷静に対応できません。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。