🐮

【RHEL9.4/rsyslog】初心者のSyslogサーバ構築学習記録

に公開

どうも!新人エンジニアの前歯すきっ歯です🦷
Syslogサーバを初めて学ぶ初心者向けに、つまずきにくいように順を追って解説します。
有識者の方は、目次から興味ある箇所にジャンプしてください!

⚙️ 0.本記事について

⚙️ 0-1.本記事の目標

本記事では以下4点を目標として頑張っていきます💪

  1. Syslog送信元(SyslogSource)でのログ送信設定
  2. Syslog受信サーバ(Syslog)での受信設定
  3. 受信ログの転送設定(SyslogTransferへの転送)
  4. ログローテーション設定

⚙️ 0-2.前提

以下2点を本記事の前提とします。

  • 全体構成図は以下画像です。
  • 詳細 ※全EC2共通で以下設定
    ・AWS EC2:t2.micro/ディスク8GiB/RHEL9.4
    ・セキュリティグループ:UDP/TCP 514ポートを送信元サーバのIPアドレスで許可。
     ※セキュリティグループで通信を管理するためOSのFirewallは使用していません。
    ・rsyslog:8.2412.0-1.el9 (aka 2024.12)
    ・SELinux無効化済み
     ※SELinuxが無効化されていないとログローテーションが上手く回らない可能性有。

⚙️ 0-3.本記事の大まかな流れ

本記事の大まかな流れは以下の通りです。

  1. Syslogサーバの目的と構造を知る。
  2. rsyslogのデフォルト設定を理解する
  3. 実践(1)~SyslogSourceのログ出力設定~
  4. 実践(2)~rsyslogの設定~
  5. 実践(3)~ログローテーション~

🧭1.Syslogサーバの目的と構造を知る

🧭1-1.Syslogサーバの構築目的を知る

この業界に入ったころは「なんでログなんか貯めるんよ笑」と思っていました…。

  • Syslogサーバ構築の目的
    ①ログの集中管理
    各サーバやネットワーク機器から発生するログを一か所に集約し、効率的に管理・確認できるようにするため
    ②ベースライン(正常動作時)データの蓄積と異常検知
    システムが正常時に出力するログを記録しておくことで、異常発生時に比較・検知しやすくなるため。
    ③監査・フォレンジック対応基盤の整備
    セキュリティ監査やインシデント対応時に、ログ履歴を蓄積して法的証拠や解析資料として使用できるようにするため 。

  • Syslogサーバの用途
    ①リアルタイム監視と障害検知
    稼働中のシステムのログを監視し、障害やエラー、異常状態が発生した際に即座に検知・アラート化する
    ②原因調査と障害対応(トラブルシュート)
    ネットワーク障害やアプリケーションの停止時など、ログを横断的に参照することで原因を特定・切り分けやすくする 。
    ③セキュリティ監査/不正アクセス検知
    ログイン試行や認証エラー、不正アクセスの痕跡を監視・分析し、セキュリティインシデント検知や証跡保全に活用する 。

🔗参考リンク:Syslogとは?初心者でもわかる基本構造とログ管理の最適手法! ※3章[syslogの主な用途と目的]参照

🧭1-2.rsyslogのモジュールとは?

  • モジュールとは「rsyslog の機能を追加する部品」
    ・rsyslogをゲーム機(スイッチ等)だとすると、モジュールはゲーム機のカセットのイメージです。rsyslogの設定ファイルでどの機能(=モジュール)を使うか記述して、使う機能(=モジュール)を組み込まないと動けません。
    ・使うモジュールを必要に応じて読み込む(=設定ファイルで選択する)ことで、入力(Syslogサーバ内部/外部からのログ受信)や出力(Syslogサーバ内部ファイル書き込み、外部サーバへの転送)などの機能を動的に拡張できます。

  • 主要モジュール
    以下のモジュールは設定例で頻出します。まずは役割だけ押さえましょう!
    ========================================
    imuxsock/imjournal: Syslogサーバ内部のログ(journaldなど)を取り込むモジュール
    imudp/imtcp: Syslogサーバの外部からUDP/TCPログ受信するモジュール
    omfile: Syslogサーバ内部のファイルへ出力モジュール
    omfwd: Syslogサーバ外部へ転送するモジュール
     ※im(Input Module)/om (Output Module)の略
    ========================================
    ▽rsyslog外部との連携構造

    画像緑の枠がSyslogサーバ内部。Journald datebaseはSyslogサーバ自身のログを出す場所

🔗参考リンク:【図解/CentOS】rsyslogの仕組みと.confの設定例 ※冒頭[rsyslogの仕組み]参照

🧭1-3.rsyslogの内部的なフローを理解する

rsyslogの内部的なフローは以下の通りです!メッセージフローとキューの仕組みを知ると、設定ファイル内の項目が何を意味しているか後々分かりやすいと思います。

  1. input:入力モジュール。外部からキューを受け取る。
    ・[1-2]で出たモジュール(imudp/imtcpなど)で受け取る。
    ・サーバ自身が出したログを受け取る。
  2. parser&Filter Engine:ログのファシリティやプライオリティ条件を判断して、出力処理をするキューへ渡す。
  3. Action Queue:ログ出力先へ送る前段の経路
    ・TCPの場合は、ログが送れなかったときに再送する役割等を担う。
  4. Output:出力モジュール。ログを出力する。
    ・[1-2]で出たモジュール(omfile/omfwdなど)で指定の場所(Syslogサーバ内部のファイルや外部サーバ)へログを送信する。

▼rsyslogの内部構造

🔗動画リンク:Rsyslog message flow (video Tutorial) ※rsyslog開発者Rainer Gerhards氏です。

🧭1-4.ryslogの構造まとめ

読者の方はイメージが湧いていると思いますが、念のために[1-2.rsyslogの内部構造]と[1-3.rsyslog外部との連携構造]をまとめてみました!

もう少しLinux以外にも話を拡張すると以下の図になりそうですね!

Rsyslog でログデータを収集、処理、送信する方法

📝 2.rsyslogのデフォルト設定を理解する

2章では以下2点を理解しましょう!
①デフォルト設定ファイルの内容が1章で理解したrsyslog構造のどの部分が該当するのか
②デフォルト設定ファイル記載の内容

📝 2-1.RHEL9 設定ファイル解説① ~全体概要~

この段階で全てを理解することは難しいと思うので、コメントアウトの解説を読み「ふ~ん、RHEL9ではこんな雰囲気の記載でこんな設定をするのね」くらいに概要を掴めればOKかと思います! [2-2]以降で詳細をお伝えするので、2章を全て読み終えた後に再度読み、内容が腑に落ちればOKです◎ ※日本語記載は筆者の追記です。

/etc/rsyslog.conf 全内容
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### GLOBAL DIRECTIVES ####

# syslog が内部で使用する一時ファイルや状態ファイル(state files)などの保存場所を使用。
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# デフォルトのタイムスタンプ形式を使用。(例)`May 29 13:45:00`
# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

#### MODULES ####

