システムロギング - syslog/journald/logger【LPIC-1 108.2】

システムロギング - syslog/journald/logger【LPIC-1 108.2】

この記事で達成できること

  • rsyslog の「ファシリティ.プライオリティ」書式でログの振り分けルールを書ける
  • ファシリティとプライオリティの一覧を区別して答えられる
  • journalctl の主要オプション(-u / -b / -f / -p / --since)を使い分けられる
  • systemd-journald を揮発から永続ストレージに切り替えられる
  • logger で任意のメッセージを syslog に記録できる
  • logrotate でログの肥大化を防ぐ仕組みを説明できる

LPIC-1 主題 108.2「システムのログを管理する」の中核。rsyslog と systemd-journald の二系統、それを操作する journalctl / logger / logrotate を一通り押さえる。

どのログ機構を使えばいいのか

現代の多くのディストリビューションでは、systemd-journald がログを一次受信し、必要に応じて rsyslog に転送して従来型のテキストログ(/var/log/messages 等)にも書き出す二段構成が一般的。

機構 保存形式 主な確認コマンド 設定ファイル
systemd-journald バイナリ(journal) journalctl /etc/systemd/journald.conf
rsyslog テキスト cat / grep /etc/rsyslog.conf

journald は構造化されたメタデータ(ユニット名・PID・起動 ID 等)を保持し、journalctl で柔軟に絞り込める。rsyslog はプレーンテキストで、リモートへの転送や長期保管の運用に強い。試験ではこの両方が問われる。

rsyslog の振り分けルールはどう書くのか

rsyslog の振り分けは「セレクタ(ファシリティ.プライオリティ)+アクション(出力先)」の組で記述する。/etc/rsyslog.conf または /etc/rsyslog.d/ 配下のファイルに書く。

書式は次の形。

mail.info                       /var/log/mail.log
authpriv.*                      /var/log/secure
*.emerg                         :omusrmsg:*
cron.*                          /var/log/cron

左がセレクタ、右が出力先。mail.info は「mail ファシリティのプライオリティ info 以上」を意味する。info のように 1 つ指定すると、それ以上の重大度がすべて該当する点が頻出ポイント。authpriv.** は全プライオリティ、*.emerg は全ファシリティの emerg を意味する。

ファシリティとプライオリティ

セレクタはファシリティ(メッセージの発生源カテゴリ)とプライオリティ(重大度)の組み合わせ。

ファシリティの主な値:

ファシリティ 意味
auth / authpriv 認証・セキュリティ関連
cron cron / at のジョブ
daemon 各種デーモン(システムサービス)
kern カーネルメッセージ
mail メールサブシステム
user ユーザープロセス(デフォルト)
local0local7 独自用途に割り当て可能な予約枠

プライオリティ(重大度。低い順に並べる):

プライオリティ 数値 意味
debug 7 デバッグ情報
info 6 通常の情報
notice 5 正常だが注意すべき事象
warning 4 警告
err 3 エラー
crit 2 危機的状態
alert 1 即時対応が必要
emerg 0 システム使用不能

*.info は info 以上(info / notice / warning / err / crit / alert / emerg)が対象。特定プライオリティだけに限定したい場合は mail.=info のように = を付ける。

ファシリティとプライオリティは「.(ドット)」で結ぶ。local0local7 はアプリケーションが独自ログを syslog に流すための予約枠で、自作スクリプトや業務アプリの分離によく使われる。

ログのリモート転送

rsyslog は他ホストへログを転送できる。送信側の設定ファイルにセレクタと転送先を記述する。

*.*     @192.168.1.10:514
*.*     @@192.168.1.10:514

@ 1 つは UDP、@@ 2 つは TCP での転送。集中ログサーバへ集約する運用で使う。受信側は該当ポートでの受信を有効化する必要がある。

journalctl の主要オプションは何か

journalctl は systemd-journald が収集したログを検索・表示するコマンド。引数なしで実行すると全ログを古い順に表示する。

代表的な絞り込みオプション:

journalctl -u sshd.service
journalctl -b
journalctl -f
journalctl -p err
journalctl --since "2026-05-30 09:00:00" --until "2026-05-30 12:00:00"
オプション 機能
-u UNIT 指定したサービスユニットのログだけ表示
-b [ID] 起動単位で絞る(-b は今回、-b -1 は前回の起動)
-f 末尾を追従表示(tail -f 相当)
-p PRIORITY プライオリティで絞る(-p err は err 以上)
--since / --until 期間で絞る(--since today 等の相対指定も可)
-k カーネルメッセージのみ(dmesg 相当)
-r 新しい順に表示
-n N 末尾 N 行を表示

実行例:

journalctl -u sshd --since today -p warning
May 30 09:14:22 host sshd[1421]: Failed password for invalid user test from 203.0.113.5 port 55012 ssh2
May 30 10:02:51 host sshd[1588]: error: maximum authentication attempts exceeded for root

-p のプライオリティ指定は rsyslog と同じ語(emergdebug)または数値(0〜7)が使える。-p err は err 以上をまとめて拾う。

journald のログを永続化するには

systemd-journald のログ保存先は /etc/systemd/journald.confStorage= で制御する。デフォルト(auto)では /var/log/journal/ が存在すればそこに永続保存し、無ければ /run/log/journal/(メモリ上の tmpfs)に揮発保存する。

[Journal]
Storage=persistent
Storage= の値 挙動
volatile 常にメモリ(/run/log/journal/)のみ。再起動で消える
persistent 常にディスク(/var/log/journal/)に保存。ディレクトリも自動作成
auto /var/log/journal/ があれば永続、無ければ揮発(デフォルト)
none 保存しない(転送のみ)

永続化する手順:

sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
journalctl --disk-usage
Archived and active journals take up 112.4M in the file system.

Storage=persistent を設定するか /var/log/journal/ を作成して journald を再起動すれば、再起動後もログが残る。journalctl --disk-usage で消費量を確認できる。

多くのディストリビューションでは journald のデフォルトが auto かつ /var/log/journal/ が未作成のため、ログが揮発(メモリ保存)になっている。この状態では再起動すると過去ログが消える。journalctl -b -1 で「前回の起動分」を見ようとして何も出ない場合、永続化されていないことを疑う。

logger コマンドの使い方

logger はコマンドラインやスクリプトから syslog にメッセージを送るツール。シェルスクリプトの実行ログを残す用途で多用する。

