Linuxログ監視の方法|journalctl・rsyslog

※本記事にはプロモーションを含む場合があります。
- journalctlは1コマンドで起動時から直近5分前までのログを即座に確認できる
- rsyslogは1秒あたり数万件規模のログ処理に対応するとされている
- 監視を自動化すると異常検知までの時間が数分から数十秒に短縮できるといわれている
- 金融・医療業界ではログの保存期間が90日〜7年と長期に定められているケースがある
- フィルタリングと出力形式を工夫すれば、数千行のログから必要な1行を数秒で見つけられる
ログ監視が重要な理由
Linuxサーバーを運用していると、障害の予兆や不正アクセスの痕跡はほぼ例外なくログの中に残っています。しかし、ログを見る習慣がなければ、障害発生から原因特定までに数時間、場合によっては数日かかることも珍しくありません。実際、システム障害の多くはログの中に何らかの手がかりが残っているとされており、監視体制を整えていない現場ほど復旧までの時間が長引く傾向にあります。
ログ監視が求められる代表的な場面は次の4つです。
- システム障害時の原因特定:サーバーダウンやレスポンス低下が起きた際、発生時刻と関連プロセスをログから素早く割り出せる
- セキュリティインシデントの検知:不正ログインや権限昇格の試みを、発生から数分以内に検知できる体制が理想とされる
- コンプライアンス対応:金融機関や医療機関では、ログの保存と定期監査が内部規程・法令で義務付けられていることが多い
- パフォーマンス分析:CPUやメモリ使用率、レスポンスタイムの推移をログから継続的に把握できる
Linuxには標準で2つのログ管理の仕組みが用意されています。1つはsystemdに組み込まれたsystemd-journald(journalctlコマンドで操作)、もう1つは従来から使われてきたrsyslogです。両者は役割が異なり、journalctlは「今すぐログを見る」用途に強く、rsyslogは「ログを長期保存・転送・整形する」用途に強みがあります。この2つを組み合わせることで、日々の運用から緊急時のトラブルシューティングまでを一貫してカバーできる監視環境が構築できます。次のセクションから、それぞれの実践的な使い方を順番に見ていきます。
journalctl基本操作
systemd-journaldは、Linuxの起動プロセスやサービスのログを一元管理する仕組みです。journalctlコマンドを使えば、複雑な設定なしにすぐログを閲覧できます。まずは何も引数を付けずに実行してみましょう。
journalctl
これだけで、システム起動時から現在までの全ログが時系列で表示されます。行数が多い場合は自動的にページャ(less相当)が起動するため、矢印キーやスペースキーでスクロールしながら確認できます。
| オプション | 説明 | 使用例 |
|---|---|---|
| -b | 現在のブートセッションのログのみ表示 | journalctl -b |
| -u | 特定サービスのログを表示 | journalctl -u nginx |
| -f | リアルタイムでログを追跡(tail -f相当) | journalctl -f |
| –since / –until | 時間範囲を指定してログを絞り込む | journalctl –since “2026-08-01 00:00:00” |
実務で頻出するパターンを3つ紹介します。
- 直近1時間のログを確認する:
journalctl --since "1 hour ago" - nginxのエラーだけをリアルタイム監視する:
journalctl -u nginx -p err -f - 今回のブートで発生したエラーを洗い出す:
journalctl -b -p err
これらのコマンドは、サーバーにSSH接続してから10秒以内に実行できる手軽さが利点です。特に-fオプションはデプロイ直後の動作確認や、障害発生中のリアルタイム監視で重宝します。慣れてくると、朝の巡回作業を1日あたり5分程度で終えられるという声も現場からよく聞かれます。まずはこの基本コマンド群を体に染み込ませることが、効率的なログ監視の第一歩です。
フィルタで絞り込む
journalctlの真価は、豊富なフィルタリング機能にあります。ログレベルやプロセスID、ユーザーIDなど、複数の条件を組み合わせることで、数万行に及ぶログの中から目的の1行を瞬時に見つけ出せます。
| フィルタ | 説明 | 使用例 |
|---|---|---|
| -p | ログレベル(emerg〜debugの8段階)で絞り込む | journalctl -p err |
| _PID= | プロセスIDで絞り込む | journalctl _PID=1234 |
| _UID= | 実行ユーザーIDで絞り込む | journalctl _UID=0 |
| _SYSTEMD_UNIT= | systemdユニット単位で絞り込む | journalctl _SYSTEMD_UNIT=nginx.service |
| SYSLOG_IDENTIFIER= | プロセス名で絞り込む | journalctl SYSLOG_IDENTIFIER=sshd |
現場でよく使われる組み合わせ例を挙げます。
- rootユーザーによるログイン履歴を洗い出す:
journalctl _UID=0 | grep "sshd" - 直近5分間の警告レベル以上のログを確認する:
journalctl --since "5 minutes ago" -p warning - 特定プロセスのクラッシュ原因を追う:
journalctl _PID=1234 -p crit - 複数条件を組み合わせて絞り込む:
journalctl -u nginx -p err --since today
ログレベルはemerg(緊急)からdebug(デバッグ情報)まで8段階に分かれており、通常の運用ではwarning以上、障害調査時はinfo以上まで範囲を広げて確認するのが一般的とされています。フィルタを組み合わせずに全ログを目視で追うと、1万行あたり数十分かかることもありますが、適切なフィルタを使えば同じ作業を1分以内に短縮できるケースも多く報告されています。日々のログ確認では、まず-pオプションでレベルを絞り、次に_SYSTEMD_UNIT=やSYSLOG_IDENTIFIER=でサービス単位に絞り込む、という2段階の流れを覚えておくと迷いません。
出力形式のコツ
journalctlの出力は、目的に応じて形式を切り替えられます。人間が読みやすいデフォルト形式に加え、機械的な処理に適したJSON形式なども選択可能です。
| オプション | 説明 | 使用例 |
|---|---|---|
| -o cat | メッセージ本文のみを簡潔に表示 | journalctl -o cat |
| -o json | 1行ごとにJSON形式で出力 | journalctl -o json |
| -o json-pretty | 整形されたJSON形式で出力 | journalctl -o json-pretty |
| -o export | バイナリ形式で出力(バックアップ向き) | journalctl -o export > logs.export |
| –no-pager | ページャを使わず直接標準出力へ流す | journalctl –no-pager | grep “error” |
実務での活用例を3つ紹介します。
- ログをCSVに変換してスプレッドシート分析に使う:
journalctl -o json | jq -r '[.timestamp, .message] | @csv' > logs.csv - 特定サービスのログをJSON形式で外部ツールへ渡す:
journalctl -u nginx -o json > nginx_logs.json - 1日分のログを整形して保存する:
journalctl --since "1 day ago" -o json-pretty > system_logs.json
jqコマンドと組み合わせると、さらに柔軟な処理が可能になります。
# 特定フィールドのみ抽出
journalctl -o json | jq -r '.timestamp, .message'
# エラーレベル(priority=3)のみ抽出
journalctl -o json | jq 'select(.priority == "3")'
# 特定文字列を含むログのみ抽出
journalctl -o json | jq 'select(.message | contains("failed"))'
JSON形式での出力は、GrafanaやELK StackといったログBIツールへの連携を前提とする場合に特に効果を発揮します。手元での簡易確認は-o catやgrepで十分ですが、チームで共有するダッシュボードを作る段階になったら、JSON形式への切り替えを検討する価値があります。
rsyslogの設定方法
rsyslogは、Linuxで長らく使われてきたログデーモンです。柔軟な設定ファイルと豊富なモジュール群により、ローカル保存からリモート転送、フォーマット変更まで幅広く対応できます。公式ドキュメントによれば、1秒あたり数万件規模のログ処理性能を持つとされ、大規模環境でも実績があります。
まずrsyslogサービスを起動・有効化します。
sudo systemctl start rsyslog sudo systemctl enable rsyslog
次に/etc/rsyslog.confを編集します。基本設定の例は以下の通りです。
module(load="imuxsock") # local messages module(load="imklog") # kernel logs module(load="builtin:omfile") # file output *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg :omusrmsg:*
| 保存先 | 内容 |
|---|---|
| /var/log/messages | info以上の一般的なシステムログ |
| /var/log/secure | 認証・権限関連のログ |
| /var/log/maillog | メールサーバーのログ |
| /var/log/cron | cronジョブの実行ログ |
設定変更後は必ずサービスを再起動します。
sudo systemctl restart rsyslog
特定サービスのログを別ファイルに分離したい場合は、/etc/rsyslog.d/以下に個別設定ファイルを追加します。
# /etc/rsyslog.d/nginx.conf if $programname == 'nginx' then /var/log/nginx/access.log if $programname == 'nginx' then stop
加えて、ログの肥大化を防ぐためにlogrotateとの併用が推奨されます。多くのディストリビューションでは週次でローテーション・4世代保持・圧縮といった設定が標準ですが、アクセス数の多いサーバーでは日次ローテーションに切り替えるケースもあります。
# /etc/logrotate.d/rsyslog
/var/log/messages {
weekly
rotate 4
compress
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
ログ転送で一元管理
複数台のサーバーを運用している場合、各サーバーのログを1か所に集約できると、障害調査や監査対応の手間が大幅に減ります。rsyslogのリモート転送機能を使えば、この一元管理を比較的シンプルな設定で実現できます。設定は送信側(クライアント)と受信側(サーバー)に分けて進めます。
- 送信側サーバーで/etc/rsyslog.confを開き、転送先IPとポートを指定する:
*.* @@192.168.1.100:514 - 必要に応じてTLS暗号化用の証明書パスを設定する(下記コメントアウト部分を参照)
- 受信側サーバーでimtcpモジュールを読み込み、受信ポート514番を開放する
- 受信ログの保存先テンプレートをホスト名・プログラム名ごとに定義する
- ファイアウォールで514番(TLS利用時は6514番)を許可する
- 両サーバーでrsyslogサービスを再起動し、転送状況を確認する
送信側の設定例です。
# リモートサーバーのIPアドレスとポートを指定 *.* @@192.168.1.100:514 # TLS暗号化を有効にする場合(例) # $DefaultNetstreamDriverCAFile /etc/rsyslog.d/keys/ca.pem # $DefaultNetstreamDriverCertFile /etc/rsyslog.d/keys/client-cert.pem # $DefaultNetstreamDriverKeyFile /etc/rsyslog.d/keys/client-key.pem # $ActionSendStreamDriverMode 1 # $ActionSendStreamDriverAuthMode x509/name # *.* @@(o)192.168.1.100:6514
受信側の設定例です。
module(load="imtcp") module(load="gtls") input(type="imtcp" port="514") template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log") *.* ?RemoteLogs
設定完了後は両サーバーでrsyslogを再起動します:sudo systemctl restart rsyslog
特定ホストからのログだけを別ファイルに保存したい場合は、以下のように条件を追加できます。
if $fromhost-ip == '192.168.1.200' then /var/log/specific_host.log if $fromhost-ip == '192.168.1.200' then stop
また、テンプレート機能を使えばJSON形式やCSV形式にログを整形して出力することもでき、SIEM製品やログ分析ツールとの連携がスムーズになります。暗号化なしの転送はネットワーク上でログ内容が平文のまま流れるため、社外拠点間や公衆回線をまたぐ構成ではTLSの利用がほぼ前提になると考えておくと安全です。
監視自動化の実践
手動でのログ確認には限界があります。人がターミナルを見ている間しか異常に気付けず、深夜や休日のトラブルは発見が遅れがちです。そこで重要になるのが監視の自動化です。自動化によって得られる効果は主に3つあります。
- リアルタイム異常検知:エラーや警告レベルのログを検知した瞬間にアラートを発報できる
- 人的ミスの削減:24時間365日体制の監視を仕組み化し、見落としのリスクを減らせる
- 初動対応の高速化:異常検知から通知までを数十秒以内に収められれば、被害拡大を防ぎやすくなる
自動化のアプローチは大きく2種類に分けられます。1つはPrometheus・Grafana・Loki(Promtail)やELK Stackといった専用の監視ツールと連携する方法、もう1つはrsyslog・journalctlと自作スクリプトを組み合わせる方法です。
Promtail + Loki + Grafanaを使う場合の大まかな流れは以下の通りです。
- Promtailをダウンロードしてインストールする(
wgetでバイナリを取得し/usr/local/bin配下に配置) - /etc/promtail/config.ymlを作成し、監視対象パス(例:/var/log/*log)を指定する
- Lokiをインストールし、ストレージ設定を含む/etc/loki/config.ymlを用意して起動する
- Grafanaをインストールし、grafana-serverサービスを起動・自動起動を有効化する
- Grafanaの管理画面からLokiをデータソースとして追加する(URL:http://localhost:3100)
- ダッシュボードを作成し、
{job="varlogs"} |= "error"のようなクエリでエラーログを可視化する
Grafana上でLogsパネルを作成すれば、特定のエラーメッセージが発生した瞬間をダッシュボード上でリアルタイムに確認できます。導入初期は設定が複雑に感じられるかもしれませんが、一度構築してしまえば、複数サーバーの状況を1画面で把握できるようになり、日々の巡回時間を大幅に圧縮できます。小規模な環境であれば、journalctl -fとslack通知用のシェルスクリプトを組み合わせる簡易的な自動化から始めるのも現実的な選択肢です。
ログ監視体制構築チェックリスト
- □ journalctlのログ保存期間・容量上限を確認したか
- □ rsyslogでログレベル別・サービス別に振り分け設定をしているか
- □ リモート転送時にTLS暗号化を有効化しているか
- □ アラート通知先を複数用意し、単一障害点を避けているか
- □ logrotateでローテーション・保持世代数を設定しているか
- □ 不正アクセスの兆候(認証失敗の連続発生など)を定期確認しているか
不正アクセス検知術
ログ監視のもう1つの大きな目的が、セキュリティインシデントの早期発見です。不正アクセスの多くは、成功する前に何度も失敗した痕跡をログに残します。この痕跡をいかに早く見つけるかが、被害を最小限に抑える鍵になります。
| 兆候 | 確認方法 | 目安 |
|---|---|---|
| SSH認証失敗の連続 | journalctl _SYSTEMD_UNIT=sshd.service -p warning | 短時間に10回以上の失敗は要注意とされる |
| rootログインの試行 | journalctl _UID=0 | grep “sshd” | 心当たりのない時間帯の記録は要確認 |
| 権限昇格の試み | /var/log/secureでsudo関連ログを確認 | 失敗が繰り返される場合は要調査 |
| 異常な通信先へのアクセス | rsyslogで転送したファイアウォールログを確認 | 普段と異なる国・IPからのアクセスに注意 |
実務で使える具体的な確認コマンドを紹介します。
- 直近24時間のSSH認証失敗を集計する:
journalctl -u sshd --since "24 hours ago" | grep "Failed password" - 特定IPからのアクセスを追跡する:
journalctl _SYSTEMD_UNIT=sshd.service | grep "192.168.1.50" - 権限昇格の試みを確認する:
journalctl _UID=0 -p warning --since today
これらのログを定期的にチェックする体制がない場合、fail2banのようなツールを併用し、一定回数以上の認証失敗を検知したら自動でIPアドレスをブロックする仕組みを組み込む方法もあります。加えて、rsyslogでリモートサーバーにログを転送しておけば、万が一攻撃者に侵入されてローカルログが改ざん・削除されても、転送済みのログは別サーバー上に残るため、証跡の保全という観点でも有効です。セキュリティ監査の場面では、ログの改ざん耐性が問われることも多く、リモート転送とアクセス権限の分離は基本的な対策として位置づけられています。
よくあるトラブル対処
ログ監視環境を運用していると、いくつかの典型的なトラブルに遭遇します。ここでは代表的な4つのケースと、その対処法を紹介します。
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| journalctlの出力が空になる | 永続化設定(Storage=persistent)が無効 | /etc/systemd/journald.confを編集し再起動 |
| rsyslogがログを転送しない | ファイアウォールでポートが閉じている | 514番(TLS時は6514番)を開放する |
| ログファイルの容量が肥大化 | logrotate未設定または頻度不足 | ローテーション間隔・保持数を見直す |
| 特定サービスのログが見つからない | ユニット名の指定誤り | systemctl list-unitsで正式名称を確認 |
ログが永続化されず再起動のたびに消えてしまう場合は、/etc/systemd/journald.confでStorage=persistentを設定し、/var/log/journalディレクトリを作成した上でサービスを再起動すると解決することが多いです。デフォルトでは揮発性ストレージ(メモリ上)に保存される設定になっているディストリビューションもあり、意図せずログが消えてしまうケースが一因になっています。
rsyslogでの転送トラブルは、ネットワーク周りの設定漏れが原因であることが大半です。telnet 192.168.1.100 514のようなコマンドで疎通確認を行い、ポートが到達しているかをまず切り分けると、原因特定までの時間を短縮できます。ログ容量の肥大化は、アクセス数の多いWebサーバーなどで特に起きやすく、放置すると数GB〜数十GB単位でディスクを圧迫することもあるため、logrotateの設定は導入初期段階で必ず確認しておきたいポイントです。
よくある質問
Q1. journalctlのログはどれくらい保存される?
デフォルトでは/etc/systemd/journald.confのSystemMaxUse等の設定値に依存し、ディスク容量の一定割合(多くのディストリビューションで10%前後)に達すると古いログから自動的に削除される仕組みになっているとされています。長期保存が必要な場合は、SystemMaxUseやMaxRetentionSecの値を明示的に設定する必要があります。
Q2. rsyslogとjournalctlはどちらを使えばいい?
両者は競合するものではなく、役割分担で考えるのが一般的です。journalctlはリアルタイムの確認や直近ログの調査に向いており、rsyslogは長期保存・リモート転送・フォーマット変換など、恒久的なログ管理基盤としての役割に強みがあります。多くの現場では両方を併用しています。
Q3. journalctlで過去のログを削除できる?
journalctl --vacuum-time=7dのようなコマンドで、指定期間より古いログを削除できます。またvacuum-sizeオプションを使えば、容量ベースでの削除も可能です。誤って必要なログまで削除しないよう、実行前に対象範囲を確認することが推奨されます。
Q4. リモート転送にTLS暗号化は必須?
必須ではありませんが、社外拠点や公衆回線をまたぐ構成では強く推奨されています。TLSなしの転送では、ログの内容がネットワーク上を平文で流れるため、認証情報や個人情報が含まれるログを扱う場合は特にリスクが高まるとされています。
Q5. 監視ツールはどれを選べばいい?
小規模〜中規模環境ではPrometheus + Grafana + Loki(Promtail)の組み合わせが比較的導入しやすいとされ、大規模かつ多機能な分析が必要な場合はELK Stack(Elasticsearch, Logstash, Kibana)が選ばれる傾向にあります。自社の運用体制やログ量、予算に合わせて選定することが望ましいです。
Infra Academy編集部は、各ベンダー公式ドキュメントとエンジニア監修をもとに本記事を作成しています。インフラ・クラウド構築は環境ごとに差異があるため、本番環境への適用前には必ずテスト環境での検証を行ってください。
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら




