本記事には広告(アフィリエイトリンク)が含まれます。

ログ管理入門 journalctl rsyslog実践

Linuxエンジニア養成講座 第23回|全36回・フェーズ3「ネットワークとインフラ基盤」の8回目(8/12回目)です。
前回まで: 第16回でTCP/IPの基礎、第17回でnmcliによるIP設定と疎通確認、第18回でプロキシ・DNS・NTPのクライアント設定、第19回でパッケージ管理、第20回でfirewalldによる通信制御、第21回第22回で発展トピック(ボンディング・VLAN)を学びました。
今回学ぶこと: journalctl、rsyslog、logrotate を使ったログの管理方法を学びます。

前回の予告で「journalctl、rsyslog、logrotate を使ったログの管理方法を学びます」とお伝えしました。発展トピック(第21-22回)が終わり、今回から通常回に戻ります。

この記事を読み終えると、以下のことができるようになります。

  • Linux のログ管理が journald(収集)→ rsyslog(振り分け)→ テキストファイル保存という二重構造であることを説明できる
  • journalctl のオプションを使って、ユニット別・優先度別・期間別にログを絞り込める
  • rsyslog.conf のルール(facility.priority → 出力先)を読み解ける
  • logger コマンドでテストログを送信し、journalctl と /var/log/messages の両方に記録されることを確認できる
  • alma-main から alma-sub へリモートsyslog転送を設定し、ログが転送されることを確認できる
  • logrotate の設定ファイルを読み解き、ローテーションの仕組みを説明できる

なぜログ管理が重要か

サーバーで問題が起きたとき、最初に確認するのがログです。第15回の「初動コマンド集」でも、障害時に最初に叩くコマンドの1つとして journalctl を紹介しました。ログにはシステムの動作記録がすべて残っており、「いつ」「何が」「どのように」起きたかを時系列で追跡できます。

ログ管理が重要な理由は大きく2つあります。

  • 障害調査の起点 — サービスが停止した、通信できない、といった問題の原因を突き止めるためにログを読む。原因特定ができなければ対策も打てない
  • 定期的な監視 — 障害が起きてからログを見るだけでなく、日常的にログを監視してエラーの兆候を早期に発見する。この考え方は第32回「監視入門」で詳しく扱う

今回はこのログをどう確認し、どう管理するかを学びます。

Linux のログ管理の全体像

Linux のログ管理は、主に3つのコンポーネントで構成されています。

  • systemd-journald(journald) — システムのログを収集する。第13回で学んだ systemd の一部で、カーネルメッセージやサービスの出力をバイナリ形式のジャーナルとして保存する
  • rsyslog — journald が収集したログを読み取り、facility(発生源)と priority(重要度)に基づいてテキストファイルに振り分ける。/var/log/ 以下のファイルを作成・更新する役割
  • logrotate — テキストファイルとして蓄積されたログを定期的にローテーション(古いログを圧縮・削除)して、ディスク容量の枯渇を防ぐ

流れを整理すると以下のようになります。

アプリケーション / カーネル
       ↓ ログ出力
  systemd-journald(バイナリのジャーナルに保存)
       ↓ imjournal モジュール経由で読み取り
     rsyslog(facility.priority のルールでテキストファイルに振り分け)
       ↓ /var/log/messages, /var/log/secure, ...
     logrotate(定期的にローテーション → 古いログを圧縮・削除)
Linuxのログ管理の全体像。アプリケーションやカーネルが出力したログをjournaldがバイナリで保存し、journalctlで参照できる。同時にrsyslogがjournaldからログを読み取り、facility/priorityのルールで/var/log以下のテキストファイルに振り分ける。テキストファイルはtailやgrepで参照できる。logrotateが定期的にファイルをローテーションする

同じログが journald のジャーナルと /var/log/ のテキストファイルの両方に存在するのは、二重に記録しているわけではありません。rsyslog が journald から読み取ってテキストファイルに書き出しているのです。この二重構造を理解した上で、それぞれの使い方を見ていきます。

journalctl でジャーナルを閲覧する

journalctl は systemd-journald が収集したジャーナルを閲覧するコマンドです。テキストファイルではなくバイナリ形式のジャーナルを読み取るため、grep ではなく journalctl のオプションで絞り込みます。

最新のログを表示する(-n)

alma-mainで実行してください。-n オプションで表示行数を指定します。

実行コマンド:

$ journalctl --no-pager -n 5

実行結果:

 4月 03 19:03:00 alma-main systemd[21012]: Reached target Main User Target.
 4月 03 19:03:00 alma-main systemd[21012]: Startup finished in 72ms.
 4月 03 19:03:00 alma-main systemd[1]: Started User Manager for UID 1000.
 4月 03 19:03:00 alma-main systemd[1]: Started Session 35 of User developer.
 4月 03 19:03:00 alma-main sshd[21008]: pam_unix(sshd:session): session opened for user developer(uid=1000) by developer(uid=0)

–no-pager を付けないと less のようなページャで表示されます。スクリプトやパイプで処理する場合は –no-pager が便利です。角括弧内の数値(21012 など)はプロセスID(PID)で、環境によって異なります。タイムスタンプの日本語表記は LANG 設定が ja_JP.UTF-8 の場合の表示です。

特定のサービスに絞り込む(-u)

第13回で systemctl status を使ってサービスの状態を確認しました。journalctl -u を使うと、特定のサービス(ユニット)のログだけを抽出できます。

alma-mainで実行:

実行コマンド:

$ journalctl -u sshd --no-pager -n 3

実行結果:

 4月 02 20:52:19 alma-main sshd[20940]: pam_unix(sshd:session): session closed for user developer
 4月 03 19:03:00 alma-main sshd[21008]: Accepted publickey for developer from 192.168.1.100 port 63617 ssh2: ED25519 SHA256:W2DBHTgDj1dxfL1A8U9rxnmhPn9hN6Ru5sAbR9Ydgcc
 4月 03 19:03:00 alma-main sshd[21008]: pam_unix(sshd:session): session opened for user developer(uid=1000) by developer(uid=0)

SSH接続の履歴が確認できます。「Accepted publickey」は公開鍵認証で接続が成功したことを示しています。PIDやポート番号は接続ごとに変わるため、環境によって異なります。

優先度で絞り込む(-p)

ログには優先度(priority)が設定されています。主な優先度は上から emerg(緊急)、alert、crit、err、warning、notice、info、debug の8段階です。-p で指定した優先度以上のログだけを表示できます。

alma-mainで実行:

実行コマンド:

$ journalctl -p err --no-pager -n 3

実行結果:

 3月 31 05:28:30 alma-main kernel: Warning: Unmaintained driver is detected: ip_set

err レベル以上のログが少ないため1行しか表示されませんでした。障害調査のときは -p err で重要なエラーだけに絞り込み、原因の手がかりを探すのが基本的な使い方です。

期間で絞り込む(–since)

alma-mainで実行:

実行コマンド:

$ journalctl --since today --no-pager -n 3

実行結果:

 4月 03 19:02:33 alma-main systemd[1]: Starting dnf makecache...
 4月 03 19:02:33 alma-main systemd[1]: Starting Rotate log files...
 4月 03 19:02:33 alma-main systemd[1]: logrotate.service: Deactivated successfully.

–since today は今日の 0:00 以降のログを表示します。–since “2026-04-03 18:00” のように日時を指定することもできます。「障害発生は今日の18時頃」といった情報があるときに、期間を絞り込んで調査するのに使います。

現在のブートのログのみ表示する(-b)

alma-mainで実行:

実行コマンド:

$ journalctl -b --no-pager -n 3

実行結果:

 4月 03 19:03:00 alma-main systemd[1]: Started User Manager for UID 1000.
 4月 03 19:03:00 alma-main systemd[1]: Started Session 35 of User developer.
 4月 03 19:03:00 alma-main sshd[21008]: pam_unix(sshd:session): session opened for user developer(uid=1000) by developer(uid=0)

-b は最後にサーバーを起動してからのログだけを表示します。再起動前のログを見たいときは -b -1(1つ前のブート)を指定します。

ジャーナルのディスク使用量を確認する

alma-mainで実行:

実行コマンド:

$ journalctl --disk-usage

実行結果:

Archived and active journals take up 8.8M in the file system.

ジャーナル自体もディスクを消費します。サイズが大きくなりすぎた場合は journalctl –vacuum-size=100M のように上限を指定して古いジャーナルを削除できます。

補足: journalctl -o json-pretty のように出力形式を変更することもできます。JSON形式で出力すると、ログの構造化データ(ユニット名、PID、優先度など)をプログラムから扱いやすい形で取得できます。今は「こういう出力もできる」と知っておくだけで十分です。

journalctl のオプションは多数あります。man journalctl で全オプションを確認できるので、必要になったときに調べてみてください。

/var/log のファイルを確認する

journalctl はバイナリのジャーナルを読み取るコマンドでした。一方、/var/log/ 以下にはテキスト形式のログファイルが保存されています。こちらは grep や tail などのテキスト処理コマンド(第8回で学習済み)で直接読めます。

主要なログファイル

まず、主要なログファイルのサイズと更新日時を確認します。

alma-mainで実行:

実行コマンド:

$ ls -lh /var/log/messages /var/log/secure /var/log/cron

実行結果:

-rw-------. 1 root root 3.9K  4月  2 21:01 /var/log/cron
-rw-------. 1 root root 751K  4月  3 19:03 /var/log/messages
-rw-------. 1 root root  68K  4月  3 19:03 /var/log/secure

3つのファイルの役割は以下の通りです。

  • /var/log/messages — 一般的なシステムログ。カーネルメッセージ、サービスの起動・停止、ネットワーク関連など、幅広い情報が記録される。障害調査で最初に確認するファイル
  • /var/log/secure — 認証関連のログ。SSH接続の成功・失敗、sudo の実行記録などが記録される。不正アクセスの調査に使う
  • /var/log/cron — cron ジョブの実行記録。定期実行タスクが正常に動作したかを確認する(第24回で詳しく扱う)

パーミッションが -rw——- なので、一般ユーザーでは読めません。sudo を付けて確認します。

alma-mainで実行:

実行コマンド:

$ sudo tail -5 /var/log/messages

実行結果:

Apr  3 19:02:51 alma-main NetworkManager[777]: <info>  [1775210571.5806] device (eth2): carrier: link connected
Apr  3 19:02:51 alma-main dnf[20987]: Extra Packages for Enterprise Linux 9 - x86_64   13 kB/s |  11 kB     00:00
Apr  3 19:02:55 alma-main systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr  3 19:02:55 alma-main dnf[20987]: Extra Packages for Enterprise Linux 9 - x86_64  5.2 MB/s |  20 MB     00:03
Apr  3 19:02:59 alma-main dnf[20987]: Extra Packages for Enterprise Linux 9 openh264  2.0 kB/s | 993  B     00:00

各行の形式は「日時 ホスト名 プログラム名[PID]: メッセージ」です。journalctl の出力と比べてみると、同じ内容がテキスト形式で記録されていることがわかります。

alma-mainで実行:

実行コマンド:

$ sudo tail -3 /var/log/secure

実行結果:

Apr  2 20:52:19 alma-main sshd[20943]: Disconnected from user developer 192.168.1.100 port 61292
Apr  2 20:52:19 alma-main sshd[20940]: pam_unix(sshd:session): session closed for user developer
Apr  3 19:03:00 alma-main sshd[21008]: Accepted publickey for developer from 192.168.1.100 port 63617 ssh2: ED25519 SHA256:W2DBHTgDj1dxfL1A8U9rxnmhPn9hN6Ru5sAbR9Ydgcc

SSH接続の記録が secure に記録されています。不正なログイン試行があった場合も、このファイルに「Failed password」のようなメッセージが残ります。

rsyslog.conf のルールを読み解く

「どのログがどのファイルに書かれるか」を決めているのが rsyslog の設定ファイルです。ルール部分を確認します。

rsyslog.conf のルール部分(コメント行を除いた抜粋):

*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
local7.*                                                /var/log/boot.log