# ローカルシステム(旧来のunix socket file経由(systemd))のログを受信する
# Load module to provide support for local system logging (via syslog socket)
module(load="imuxsock"    # provides support for local system logging (e.g. via
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.

# ローカルシステム(現行のjournald経由)のログを受信する
# Load module to provide access to the systemd journal
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
# カーネルメッセージを読み取る
#module(load="imklog") # reads kernel messages (the same are read from journald)
# --MARK--メッセージ機能を提供する
#module(load="immark") # provides --MARK-- message capability

# /etc/rsyslog.d/内のすべての設定ファイル内容をこの位置に挿入する。
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# UDPプロトコルを使用してsyslogメッセージを受信する。
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")

# TCPプロトコルを使用してsyslogメッセージを受信する。
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

#### RULES ####

# カーネルからの全てのログをコンソール(=/dev/console)に出力する。
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# メール、認証,cronを除くプライオリティinfo以上の全てのログを/var/log/messagesに出力する。
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none		/var/log/messages

# 認証(sshdやsudoコマンド)に関する全てのログを/var/log/secureに出力する。
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# メールに関する全てのログを非同期で(=`-`)/var/log/maillogに出力する。
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# cronに関する全てのログを/var/log/cronに出力する。
# Log cron stuff
cron.*                                                  /var/log/cron

# システム停止時のエラーはすべてのユーザーに送信されます。
# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# ニュースサービスとUUCP転送を行うプログラムのプライオリティcrit以上のメッセージを
# /var/log/spoolerに出力する。
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# ファシリティlocal7(=ブートメッセージ)をboot.logに出力する。
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# ### sample forwarding rule ###
# action(type="omfwd"
# リモートホストがダウンしたとき、メッセージをディスクに保存し、ホストが復旧した際に転送する設定。
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
# 転送先サーバが停止しているとき、キューファイル名を指定する。ディレクトリはWorkDirectoryを使用する。
#queue.filename="fwdRule1"       # unique name prefix for spool files
# 転送先サーバが停止しているとき、ディスクベースのキューが使用する最大ディスク容量を指定する。
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
# 転送先サーバが停止しているとき、rsyslogがシャットダウンする際にメモリ内のキュー内容をディスクに保存する。
#queue.saveonshutdown="on"       # save messages to disk on shutdown
# 転送先サーバが停止しているとき、キューは非同期的な処理をする。(ディスクではなくメモリへのバッファリングを試みる)
#queue.type="LinkedList"         # run asynchronously
# 転送先サーバが停止しているとき、アクションが失敗した場合の再試行回数を指定する。-1は無限回の再試行。
#action.resumeRetryCount="-1"    # infinite retries if host is down
#ターゲットホスト名またはIPアドレス(例:192.168.0.1)およびポート番号(例:10514)を指定します。
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

ざっと、各範囲ごとの役割と補足を[2-2]以降にまとめておきます。

📝 2-2.RHEL9 設定ファイル解説② ~GLOBAL DIRECTIVES~

前提として、2章で記載するrsyslog.conf設定は全てデフォルト設定なのでお含みおきください!
GLOBAL DIRECTIVESrsyslogが動作する上で前提となるような根本的設定を書く部分です。
rsyslogが内部的に使用するファイルや出力するタイムスタンプの形式が記載されています。

/etc/rsyslog.conf #### GLOBAL DIRECTIVES ####
/etc/rsyslog.conf
#### GLOBAL DIRECTIVES ####

# syslog が内部で使用する一時ファイルや状態ファイル(state files)などの保存場所を使用。
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# デフォルトのタイムスタンプ形式を使用。(例)`May 29 13:45:00`
# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

📝 2-2-1.workDirectoryについて

global(workDirectory="/var/lib/rsyslog") は、rsyslog が内部で使用する一時ファイルや
状態ファイル(state files)などの保存場所を指定
しています。

  • 🔎具体例--------------------------
    imfile(ファイルからログを読み込むモジュール)を使っている場合、
    どの行まで読んだかを記録する 状態ファイル(/var/lib/rsyslog/imfile-state:var-log-custom.log) は workDirectory に保存されます。rsyslog は再起動後もログ読み取りを中断した位置から再開できるようになります。

    workDirectory は、rsyslog が作業ファイル(例:imfile の状態ファイルやキュースプールファイル)を使用するためのディレクトリを設定します。(🔗参考リンク:https://www.rsyslog.com/doc/rainerscript/global.html)

    StateFile は、rsyslog がファイル内の現在の読み取り位置を記録するファイルを作成します。このファイルは常に rsyslog の作業ディレクトリ(WorkDirectory で設定可能)に作成されます。このファイルがあることで、rsyslog は再起動時にファイルの先頭からではなく、前回の続きからメッセージを取得することができます。(🔗参考リンク:https://www.rsyslog.com/using-the-text-file-input-module/)

    rsyslogd がテキストファイルを監視中に停止した場合、最後に処理した位置を記録し、再起動時にそこから処理を再開します。(🔗参考リンク:https://www.rsyslog.com/doc/configuration/modules/imfile.html)

📝 2-2-2.timestamp formatについて

module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")RFC 3164というタイムゾーンや年情報が含まれない旧式のタイムスタンプ表示形式です。(例)May 29 13:45:00
年やタイムゾーンがないのでログの時系列が曖昧になりやすく、現在はあまり使われていないタイムスタンプのようです。タイムスタンプの形式はTemplate="RSYSLOG_TraditionalFileFormat"というrsyslogに予約された形式として指定されています。

🔗参考リンク:予約済みテンプレート名

以下、2点timestamp formatについて補足します。

  • (1)builtin:が書かれれている理由は組み込みモジュールだから
    rsyslogで組み込みモジュール(=自分で指定してロード不要のモジュール)を利用する際はbuiltin:の指定が必要です。

    Omfileはロードする必要のない組み込みモジュールです。モジュールパラメータを指定するには、module(load="builtin:omfile" ...parameters...)(🔗参考リンク:https://www.rsyslog.com/doc/configuration/modules/omfile.html#configuration-parameters)

    他の多くのモジュールとは異なり、omfwdは組み込みモジュールです。そのため、「通常」は名前だけでロードすることはできず、上記のように「builtin:」をプレフィックスとして付ける必要があります。(🔗参考リンク:https://www.rsyslog.com/doc/configuration/modules/omfwd.html#purpose)

  • (2)精緻なタイムスタンプにはRSYSLOG_ForwardFormatの指定をする
    設定ファイル内で以下記載をするとタイムスタンプにタイムゾーンや年情報が含まれます。(例)2018-10-10T10:37:53.063083+09:00

    タイムスタンプの変更
    module(load="builtin:omfile" Template="RSYSLOG_FileFormat")
    

📝 2-3.RHEL9 設定ファイル解説② ~MODULES~

MODULESは[1-2.rsyslogのモジュールとは?]でお伝えした内容が反映される場所です。どんな種類のログ(=load/type)をどのポート(=type)で受け取るか受け取ったログを保存するファイル名の指定(=Template) をします。

/etc/rsyslog.conf #### MODULES ####
/etc/rsyslog.conf
#### MODULES ####

# ローカルシステム(旧来のunix socket file経由(systemd))のログを受信する
# Load module to provide support for local system logging (via syslog socket)
module(load="imuxsock"    # provides support for local system logging (e.g. via
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.

# ローカルシステム(現行のjournald経由)のログを受信する
# Load module to provide access to the systemd journal
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
# カーネルメッセージを読み取る
#module(load="imklog") # reads kernel messages (the same are read from journald)
# --MARK--メッセージ機能を提供する
#module(load="immark") # provides --MARK-- message capability

# /etc/rsyslog.d/内のすべての設定ファイル内容をこの位置に挿入する。
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# UDPプロトコルを使用してsyslogメッセージを受信する。
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")

# TCPプロトコルを使用してsyslogメッセージを受信する。
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

📝 2-3-1.type="imjournal"type="imudp"のrsyslog構造内該当部分

[1-4.ryslogの構造まとめ]でご紹介した以下画像の青色の部分が入力モジュールの該当する部分です!

📝 2-3-1.MODULESの範囲に記載のあるモジュールは動的モジュール

MODULESの部分に記載されているモジュールは、[2-2]でご紹介した組み込みモジュールではなく動的モジュールです。したがって、私たちが意図的にモジュールをインストールする(=設定を記載する)必要があります。

rsyslog 本体は、コア機能以外のすべての機能をモジュールとして提供しています。…(中略)…以下は、それらのモジュールのドキュメントおよび機能への入り口です…(中略)…また、モジュールの設定パラメーター(および機能)は、そのモジュールがロードされている場合にのみ有効であることを忘れないでください。…(中略)…読み込み可能なモジュールには、いくつかの種類があります:
出力モジュール(Output Modules)
入力モジュール(Input Modules)
(🔗参考リンク:https://www.rsyslog.com/doc/configuration/modules/index.html#modules)

上記入力モジュールの一部がimjournalimudpなので、設定ファイル内で動的に組み込む必要があります。また、組み込みモジュールではないのでbuiltin:の指定が不要です。

📝 2-3-3.各モジュールの解説

[1-2.rsyslogのモジュールとは?]でお伝えしたモジュールのみ使用するので、他モジュールの解説は割愛しますが、以下リンク内に各モジュールの動きの詳細や指定可能なオプションの記載があります。詳細が気になる方はご覧ください!

🔗参考リンク:https://www.rsyslog.com/doc/configuration/modules/idx_input.html

📝 2-3-4.include()の使われ方

include()fileオプションに指定したファイル内の設定をinclude()と置換して挿入します。
デフォルトの書き方だと/etc/rsyslog.d/配下にある~.confという名前のファイル内の設定をinclude()と置換して挿入します。検証環境、開発環境等で明確な違いがある時に設定ファイルを切り分けて保管するなどできそうですね!

rsyslog が include オブジェクトを見つけると、その include ファイルの内容を、指定された位置に正確に挿入し、include 文自体は削除されます。(🔗参考リンク:https://www.rsyslog.com/doc/rainerscript/include.html)

📝 2-4.RHEL9 設定ファイル解説② ~RULES~

この範囲がログのファシリティ・プライオリティ(左側記載)の条件に合わせ、どこに保管するか(右側記載)設定する部分です。
ファシリティ・プライオリティやnoneを使った条件除外等については、以下リンク先の[回答と解説]を参照してください!LinuC公式問題が*.info;mail.none;authpriv.none;cron.none; /var/log/messagesを例にして分かりやすく解説してくれています。

🔗参考リンク:https://linuc.org/study/samples/3218/

/etc/rsyslog.conf #### RULES ####
/etc/rsyslog.conf
#### RULES ####

# カーネルからの全てのログをコンソール(=/dev/console)に出力する。
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# メール、認証,cronを除くプライオリティinfo以上の全てのログを/var/log/messagesに出力する。
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none				/var/log/messages

# 認証(sshdやsudoコマンド)に関する全てのログを/var/log/secureに出力する。
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# メールに関する全てのログを非同期で(=`-`)/var/log/maillogに出力する。
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# cronに関する全てのログを/var/log/cronに出力する。
# Log cron stuff
cron.*                                                  /var/log/cron

# システム停止時のエラーはすべてのユーザーに送信されます。
# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# ニュースサービスとUUCP転送を行うプログラムのプライオリティcrit以上のメッセージを
# /var/log/spoolerに出力する。
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# ファシリティlocal7(=ブートメッセージ)をboot.logに出力する。
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

📝 2-4-1.分かりづらい用語解説

「ファシリティ・プライオリティがこの場所へ保管されるのね!」ではすまない分かりづらい用語が個人的にはいくつかあったので、皆さんも同様と信じて以下にまとめておきます。

用語 説明 参考リンク
- (/var/log/maillogの前) 非同期的にログが出力される。 - 参考リンク
:omusrmsg:* ログイン中ユーザのコンソールに通知を行う。 :omusrmsg:* 参考リンク
UUCP UNIX マシン間でニュースやメール等のデータ転送を行う。(今はあまり使われていない) UUCP 参考リンク
ニュースサービス(news) インターネット上でのニュースシステムを基盤にした、ユーザー間で情報や意見を交換するためのシステム。掲示板形式で様々なトピックに関するディスカッションが行われているネットワーク。 Usenetとは
ニュースシステムの仕組み

📝 2-5.RHEL9 設定ファイル解説③ ~sample forwarding rule~

この範囲はログの送信設定の例の記載です。全てコメントアウトされている通り、デフォルトで送信設定はありません。 5~9行目は送信時のオプションでなので、指定しなくても送信できるものです。

/etc/rsyslog.conf # ### sample forwarding rule ###
/etc/rsyslog.conf
# ### sample forwarding rule ###
# action(type="omfwd"
# リモートホストがダウンしたとき、メッセージをディスクに保存し、ホストが復旧した際に転送する設定。
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
# 転送先サーバが停止しているとき、キューファイル名を指定する。ディレクトリはWorkDirectoryを使用する。
#queue.filename="fwdRule1"       # unique name prefix for spool files
# 転送先サーバが停止しているとき、ディスクベースのキューが使用する最大ディスク容量を指定する。
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
# 転送先サーバが停止しているとき、rsyslogがシャットダウンする際にメモリ内のキュー内容をディスクに保存する。
#queue.saveonshutdown="on"       # save messages to disk on shutdown
# 転送先サーバが停止しているとき、キューは非同期的な処理をする。(ディスクではなくメモリへのバッファリングを試みる)
#queue.type="LinkedList"         # run asynchronously
# 転送先サーバが停止しているとき、アクションが失敗した場合の再試行回数を指定する。-1は無限回の再試行。
#action.resumeRetryCount="-1"    # infinite retries if host is down
#ターゲットホスト名またはIPアドレス(例:192.168.0.1)およびポート番号(例:10514)を指定します。
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

📝 2-5-1.type="omfile"type="omfwd"のrsyslog構造内該当部分

[1-4.ryslogの構造まとめ]でご紹介した以下画像の黄色の部分がモジュールの該当する部分です!

📝 2-5-2.オプションqueue.~のrsyslog構造内該当部分

[1-2]のActionQueueの部分が該当します! 今回の学習には必要はないので、後述する実践の部分では利用しません。

詳細が気になる方は以下リンクからご覧ください。

🔗参考リンク(queue一覧):https://www.rsyslog.com/doc/rainerscript/queue_parameters.html
🔗参考リンク(queueの利用例):https://www.rsyslog.com/tag/queues/

📝 2-5-3.Actionの使い方

Syslogサーバ内部でログ保管ファイル名を指定したり、Syslogサーバ外部へ送信設定を行ったりする場合は、RULESのファシリティやプライオリティと組み合わせてRULESの部分に記載します。 また、5~9行目は送信時のオプションでなので、指定しなくても送信できるものです。

頻出の2パターンの使い方を以下ご紹介します。

  • (1)ローカルサーバ内のファイルにログを出力する場合
    [2-5-1]のomfileに該当する部分です。Action記載例とオプションの意味は以下の通りです。

    Action記載例(ローカルサーバ内にログを出力する場合)
    #テンプレート名`receivelog`に従ってローカルサーバ内のファイル名と出力場所に
    #`*.info;mail.none;authpriv.none;cron.none`を出力する。
    *.info;mail.none;authpriv.none;cron.none   action(type="omfile" DynaFile="receivelog")
    
    オプション名 説明 参考リンク
    type どのモジュールを用いて(=どこに向かって)出力するか指定する。今回はomfileなので、ローカルのファイルに出力する。 type 参考リンク
    omfile 参考リンク
    Dynafile 動的にファイル名を指定するテンプレートを指定する。例えば、「/Syslog/[ログ送信元ホスト名]/[ログ送信元ホスト名].logとして保管する」と設定したテンプレートを指定するオプション。テンプレートはMODULESで記載します。また、テンプレートの書き方は4章で解説します。 omfile 参考リンク
  • (2)他サーバにログを送る場合
    [2-5-1]のomfwdに該当する部分です。Action記載例とオプションの意味は以下の通りです。

    Action記載例(ローカルサーバ内にログを出力する場合)
    #IPアドレスが`10.0.0.1`のサーバの514番ポートにUDPで
    #`*.info;mail.none;authpriv.none;cron.none`を送信する。
    *.info;mail.none;authpriv.none;cron.none   action(type="omfwd" Target="10.0.0.1" Port="514" Protocol="udp")
    
    オプション名 説明 参考リンク
    type どのモジュールを用いて(=どこに向かって)出力するか指定する。今回はomfwdなので、外部サーバの転送に該当する部分です。 omfwd 参考リンク
    Target メッセージを送信するシステムの名前またはIPアドレス。送信先のIPアドレスの10.0.0.1を選択します。 Target 参考リンク
    Port ターゲットへの接続時に使用するポートの名前または数値。今回は送信先サーバの514を指定します。 ※送信先でも合わせる必要有。 Port 参考リンク
    Protocol 転送に使用するプロトコルの種類。今回はUDPを使用します。 ※送信先でも合わせる必要有。 Protocol 参考リンク

🧠 【おまけ】rsyslog設定や作業の概要を掴む

設定ファイルの解説ばかり見ていてもどこか作業イメージが湧かなかった自分にとって良い資料たちだったのでご共有しますが、以下注意点をご了承の上ご覧ください!

🧠 おまけ1.rsyslog設定ファイル概要

以下のYoutube動画がrsyslogのインストール~設定ファイルの概要を解説しており、rsyslogライフ最初の一歩にもってこいでした!

🔗動画リンク:Rsyslog - Log Processing in Linux
※英語なので字幕などで翻訳してご覧ください。

🧠 おまけ2.ハンズオン動画

今回の実践する内容をざっと目を通して全体像のイメージを掴みたい方は以下動画をご覧ください!送信設定と受信設定がコンパクトにハンズオンで解説されています。

🔗動画リンク:Rsyslog - Log Processing in Linux
※英語なので字幕などで翻訳してご覧ください。

📤3.実践(1)~SyslogSourceのログ出力設定~

この章ではSyslogSourceがSyslogサーバへ送るlocal0.infoのログを1時間に1回定期的に出す設定を行います。

📤3-1.local0.infoのログ作成設定

今回3章の内容は本記事の本題ではないので詳細に解説はしませんが、
以下ログ作成設定記載の後に使用コマンドについて個人的に分かりやすかったリンクをご共有します。

local0.infoのログ作成設定
#1時間に1回local0.infoにてrsyslog-testというテキストのログを出す
#/etc/crontabを編集する。/etc/crontabが開くので@配下の内容を入れる。
$ crontab -e
  @@@@@@@@@@@@@@@
 0 */1 * * * logger -p local0.info rsyslog-test
 @@@@@@@@@@@@@@@

#編集完了すると「crontab: installing new crontab」と出力される。
$ crontab -e
crontab: installing new crontab

#1時間に1回ログが出ているか確認する。
$ sudo tail -f /var/log/messages
2025-05-29T08:00:01.440258+09:00 SyslogSource ec2-user[1647]: rsyslog-test

参考リンク(loggerコマンド):https://atmarkit.itmedia.co.jp/ait/articles/1904/26/news033.html
参考リンク(cron):https://qiita.com/yuzo_____/items/1b8af6e04ffa2baa1cab

🧑‍💻 4.実践(2)~rsyslogの設定~

🧑‍💻 4-1.rsyslogのインストール

ここで行うrsyslogのインストールは全サーバ共通の作業です。
特筆することはないので、コマンド等は全て以下にまとめておきます。

rsyslogインストール作業
#rsyslogdのバージョンを確認する。
# https://www.rsyslog.com/news-releases/で出ている最新バージョンとの齟齬がないか確認する。
#rsyslog -vはバージョンを確認するコマンド
$man rsyslogd
-v     Print version and exit.

$ rsyslogd -v
rsyslogd  8.2310.0-4.el9 (aka 2023.10) compiled with:
        PLATFORM:                               x86_64-redhat-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        systemd support:                        Yes
        Config file:                            /etc/rsyslog.conf
        PID file:                               /var/run/rsyslogd.pid
        Number of Bits in RainerScript integers: 64

See https://www.rsyslog.com for more information.


#今回はマイナーバージョンが最新バージョンと異なる状態だったので、rsyslogの再インストールを行う。
$ sudo yum install rsyslog -y
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use "rhc" or "subscription-manager" to register.

Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)                                      57 kB/s | 4.5 kB     00:00
Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)                                      63 MB/s |  60 MB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)                                         60 kB/s | 4.1 kB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)                                         72 MB/s |  59 MB     00:00
Red Hat Enterprise Linux 9 Client Configuration                                                         26 kB/s | 1.5 kB     00:00
Package rsyslog-8.2310.0-4.el9.x86_64 is already installed.
Dependencies resolved.
=======================================================================================================================================
 Package                          Architecture          Version                        Repository                                 Size
=======================================================================================================================================
Upgrading:
 rsyslog                          x86_64                8.2412.0-1.el9                 rhel-9-appstream-rhui-rpms                821 k
 rsyslog-logrotate                x86_64                8.2412.0-1.el9                 rhel-9-appstream-rhui-rpms                 11 k

Transaction Summary
=======================================================================================================================================
Upgrade  2 Packages

Total download size: 832 k
Downloading Packages:
(1/2): rsyslog-logrotate-8.2412.0-1.el9.x86_64.rpm                                                     254 kB/s |  11 kB     00:00
(2/2): rsyslog-8.2412.0-1.el9.x86_64.rpm                                                                13 MB/s | 821 kB     00:00
---------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                  8.8 MB/s | 832 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                               1/1
  Upgrading        : rsyslog-8.2412.0-1.el9.x86_64                                                                                 1/4
  Running scriptlet: rsyslog-8.2412.0-1.el9.x86_64                                                                                 1/4
  Upgrading        : rsyslog-logrotate-8.2412.0-1.el9.x86_64                                                                       2/4
  Cleanup          : rsyslog-logrotate-8.2310.0-4.el9.x86_64                                                                       3/4
  Running scriptlet: rsyslog-8.2310.0-4.el9.x86_64                                                                                 4/4
  Cleanup          : rsyslog-8.2310.0-4.el9.x86_64                                                                                 4/4
  Running scriptlet: rsyslog-8.2310.0-4.el9.x86_64                                                                                 4/4
  Verifying        : rsyslog-logrotate-8.2412.0-1.el9.x86_64                                                                       1/4
  Verifying        : rsyslog-logrotate-8.2310.0-4.el9.x86_64                                                                       2/4
  Verifying        : rsyslog-8.2412.0-1.el9.x86_64                                                                                 3/4
  Verifying        : rsyslog-8.2310.0-4.el9.x86_64                                                                                 4/4
Installed products updated.

Upgraded:
  rsyslog-8.2412.0-1.el9.x86_64                                 rsyslog-logrotate-8.2412.0-1.el9.x86_64

Complete!


#rsyslog再インストール後のバージョンを確認する。
$ rsyslogd -v
rsyslogd  8.2412.0-1.el9 (aka 2024.12) compiled with:
        PLATFORM:                               x86_64-redhat-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        systemd support:                        Yes
        Config file:                            /etc/rsyslog.conf
        PID file:                               /var/run/rsyslogd.pid
        Number of Bits in RainerScript integers: 64

See https://www.rsyslog.com for more information.

#rsyslogがサーバの立ち上がりと同時に起動するか、現在ステータスがActiveか確認する。
$ systemctl status rsyslog
● rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-05-28 09:41:20 JST; 3min 22s ago
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
   Main PID: 1658 (rsyslogd)
      Tasks: 3 (limit: 4400)
     Memory: 3.1M
        CPU: 34ms
     CGroup: /system.slice/rsyslog.service
             mq1658 /usr/sbin/rsyslogd -n

May 28 09:41:20 SyslogSource systemd[1]: Starting System Logging Service...
May 28 09:41:20 SyslogSource systemd[1]: Started System Logging Service.
May 28 09:41:20 SyslogSource rsyslogd[1658]: [origin software="rsyslogd" swVersion="8.2412.0-1.el9" x-pid="1658" x-info="https://www.rs>
May 28 09:41:20 SyslogSource rsyslogd[1658]: imjournal: journal files changed, reloading...  [v8.2412.0-1.el9 try https://www.rsyslog.c>
enabled

🧑‍💻 4-2./etc/rsyslog.confの編集

まず、/etc/rsyslog.confの編集作業の流れをお伝えした後に、各サーバ毎の設定ファイル全文やその解説をお伝えします。

/etc/rsyslog.confの編集
#/etc/rsyslog.confの編集
$ sudo vi /etc/rsyslog.conf
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 /etc/rsyslog.confが開くので、後述する各サーバ別の設定ファイルに変更する。
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#rsyslogd -N1 は設定ファイルのチェックのみ行う。(実行はしない)
#エラーが出なければOK
$rsyslogd -N 1
rsyslogd: version 8.2412.0-1.el9, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

#rsyslogの設定ファイル変更を反映させるためにrsyslogを再起動する。
#成功した場合は何も表示されない。
$ sudo systemctl restart rsyslog

#rsyslogが起動しており、最下部にエラーが出ていないことを確認する。
$ sudo systemctl restart rsyslog
● rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-06-05 05:54:01 JST; 4s ago
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
   Main PID: 2127 (rsyslogd)
      Tasks: 4 (limit: 5628)
     Memory: 3.2M
        CPU: 22ms
     CGroup: /system.slice/rsyslog.service
             mq2127 /usr/sbin/rsyslogd -n

Jun 05 05:54:01 Syslog systemd[1]: Starting System Logging Service...
Jun 05 05:54:01 Syslog rsyslogd[2127]: [origin software="rsyslogd" swVersion="8.2412.0-1.el9" x-pid="2127" x-info="https://www.rsyslog>
Jun 05 05:54:01 Syslog systemd[1]: Started System Logging Service.
Jun 05 05:54:01 Syslog rsyslogd[2127]: imjournal: journal files changed, reloading...  [v8.2412.0-1.el9 try https://www.rsyslog.com/e/>

変更点や設定内容の解説は後述しますが、各サーバ毎の設定ファイルは以下の通りです。

SyslogSource(Syslog送信元サーバ)/etc/rsyslog.conf 全文
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") 

### ローカルログ出力の形式変更"2018-10-10T10:37:53.063083+09:00"の形式で出力。
module(load="builtin:omfile" Template="RSYSLOG_FileFormat")



#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the j
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
### Syslogサーバへのログ送信設定の追加
#local0.infoのログを除外する設定
*.info;mail.none;authpriv.none;cron.none;local0.none 	/var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

#cronで設定したlocal0.infoのログのみSyslogサーバに送信する。
local0.info action(type="omfwd" protocol="udp" port="514" Target="[Syslogサーバ(転送先)IPアドレス]")


# ### sample forwarding rule ###
#action(type="omfwd"
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")
Syslog(Syslog受信&転送サーバ)/etc/rsyslog.conf 全文
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") 

### ローカルログ出力の形式変更"2018-10-10T10:37:53.063083+09:00"の形式で出力。
module(load="builtin:omfile" Template="RSYSLOG_FileFormat")


#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
#後にルールセットと一緒に指定するので、上記コメントを外さない。

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

##################ADD##################
####SyslogSourceから受信したログの設定

###SyslogSourceから受信したログの保管場所・形式の指定
#ログの保管場所は"/Syslog/SyslogSource/SyslogSource.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="receivelog01" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

###SyslogSourceからUDP/514で受信したログの処理方法の指定
#ログを出力したホストがプライベートIPアドレスならば以下2つの処理を行う。
#(1)SyslogTransfer(=Target)のUDP/514へログを出力する。
#(2)テンプレート"receivelog01"に従って、受信したログをSyslogサーバ内に保管する。
ruleset(name="receiverule01"){
        if ($fromhost-ip startswith "10" or $fromhost-ip startswith "172" or $fromhost-ip startswith "192") then {
                action(type="omfwd" protocol="udp" port="514" Target="[SyslogTransfer(転送先)IPアドレス]")
                action(type="omfile" Dynafile="receivelog01")
                & stop
        }
}


###UDP/514でSyslogSourceからログを受け付ける設定
#ルールセット"receiverule01"を適用させる
input(type="imudp" port="514" ruleset="receiverule01")


#######################################

####Syslogサーバから出たログの保管方法設定
###ログの保管場所は"/Syslog/Syslog/Syslog.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="locallog01" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

##################END##################


#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                action(type="omfile" Dynafile="locallog01")

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


# ### sample forwarding rule ###
#action(type="omfwd"
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")
SyslogTransfer(Syslog転送先サーバ)/etc/rsyslog.conf 全文
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") 

### ローカルログ出力の形式変更"2018-10-10T10:37:53.063083+09:00"の形式で出力。
module(load="builtin:omfile" Template="RSYSLOG_FileFormat")


#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
#後にルールセットと一緒に指定するので、上記コメントを外さない。

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

##################ADD##################
####SyslogSourceから受信したログの設定

###SyslogSourceから受信したログの保管場所・形式の指定
#ログの保管場所は"/Syslog/SyslogSource/SyslogSource.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="receivelog02" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

###SyslogSourceからUDP/514で受信したログの処理方法の指定
#ログを出力したホストがプライベートIPアドレスならば以下2つの処理を行う。
#(1)SyslogTransfer(=10.0.129.7)のUDP/514へログを出力する。
#(2)テンプレート"receivelog02"に従って、受信したログをSyslogサーバ内に保管する。
ruleset(name="receiverule02"){
        if ($fromhost-ip startswith "10" or $fromhost-ip startswith "172" or $fromhost-ip startswith "192") then {
                action(type="omfile" Dynafile="receivelog02")
                & stop
        }
}


###UDP/514でSyslogSourceからログを受け付ける設定
#ルールセット"receiverule02"を適用させる
input(type="imudp" port="514" ruleset="receiverule02")


#######################################

####SyslogTransferから出たログの保管方法設定
###ログの保管場所は"/Syslog/Syslog/Syslog.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="locallog02" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

##################END##################


#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                action(type="omfile" Dynafile="locallog02")

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


# ### sample forwarding rule ###
#action(type="omfwd"
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

🧑‍💻 4-3./etc/rsyslog.confの意図 ~全サーバ共通~

全サーバ共通でローカルで出力するログのタイムスタンプの形式を変更しています。
[2-2-2.timestamp formatについて]でご紹介した通り、旧式のタイムスタンプとなっているのでより精緻なタイムスタンプに変更します。

全サーバ共通 追記部分
# Use default timestamp format
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") 

### ローカルログ出力の形式変更"2018-10-10T10:37:53.063083+09:00"の形式で出力。
module(load="builtin:omfile" Template="RSYSLOG_FileFormat")

🧑‍💻 4-4./etc/rsyslog.confの意図 ~SyslogSource~

SyslogSourceでは以下2点をデフォルト設定から変更しています。

🧑‍💻 4-4-1.local0.infoのログは/var/log/messagesへの出力をしない

深い意味はないのですが、ログの除外設定を自分で操作してみたく設定しました。
以下変更前の設定でもログの送受信には問題ないです。

local0.infoの除外
 ▽変更後
>*.info;mail.none;authpriv.none;cron.none;local0.none	/var/log/messages
 ▽変更前
<*.info;mail.none;authpriv.none;cron.none;     	/var/log/messages

仮に除外設定がない場合、/etc/rsyslog.conf内全てのRULESが評価されるので、①/var/log/messagesへの出力と②Syslogサーバへの送信…の両方が行われます。

🧑‍💻 4-4-2.local0.infoで出力された詳細はログのSyslogサーバへの転送

actionのオプション詳細は[2-5-3.Actionの使い方]でお伝えした通りです!今回は他サーバへの転送なので「(2)他サーバにログを送る場合」が該当します。

Syslogサーバへのログ転送設定
 ▽追記
#cronで設定したlocal0.infoのログのみSyslogサーバに送信する。
local0.info action(type="omfwd" protocol="udp" port="514" Target="[Syslogサーバ(転送先)IPアドレス]")

🧑‍💻 4-5./etc/rsyslog.confの意図 ~Syslogサーバ ログ受信&転送~

まず、Syslogサーバでのログ受信にあたり必要な設定を解説します。
以下がログ受信と転送に関わる部分です。

Linux:SyslogSourceからの受信&SyslogTransferへの転送設定
 ▽追記
####SyslogSourceから受信したログの設定

###SyslogSourceから受信したログの保管場所・形式の指定
#ログの保管場所は"/Syslog/SyslogSource/SyslogSource.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="receivelog01" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

###SyslogSourceからUDP/514で受信したログの処理方法の指定
#ログを出力したホストがプライベートIPアドレスならば以下2つの処理を行う。
#(1)SyslogTransfer(=Target)のUDP/514へログを出力する。
#(2)テンプレート"receivelog01"に従って、受信したログをSyslogサーバ内に保管する。
ruleset(name="receiverule01"){
        if ($fromhost-ip startswith "10" or $fromhost-ip startswith "172" or $fromhost-ip startswith "192") then {
                action(type="omfwd" protocol="udp" port="514" Target="[SyslogTransfer(転送先)IPアドレス]"))
                action(type="omfile" Dynafile="receivelog01")
                & stop
        }
}

###UDP/514でSyslogSourceからログを受け付ける設定
#ルールセット"receiverule01"を適用させる
input(type="imudp" port="514" ruleset="receiverule01")

🧑‍💻 4-5-1.rulesetを用いたログの受信

rulesetif()~then{}template…とデフォルト設定にはないものが沢山出てきたので、
以下1つずつ解説していきます。説明の都合上、設定ファイル下のrulesetからお伝えします!

SyslogSourceからの受信&SyslogTransferへの転送設定(ruleset)
 ▽追記
###UDP/514でSyslogSourceからログを受け付ける設定
#ルールセット"receiverule01"を適用させる
input(type="imudp" port="514" ruleset="receiverule01")
  • ルールセットとは?
    端的に言えば、「inputで指定した方法(=imudp)/ポート番号(=514)で来たログは指定のルールセット(=receiverule01)内のルールに従って処理してね」 というものです。すなわち上記の意味は 「514番ポートからUDPで受信したログはreceiverule01に従って処理してね」 です。

  • ルールセットを使うメリット
    ルールセット内部で処理することで以下2つのメリットがあります。

    • 処理が高速になる。
      ルールセットを活用すると、rsyslogの内部で各ルールセット専用のキューが作成され、通常のログとは別のキューで処理されます。それゆえに並列で処理が実行できるので処理が高速になります。また、if文を書かずとも特定のサーバから来たログを処理できるので、1つ1つの処理速度が高速になります。

      ルールセットは、専用の「メイン」キューで実行できるようになります。これは、専用のキューが特定のルールセットに関連付けられることを意味します。つまり、そのルールセットにバインドされた入力は、データ要素をキューにエンキューする際に互いに競合する必要がなくなり、エンキュー操作を並列に完了できるようになります。(🔗参考リンク:https://www.rsyslog.com/doc/concepts/multi_ruleset.html#partitioning-of-input-data)

    • /etc/rsyslog.confの保守性や可読性が上がる。
      ルールセットは####MODULES####に記載します。(=if文を####RULES####の下に書かずに済む)したがって、「###RULES###の下はローカルログの処理を記載」「###RULES###の上は受信したログの処理を記載」と分けて書くことができるので、設定ファイルの保守性や可読性が上がります。以下リンク先で同じ設定をルールセットとif文で記載した時の比較がされています。

      🔗参考リンク:https://www.rsyslog.com/doc/concepts/multi_ruleset.html#split-local-and-remote-logging

  • ルールセット導入理由
    今回自分は /etc/rsyslog.confの可読性のためにrulesetを導入してみました!(if文を使うことは評価処理を増やしてしまうので、処理速度高速化に逆行していると想定しています)
    では、次の項で指定のルールセット(=receiverule01)の中身を見てみましょう!

🧑‍💻 4-5-2.受信したログの処理

以下記載の処理で行っていることは「(前提:514番ポートからUDPで受信した)ログがプライベートIPアドレスならば、SyslogTransferに転送した後、receivelog01のルールに従ってログを保管してね」 です。

SyslogSourceからの受信&SyslogTransferへの転送設定(ruleset)
###SyslogSourceからUDP/514で受信したログの処理方法の指定
#ログを出力したホストがプライベートIPアドレスならば以下2つの処理を行う。
#(1)SyslogTransfer(=Target)のUDP/514へログを出力する。
#(2)テンプレート"receivelog01"に従って、受信したログをSyslogサーバ内に保管する。
ruleset(name="receiverule01"){
        if ($fromhost-ip startswith "10" or $fromhost-ip startswith "172" or $fromhost-ip startswith "192") then {
                action(type="omfwd" protocol="udp" port="514" Target="[SyslogTransfer(転送先)IPアドレス]"))
                action(type="omfile" Dynafile="receivelog01")
                & stop
        }
}

actionの使い方は既習なので触れませんが、その他の意味を整理すると以下の通りです。

項目 説明 参考リンク
ruleset(name="inputで指定のルールセット名"){} ログの処理方法を指定する。inputでルールセットが指定された場合、{}内の方法でログを処理する。 公式リンク
if(条件)then{} 条件に適合した場合、{}内の方法でログを処理する。 公式リンク
$fromhost-ip 受信したログの送信元のIPアドレスを示す。 公式リンク
startswith~ 文字列が指定された部分文字列から開始されるかどうかを確認する。 公式リンク
stop ログの評価処理が中断され、設定ファイルstop以降記載のルールは評価されない。 公式リンク

では、上記表の意味を用いて、設定の意味を2点補足します。

  • if ($fromhost-ip startswith "10" or $fromhost-ip startswith "172" or $fromhost-ip startswith "192") then {~}
    上記を直訳すると、「受信したログの送信元のIPアドレスが 10から始まる もしくは 172から始まる もしくは 192から始まるならば、{~}の通り処理してください」となります。また、そういったIPアドレスの名前はプライベートIPアドレスですね。したがって、意訳すると 「ログがプライベートIPアドレスならば、{~}の通り処理してください」となります!

  • & stop
    ログの処理を止める理由は 「不要なログの処理を行わないため」 です!

    • 🔎具体例--------------------------
      & stopを使わずにプライベートIPアドレスで受信したログの処理を/etc/rsyslog.conf後続(=/etc/rsyslog.confの下の方)でも行うとしましょう。そのとき、local0.infoRULES内の以下設定の条件に該当して処理されます。
      *.info;mail.none;authpriv.none;cron.none action(type="omfile" Dynafile="locallog01")
      
      あれ…?プライベートIPアドレスはSyslogサーバにてif文内receivelog01のルールに従って処理されて完了したのですが、locallog01のルールにも従って二重に処理がされてしまいますね…。
      このような不要なログの処理を行わないために& stopは使われています。 今回はlocal0.infoのログしか送りませんが、「送信元サーバからauthpriv.* を送信していたら、ローカルのログと送信元のログが/var/log/secureで混ざってしまう」 なんてことも考えられますね!

では、最後に次の項でreceivelog01のルールの詳細を見ていきましょう!

🧑‍💻 4-5-3.テンプレートreceivelog01詳細

Syslog送信元から送られ、Syslogサーバ内で処理されるログは以下設定に従ってファイルに保管されます。

###SyslogSourceから受信したログの保管場所・形式の指定
#ログの保管場所は"/Syslog/SyslogSource/SyslogSource.log"
#ログローテーションを用いてファイル名に日付を付ける想定なので、
#テンプレートで日付は指定しない。
template(name="receivelog01" type="string"
     string="/Syslog/%hostname%/%hostname%.log"
)

雰囲気は分かる…感じがしますが、以下各オプションの意味です。

オプション 説明 参考リンク
name テンプレートの名前 公式リンク
type テンプレートの定義方法。String(=文字列)で今回は定義するが、Listで定義する方法もある。(右記リンクを見ると分かりやすいかも?) 公式リンク
String =に続けてログを保管するファイル名を指定する。 公式リンク
%~% ~を変数として処理する。 公式リンク
hostname ログ送信元のホスト名 公式リンク

したがって、送信元サーバのホスト名はSyslogSourceなので、ログの保管場所は/Syslog/SyslogSource/SyslogSource.logと指定しています。

🧑‍💻 4-5-4.まとめ~Syslogサーバ ログ受信&転送~

[4-5]の内容は長かったのでまとめると以下の通りです!
🧑‍🎓まとめ🧑‍🎓==================================
UDP/514番ポート受信したログがプライベートIPアドレスならば、以下2つの処理をする。
①SyslogTransferに受信したログを転送
/Syslog/SyslogSource/SyslogSource.logへ保管
========================================

🧑‍💻 4-6./etc/rsyslog.confの意図 ~Syslogサーバ ローカルのログ~

変更前は/var/log/messagesに保管予定だったものを、locallog01というルールで保管するように変更しています。

 ▽変更後
>*.info;mail.none;authpriv.none;cron.none action(type="omfile" Dynafile="locallog01")
 ▽変更前
<*.info;mail.none;authpriv.none;cron.none	/var/log/messages

locallog01では受信したログ同様に/Syslog/%hostname%/%hostname%.log(=Syslogサーバの場合は/Syslog/Syslog/Syslog.log)に保管するように指定しています。オプションの意味などは記載済みなので割愛します。

また、SyslogTransfer(転送先サーバ)でも同様の設定ファイル内容(テンプレート名等名前が異なるだけ)なので、SyslogTransferの/etc/rsyslog.conf内容の解説は割愛します。 適宜[4-5]~[4-6]上記の内容を置き換えて解読してみてください!

🧑‍💻 4-7.~ログ送受信の確認~

例として、SyslogとSyslogTransfer内に溜まったログを見てみます!1時間待ってられないので、SyslogSourceで意図的にログを発生させます。

#SyslogSourceでの作業。意図的にログを発生させる。
$ logger -p local0.info rsyslog-test


#SyslogTransferでの作業。
#SyslogSourceとSyslogTransfer自身のログ保管を確認
$ sudo ls -l /Syslog
total 0
drwx------ 2 root root 29 Jun  5 07:29 SyslogSource
drwx------ 2 root root 32 Jun  5 07:29 SyslogTansfer


#SyslogTransferでの作業。
#SyslogSourceログ保管を確認
$ sudo ls -l /Syslog/SyslogSource
total 1048512
-rw------- 1 root root 1032570696 Jun  5 07:30 SyslogSource.log


#SyslogTransferでの作業。
#ログの中身を確認。SyslogSourceでのloggerコマンドの実行結果が保管されている。
$ sudo tail -f -n 10 /Syslog/SyslogSource/SyslogSource.log
2025-06-05T07:44:23+09:00 SyslogSource ec2-user[3151]: rsyslog-test

他のサーバやファイルも同様にして確認してみてください!
rsyslogの内容は以上となり、お次はログローテーションです!

🔄 5.実践(3)~ログローテーション~

🔄 5-1.参考になったリンクのご共有

手順やRHEL9でのローテーションの仕組みについて書いてある分かりやすかったリンクをご共有します!

用途 参考リンク
logrotateの手順確認詳細 リンク
/etc/systemd/system/logrotate.timerの詳細オプション リンク
logrotate の個別設定ファイルのオプション詳細 (RHEL9ではない) リンク
logrotate動作の予備知識として補足 リンク

また、リンク以上の解説はありませんが、念のために学習したことをまとめていきます。

🔄 5-2.ログローテーションの設定

ここからは自分のローテーション設定や実行結果をまとめていきます!

ログローテーションファイルの設定(Syslogサーバでの実行例)
#自分がログ保管先として指定した/Syslog配下のログに対して設定する。
#ログローテーションファイルを作成
$ sudo vi /etc/logrotate.d/receivelog01
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  ここに後述する設定ファイル内容を追記
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


#設定ファイル内容に問題がないか確認する
$ sudo logrotate -d /etc/logrotate.d/receivelog01
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/receivelog01
Reading state from file: /var/lib/logrotate/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state

Handling 1 logs

rotating pattern: /Syslog/*/*.log
 after 1 days (3 rotations)
empty log files are rotated, old logs are removed
considering log /Syslog/SyslogSource/SyslogSource.log
Creating new state
  Now: 2025-06-10 06:10
  Last rotated at 2025-06-10 06:00
  log does not need rotating (log has already been rotated)
considering log /Syslog/Syslog/Syslog.log
Creating new state
  Now: 2025-06-10 06:10
  Last rotated at 2025-06-10 06:00
  log does not need rotating (log has already been rotated)


#デーモンを再起動して設定ファイルを反映させる
$ sudo systemctl daemon-reload


#確認のために強制的にログローテーションを行う
$ sudo logrotate -f /etc/logrotate.d/receivelog01


#ローテーションされていることの確認をする。
#条件(=dateyesterday/”日付変更時に”行われたローテーション後のファイルのタイムスタンプと
#ファイル内ログの日付を一致させる)を満たしていないので、
#ファイル名が日付ではなく".log1"となる。
$ sudo ls -l /Syslog/SyslogSource/
total 4
-rw------- 1 root root 723 Jun 10 06:00 SyslogSource.log.1.gz


#翌日(6/11)にローテーションが行われていることを確認する
$ sudo ls -l /Syslog/SyslogSource
total 12
-rw------- 1 root root 340 Jun 11 04:00 SyslogSource.log
-rw------- 1 root root 723 Jun 10 06:00 SyslogSource.log.1.gz
-rw------- 1 root root 197 Jun 10 23:00 SyslogSource.log-20250610.gz


#4日後(6/14)に保管世代数上限に来たログ(SyslogSource.log-20250610.gz)が
#破棄されていることを確認する
#SyslogSource.log-20250610.gzがないことを確認する。
$ sudo ls -l /Syslog/SyslogSource
total 20
-rw------- 1 root root 612 Jun 14 08:00 SyslogSource.log
-rw------- 1 root root 723 Jun 10 06:00 SyslogSource.log.1.gz
-rw------- 1 root root 249 Jun 11 23:00 SyslogSource.log-20250611.gz
-rw------- 1 root root 243 Jun 12 23:00 SyslogSource.log-20250612.gz
-rw------- 1 root root 246 Jun 13 23:00 SyslogSource.log-20250613.gz

#圧縮されたファイルが3世代あり、SyslogSource.log-20250610.gzがないので、
#正しく動作していることが確認できた。
#強制的にローテーションしたログは消えないらしい。
ログローテーションファイル内容(/etc/logrotate.d/receivelog01)
/Syslog/*/*.log
{
    #ローテーション周期
    daily
    #ローテーション世代
    rotate 3       
    #ローテーションしたファイルの圧縮
    compress       
    #ログファイルが空でもローテーションする
    ifempty
    #指定のログファイルが存在しなくてもエラーを出さずに処理を続行        
    missingok
    #ファイルのタイムスタンプと、ファイル名の日付を一致させる      
    dateyesterday
    #ローテーション後の実行スクリプト設定。rsyslogの再起動を実行  
    postrotate     
    	 /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
    endscript
}

🔄 5-3./usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || trueについて

ログローテーションの個別設定ファイルで1つだけいかついコマンドがありますね(?)
初見では「😕?」って感じです。(はい、自分です) この部分を細やかに見ていきましょう!

🔄 5-3-1.まとめ

早速ですが、このコマンドの目的と意味は以下の通りです。

  • 目的: rsyslogを再起動することで、rsyslogの対象ファイルをローテーション後の新しいファイルにする。(=ローテーション後のファイルに書き込み続けないようにする。)
  • 意味: コマンド実行時のエラー出力を全て消して、コマンドが失敗しても無視したい!

🔄 5-3-2.コマンドの意味

1行のコマンドですが、以下4つに分けると考えやすそうです。
個人的に分かりやすかったリンクは後述します。

  • /usr/bin/systemctl kill -s HUP rsyslog.service …①
    ここではrsyslogのプロセスを保ちながらrsyslogの再起動をしています。

  • >/dev/null
    上記①の標準出力の結果を出力しない設定にする。

  • 2>&1
    標準エラー出力の結果を標準出力と同じ場所に設定する。
    ※標準エラー出力=標準出力=/dev/nullなので、標準エラー出力=/dev/null
    したがって、現時点で①の実行結果は標準入力、標準エラー出力、ともに出力しない。

  • || true
    コマンドの実行結果を強制的に「成功」にする。

したがって、/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || trueは「①コマンド実行時のエラー出力を全て消して、コマンドが失敗しても無視する」という動きをします。

用途 参考リンク
kill -s HUPとは リンク
> /dev/null 2>&1とは #1 リンク
> /dev/null 2>&1とは #2 リンク
or演算子とは リンク
コマンドtrue/falseとは リンク

🔄 5-3-3.コマンドの目的

まとめの通り、目的は「rsyslogを再起動することで、rsyslogの対象ファイルをローテーション後の新しいファイルにする」ことです。

  • ログローテーション後、rsyslogは自動では新しいファイルを追いかけない場合がある。
  • ログがローテーションされた後、rsyslog を再起動(service rsyslog restart)または kill -HUP rsyslogd することで、rsyslogが新しいログファイルを再オープンし、以降の出力が新ファイルへ向かうようになる。

参考リンク:https://masudak.hatenablog.jp/entry/20110914/1315999265

6.おわりに

rsyslogは意外と現在の形式の設定例がネットになかったり、公式の文書が少なかったりするので、「同じ初心者の方のお役に立てれば…」という思いで詳細に書いてみました。
技術的な誤りや気になる点があれば遠慮なくコメントおねがいします!

Discussion