logger "backup script started"
logger -p local0.info -t backup "nightly backup finished"
オプション 機能
-p ファシリティ.プライオリティを指定(既定 user.notice
-t TAG メッセージにタグ(識別名)を付ける
-s 標準エラー出力にも同時に出す

記録結果の確認:

logger -p local0.info -t backup "nightly backup finished"
journalctl -t backup -n 1
May 30 02:00:03 host backup[2840]: nightly backup finished

-t backup で付けたタグは journalctl -t backup で絞り込める。スクリプト内に logger を仕込むと、cron 等から走らせた処理の成否を後から journal で追跡できる。

logrotate でログの肥大化を防ぐには

logrotate はログファイルが無制限に大きくならないよう、定期的に世代交代(ローテーション)させる仕組み。主設定は /etc/logrotate.conf、個別設定は /etc/logrotate.d/ 配下に置く。

/etc/logrotate.conf の例:

weekly
rotate 4
create
compress
include /etc/logrotate.d

weekly は週次ローテーション、rotate 4 は 4 世代保持、create はローテーション後に空のログを作成、compress は古いログを gzip 圧縮する。include /etc/logrotate.d でサービスごとの個別設定を読み込む。

個別設定(/etc/logrotate.d/nginx の例):

/var/log/nginx/*.log {
    daily
    rotate 14
    missingok
    notifempty
    postrotate
        systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}

daily で日次、rotate 14 で 14 世代保持。missingok はファイルが無くてもエラーにせず、notifempty は空なら回さない。postrotateendscript でローテーション後にプロセスへ再読み込みを通知する。

動作確認(実際には回さず判定だけ表示):

logrotate -d /etc/logrotate.conf
rotating pattern: /var/log/nginx/*.log  after 1 days (14 rotations)
considering log /var/log/nginx/access.log
  log does not need rotating (log has been already rotated)

-d(debug)はドライランで、実際にはローテーションせず判定内容だけ出力する。設定を変更したら本番適用前に -d で確認するのが定石。-f(force)を付けると条件を満たさなくても強制的に回す。

logrotate は通常 cron.daily または systemd timer から 1 日 1 回呼ばれる。daily と設定しても実行は呼び出しタイミングに依存するため、「設定した瞬間に回る」ものではない点に注意。

主要なログファイルはどこにあるか

rsyslog が書き出すテキストログの場所はディストリビューションで異なる。試験では Red Hat 系と Debian 系の差が問われる。

内容 Red Hat 系 Debian 系
一般的なシステムログ /var/log/messages /var/log/syslog
認証関連 /var/log/secure /var/log/auth.log
cron ログ /var/log/cron /var/log/syslog(syslog に統合)
カーネルメッセージ /var/log/dmesg /var/log/kern.log

認証失敗を調べるなら Red Hat 系は /var/log/secure、Debian 系は /var/log/auth.log を見る。systemd-journald のみの環境ではこれらのテキストファイルが存在しないこともあり、その場合は journalctl で同等の情報を得る。

よくあるミス

ログ管理で初学者がつまずく代表的なパターン。

  • ミス 2: mail.info を「info だけ」と誤解する — セレクタの単一プライオリティ指定は「それ以上の重大度すべて」を含む。info だけに限定したいなら mail.=info= を使う。
  • ミス 3: ファシリティとプライオリティを取り違えるauth / cron / mail 等は発生源(ファシリティ)、err / warning / debug 等は重大度(プライオリティ)。混同すると振り分けルールが意図通りに動かない。
  • ミス 4: logrotate を設定した瞬間に回ると思い込む — logrotate は cron / timer からの呼び出し時に条件を評価する。即時確認したいなら logrotate -d(判定のみ)や -f(強制実行)を使う。
  • ミス 5: テキストログだけ見て journal を見落とす — systemd 環境では多くのサービスログが journal にしかない。/var/log/ にファイルが無くても journalctl -u サービス名 で確認する。

トラブルシューティング

症状: journalctl -b -1 で前回の起動ログが出ない

原因: journald が揮発保存になっており、再起動でログが消えている

確認:

cat /etc/systemd/journald.conf | grep Storage
ls /var/log/journal 2>/dev/null

対処: /var/log/journal/ を作成し sudo systemctl restart systemd-journald で永続化する。または Storage=persistent を設定する。

症状: rsyslog のルールを書いたのにログが出力されない

原因: セレクタのファシリティ/プライオリティの綴り誤り、または設定再読み込み漏れ

確認:

sudo rsyslogd -N1
systemctl status rsyslog

対処: rsyslogd -N1 で構文検証し、sudo systemctl restart rsyslog で再読み込みする。出力先ディレクトリの存在と権限も確認する。

症状: ログでディスクが逼迫している

原因: logrotate の保持世代が多すぎる、または journald の上限が大きい

確認:

journalctl --disk-usage
du -sh /var/log/*

対処: logrotate の rotate 世代数や compress を見直す。journald は journalctl --vacuum-size=200M で過去分を削減できる。

作業完了チェックリスト

  • [ ] rsyslog のセレクタ書式(ファシリティ.プライオリティ)を読み書きできる
  • [ ] ファシリティとプライオリティの一覧を区別できる
  • [ ] journalctl -u / -b / -f / -p / --since を使い分けられる
  • [ ] journald を永続化する手順を実行できる
  • [ ] logger でタグ付きメッセージを記録できる
  • [ ] logrotate -d でローテーション判定を確認できる

まとめ

目的 コマンド / 設定
振り分けルール /etc/rsyslog.confmail.info /path
ユニットログ確認 journalctl -u UNIT
起動別ログ確認 journalctl -b / -b -1
リアルタイム追従 journalctl -f
永続化 Storage=persistent(journald.conf)
メッセージ記録 logger -p local0.info -t TAG "msg"
ローテーション確認 logrotate -d /etc/logrotate.conf

システムロギングは障害調査とセキュリティ監査の土台。rsyslog のファシリティ/プライオリティと journald の永続化、logrotate による容量管理を押さえれば 108.2 は確実に得点できる。

次に読む