各行の読み方は「facility.priority → 出力先」です。

  • *.info;mail.none;authpriv.none;cron.none → /var/log/messages — すべての facility の info レベル以上を messages に記録する。ただし mail、authpriv、cron は除外(それぞれ専用ファイルがあるため)
  • authpriv.* → /var/log/secure — 認証関連(authpriv)のすべてのレベルを secure に記録する
  • mail.* → -/var/log/maillog — メール関連を maillog に記録する。先頭の – は非同期書き込み(パフォーマンス優先)を意味する
  • cron.* → /var/log/cron — cron 関連を cron ファイルに記録する
  • *.emerg → :omusrmsg:* — emerg(最も緊急)レベルのログをログインしている全ユーザーの端末に通知する
  • local7.* → /var/log/boot.log — 起動時のログを boot.log に記録する

facility(発生源)と priority(優先度)の組み合わせで振り分け先が決まるという仕組みです。新しいアプリケーションのログを別ファイルに分けたい場合は、このルールを追加します。

補足: rsyslog.conf の先頭部分には module() や input() のような新しい記法(RainerScript形式)で書かれたセクションがあります。今はルール部分の旧形式(facility.priority → ファイル)が読めれば十分です。

詳しい記法は man rsyslog.conf で確認できます。

/var/log の容量を確認する習慣

ログファイルは放置すると大きくなり続けます。定期的に容量を確認する習慣を付けておくと、ディスク枯渇を未然に防げます。

alma-mainで実行:

実行コマンド:

$ sudo du -sh /var/log/* | sort -rh | head -5

実行結果:

5.6M	/var/log/anaconda
1.1M	/var/log/audit
756K	/var/log/messages
128K	/var/log/secure
48K	/var/log/dnf.log

現在はまだ小さいですが、本番環境ではアクセスログやアプリケーションログが数GBに達することもあります。第6回で学んだ du コマンドと 第8回で学んだ sort コマンドのパイプの組み合わせです。

logger コマンドでテストログを送信する

logger は syslog にテストメッセージを送信するコマンドです。rsyslog の設定を変更した後に「ログが正しく記録されるか」を確認するのに使います。

alma-mainで実行:

実行コマンド:

$ logger -t test-log 'Hello from alma-main'

-t オプションでタグ(プログラム名に相当する識別子)を指定しています。このメッセージが journalctl と /var/log/messages の両方に記録されることを確認します。

alma-mainで実行:

実行コマンド:

$ journalctl -t test-log --no-pager -n 1

実行結果:

 4月 03 19:03:00 alma-main test-log[21057]: Hello from alma-main

journalctl 側に記録されています。次に /var/log/messages を確認します。

alma-mainで実行:

実行コマンド:

$ sudo grep 'test-log' /var/log/messages | tail -1

実行結果:

Apr  3 19:03:00 alma-main test-log[21057]: Hello from alma-main

/var/log/messages にも同じ内容が記録されています。これが「journald が収集し、rsyslog がテキストファイルに書き出す」という二重構造の実体です。PIDは環境によって異なります。

リモートsyslog転送(alma-main → alma-sub)

ここまではサーバー1台の中でのログ管理でした。本番環境では、複数のサーバーのログを1か所に集約する運用が一般的です。サーバーが障害でダウンした場合、そのサーバー上のログも参照できなくなる可能性があります。ログを別のサーバーに転送しておけば、障害時にも調査が可能です。

ここでは rsyslog の TCP 転送機能を使い、alma-main のログを alma-sub に転送する設定を行います。

リモートsyslog転送の構成図。alma-mainのrsyslogがremote.conf(omfwd)の設定でTCP 514経由でログを転送し、alma-subのrsyslogがlisten.conf(imtcp)で受信して/var/log/messagesに記録する。alma-sub側ではfirewalldで514/tcpを許可する必要がある

手順1: alma-sub で firewalld の 514/tcp を許可する

まず alma-sub 側で rsyslog の待ち受けポート 514/tcp を許可します。第20回で学んだ firewall-cmd の実践復習です。

alma-subで実行:

実行コマンド:

$ sudo firewall-cmd --add-port=514/tcp

実行結果:

success

ランタイム設定に追加されました。動作確認が取れた後に永続化します。

alma-subで実行:

実行コマンド:

$ sudo firewall-cmd --runtime-to-permanent

実行結果:

success

永続化されました。確認します。

alma-subで実行:

実行コマンド:

$ sudo firewall-cmd --list-ports

実行結果:

514/tcp

手順2: alma-sub で rsyslog の TCP 受信を有効化する

rsyslog に TCP 514 番ポートで受信する設定を追加します。メインの rsyslog.conf は変更せず、/etc/rsyslog.d/ ディレクトリに設定ファイルを追加する方法を使います。

alma-subで実行:

実行コマンド:

$ echo 'module(load="imtcp")' | sudo tee /etc/rsyslog.d/listen.conf

実行結果:

module(load="imtcp")

alma-subで実行:

実行コマンド:

$ echo 'input(type="imtcp" port="514")' | sudo tee -a /etc/rsyslog.d/listen.conf

実行結果:

input(type="imtcp" port="514")

1行目の module(load=”imtcp”) で TCP 入力モジュールをロードし、2行目の input() でポート 514 で待ち受ける設定を追加しました。tee -a の -a は追記モードです(第8回のリダイレクト >> と同じ意味)。rsyslog を再起動して設定を反映します。

alma-subで実行:

実行コマンド:

$ sudo systemctl restart rsyslog

ポート 514 が LISTEN 状態になっているか確認します。

alma-subで実行:

実行コマンド:

$ ss -tlnp | grep 514

実行結果:

LISTEN 0      25           0.0.0.0:514       0.0.0.0:*
LISTEN 0      25              [::]:514          [::]:*

IPv4 と IPv6 の両方でポート 514 が LISTEN になっています。第12回で学んだ ss コマンドの活用です。

手順3: alma-main で転送設定を追加する

次に送信側の alma-main に、ログを alma-sub(10.0.1.3)へ TCP で転送する設定を追加します。

alma-mainで実行:

実行コマンド:

$ echo 'action(type="omfwd" Target="10.0.1.3" Port="514" Protocol="tcp")' | sudo tee /etc/rsyslog.d/remote.conf

実行結果:

action(type="omfwd" Target="10.0.1.3" Port="514" Protocol="tcp")

omfwd は「output module forward」の略で、ログを別のサーバーに転送するモジュールです。rsyslog を再起動します。

alma-mainで実行:

実行コマンド:

$ sudo systemctl restart rsyslog

TCP接続が確立されているか確認します。

alma-mainで実行:

実行コマンド:

$ ss -tnp | grep 514

実行結果:

ESTAB 0      0           10.0.1.1:51808      10.0.1.3:514

ESTAB(Established = 接続確立済み)が表示されました。alma-main(10.0.1.1)から alma-sub(10.0.1.3)のポート 514 に TCP 接続が確立されています。送信元ポート(51808)は環境によって異なります。

手順4: テストログで転送を確認する

alma-main から logger でテストメッセージを送信し、alma-sub に届くか確認します。

alma-mainで実行:

実行コマンド:

$ logger -t remote-test 'Hello from alma-main to alma-sub'

alma-subで実行:

実行コマンド:

$ sudo grep 'remote-test' /var/log/messages | tail -1

実行結果:

Apr  3 19:03:16 alma-main remote-test[21119]: Hello from alma-main to alma-sub

alma-sub の /var/log/messages に alma-main のログが記録されました。ホスト名が「alma-main」のまま転送されている点に注目してください。複数のサーバーからログを集約しても、どのサーバーのログかを識別できます。PIDは環境によって異なります。

ヒヤリハット: firewalld で 514/tcp を開け忘れる

受信側の firewalld で 514/tcp を許可し忘れると、送信側の rsyslog が接続を試みても「No route to host」のエラーになります。ログ転送が動かないとき、最初に確認すべきは firewalld のポート開放です。第20回で学んだ firewall-cmd --list-ports で開放済みのポートを確認してください。ネットワーク系の問題は、アプリケーション設定の前にまず firewalld を疑うのが切り分けの基本です。

logrotate

ここまでで、ログの収集(journald)、振り分け(rsyslog)、転送を学びました。最後に、ログファイルのローテーション(古いログの圧縮・削除)を管理する logrotate を見ていきます。

なぜローテーションが必要か

/var/log/messages のようなテキストファイルは、放置するとサーバーが稼働し続ける限り大きくなり続けます。本番環境で数か月〜数年運用したサーバーでは、ログファイルが数GBに達することもあります。/var パーティションがいっぱいになると、rsyslog がログを書き込めなくなるだけでなく、他のサービスも動作不良を起こす可能性があります。

logrotate は、指定した周期でログファイルを「ローテーション」します。現在の messages を messages-20260403 のようにリネームし、新しい空の messages ファイルを作成します。古いファイルは圧縮され、一定の世代数を超えると自動的に削除されます。

/etc/logrotate.conf の読み方

logrotate のメイン設定ファイルを確認します。

/etc/logrotate.conf の主要な設定値:

weekly          # 週次ローテーション
rotate 4        # 4世代保持(4週間分)
create          # ローテーション後に新しい空ファイルを作成
dateext         # ローテーション後のファイル名に日付サフィックスを付ける
  • weekly — 週に1回ローテーションを実行する(daily、monthly も指定可能)
  • rotate 4 — 古いログを4世代分保持する。5世代目以降は自動的に削除される
  • create — ローテーション後に新しい空のログファイルを作成する。これがないと rsyslog がログの書き込み先を失う
  • dateext — ローテーション後のファイル名に日付を付ける(例: messages-20260403)

/etc/logrotate.d/rsyslog の読み方

個別のアプリケーション用設定は /etc/logrotate.d/ ディレクトリに配置されます。rsyslog 用の設定を確認します。

/etc/logrotate.d/rsyslog の内容:

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
    endscript
}
  • 先頭のパス群 — ローテーション対象のファイル一覧
  • missingok — 対象ファイルが存在しなくてもエラーにしない
  • sharedscripts — postrotate スクリプトを全ファイルのローテーション後に1回だけ実行する
  • postrotate … endscript — ローテーション後に実行するコマンド。rsyslog に HUP シグナルを送り、新しいログファイルへの書き込みを開始させる

postrotate が重要です。ログファイルをリネームしただけでは、rsyslog は古いファイル(リネーム後のファイル)に書き込み続けてしまいます。HUP シグナルで rsyslog にファイルの再オープンを促すことで、新しいファイルに書き込みが切り替わります。

logrotate 自体は単独では動作しません。定期的に実行される仕組み(cron や systemd timer)によって呼び出されます。この定期実行の仕組みは次回の第24回「cron / systemd timer」で詳しく学びます。

ヒヤリハット: logrotate が止まっていてディスクフル

あるサーバーで /var パーティションの使用率が 100% になり、アプリケーションが書き込みエラーで停止した事例があります。調査すると、logrotate の定期実行が何らかの理由で停止しており、/var/log/messages が数GBに膨れ上がっていました。logrotate が正常に動作していることを前提にせず、定期的に df -h で /var の使用率を確認することが重要です。第6回で学んだ df コマンドが、ここでも役立ちます。

logrotate のオプションや設定項目の一覧は man logrotate で確認できます。

やってみよう

以下の2つの課題に取り組んでください。alma-sub が起動していることを確認してから始めてください。

課題1: journalctl で sshd のエラーログを絞り込む

alma-mainで実行してください。journalctl のオプションを組み合わせて、sshd ユニットの err レベル以上のログを今日の分だけ表示してください。

ヒント: -u、-p、–since の3つのオプションを組み合わせます。

解答例:

$ journalctl -u sshd -p err --since today --no-pager

該当するエラーがなければ「No entries」と表示されます。それは sshd が正常に動作していることを意味するので、問題ありません。

課題2: リモートsyslog転送を自分で設定する

クリーンアップ済み(転送設定が削除された状態)から、以下の手順をすべて自分で実行してください。

  • alma-sub で firewalld の 514/tcp を許可する
  • alma-sub で rsyslog の TCP 受信設定を追加して再起動する
  • alma-main で転送設定を追加して再起動する
  • alma-main から logger でメッセージを送信し、alma-sub の /var/log/messages に届くことを確認する

ヒント: 本文の「リモートsyslog転送」セクションの手順1〜4をもう一度たどってください。詰まった場合は、ss コマンドで 514 ポートの状態を確認することが切り分けの第一歩です。

クリーンアップ

演習で追加した設定を元に戻します。

alma-mainで実行:

実行コマンド:

$ sudo rm /etc/rsyslog.d/remote.conf

実行コマンド:

$ sudo systemctl restart rsyslog

転送が停止したことを確認します。

実行コマンド:

$ ss -tnp | grep 514

出力がなければ、転送接続が切断されています。

alma-subで実行:

実行コマンド:

$ sudo rm /etc/rsyslog.d/listen.conf

実行コマンド:

$ sudo systemctl restart rsyslog

実行コマンド:

$ sudo firewall-cmd --permanent --remove-port=514/tcp

実行結果:

success

実行コマンド:

$ sudo firewall-cmd --reload

実行結果:

success

最終確認として、ポートが閉じられたこととrsyslogが受信を停止したことを確認します。

alma-subで実行:

実行コマンド:

$ sudo firewall-cmd --list-ports

出力がなければ、514/tcp が削除されています。

実行コマンド:

$ ss -tlnp | grep 514

出力がなければ、rsyslog の TCP 受信も停止しています。

まとめ

  • Linux のログは journald(収集)→ rsyslog(振り分け)→ テキストファイルの二重構造 — journalctl でバイナリジャーナルを閲覧し、/var/log/ のテキストファイルは grep や tail で読める。同じログが両方に存在する
  • rsyslog はリモート転送で複数サーバーのログを集約できる — 障害でサーバーがダウンしてもログを別サーバーで確認できる。firewalld のポート開放を忘れずに
  • logrotate はログの無限増大を防ぐ仕組み — 定期的にログをローテーション(リネーム・圧縮・削除)して、ディスク容量の枯渇を防ぐ。定期実行の仕組みは次回学ぶ

今回はログの「確認方法」と「管理の仕組み」を学びました。次のステップとして重要なのは、障害が起きてからログを見るだけでなく、日常的にログを監視してエラーの兆候を早期に発見する体制を作ることです。この「監視」の考え方は第32回「監視入門」で詳しく学びます。

次回の第24回「cron / systemd timer」では、今回登場した logrotate が「誰に呼び出されて定期実行されているのか」という疑問に答えます。cron と systemd timer を使った定期実行の設定方法を学びます。

理解度チェック

以下の文が正しければ「○」、誤りなら「×」と答えてください。

Q1. systemd-journald が収集したログは、rsyslog が読み取ってテキストファイル(/var/log/messages 等)に書き出している。

Q2. journalctl -p warning を実行すると、warning レベルのログだけが表示され、err や crit レベルのログは表示されない。

Q3. rsyslog.conf のルール「authpriv.* /var/log/secure」は、認証関連のすべての優先度のログを /var/log/secure に記録する設定である。

Q4. logger コマンドで送信したテストメッセージは、journalctl でのみ確認でき、/var/log/messages には記録されない。

Q5. rsyslog のリモート転送を設定する際、受信側の firewalld でポートを許可しなくてもログは転送される。

Q6. logrotate の postrotate セクションで rsyslog に HUP シグナルを送るのは、rsyslog に新しいログファイルへの書き込みを開始させるためである。

Q7. logrotate はデーモンとして常駐し、設定された周期で自動的にローテーションを実行する。

以下、解答です。

Q1. ○ — rsyslog は imjournal モジュール経由で journald からログを読み取り、facility.priority のルールに基づいてテキストファイルに振り分けます。

Q2. × — -p は指定した優先度「以上」のログを表示します。-p warning なら warning、err、crit、alert、emerg のすべてが表示されます。

Q3. ○ — authpriv.* の「*」はすべての優先度を意味します。認証関連のログが debug から emerg まですべて /var/log/secure に記録されます。

Q4. × — logger で送信したメッセージは journald と rsyslog の両方に記録されます。journalctl でも /var/log/messages でも確認できます。

Q5. × — 受信側の firewalld で該当ポート(例: 514/tcp)を許可しないと、送信側からの接続がブロックされてログは転送されません。

Q6. ○ — ログファイルをリネームしただけでは rsyslog は古いファイルに書き込み続けます。HUP シグナルでファイルの再オープンを促し、新しいファイルへの書き込みに切り替えます。

Q7. × — logrotate はデーモンではなく、cron や systemd timer によって定期的に呼び出されるコマンドです。定期実行の仕組みは第24回で学びます。

シリーズ一覧

フェーズ1: エンジニアのいろは(第1回〜第3回)

フェーズ2: Linux基礎(第4回〜第15回)

フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)

フェーズ4: サーバー構築と運用(第28回〜第36回)