rsyslog はログを記録しません。

rsyslog はログを記録しません。

これは奇妙な質問です。

RHEL7 VMでchrony / ntpサービスをテストし、その時間とホスト時間をリセットしています。一度満足して確認してみるとしばらく/var/log/messages変わりがありませんでした。

今、rsyslogサービス自体を再起動する以外に何をしても何も記録されません。

Apr 15 13:59:43 mymachine1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2847" x-info="http://www.rsyslog.com"] exiting on signal 2.

Apr 15 13:59:59 mymachine1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2853" x-info="http://www.rsyslog.com"] start

Apr 15 14:00:11 mymachine1 rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address'

「ログしない」などの操作を試しましたが、logger testrsyslogの独自のメッセージ以外に何も起こらないようです。パラメータを使用してrsyslogを手動で実行すると、-n -N1次のようになります。

rsyslogd: version 7.4.2, config validation run (level 1), master config /etc/rsyslog.conf

rsyslogd: End of config validation run. Bye

何らかの理由でrsyslogを介して何も記録されないようです。同じrsyslog.confファイルを使用して、同じホスト上の2番目の同じVM(ntpの無効化、日付の変更、複数回の再起動などの同じサイクルを経ずに)は正常に記録されます。

この時点で、日付/時刻は正確で、chronyが有効になって実行されており、数回再起動しました。 30秒間カーネルメッセージが表示された後、何も記録されません。

アイデア?

答え1

これは直接的な解決策ではありませんが、いくつかのデバッグを有効にして、後で何が起こっているのかを確認します。

アイデア#1 - デバッグロガー

まず、loggerコマンドの実行時にSTDERRにメッセージをエコーすることで、このようにコマンドを実行できます。

$ logger -s "hi"
saml: hi

アイデア#2 - プロフィールを確認

rsyslog 構成ファイルを確認することもできます。

$ sudo rsyslogd -N6 | head -10
rsyslogd: version 7.2.6, config validation run (level 6), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

6921.173842409:7f8b11df2780: rsyslogd 7.2.6 startup, module path '', cwd:/root
6921.175241008:7f8b11df2780: caller requested object 'net', not found (iRet -3003)
6921.175261977:7f8b11df2780: Requested to load module 'lmnet'
6921.175272711:7f8b11df2780: loading module '/lib64/rsyslog/lmnet.so'
6921.175505384:7f8b11df2780: module lmnet of type 2 being loaded (keepType=0).
6921.175520208:7f8b11df2780: entry point 'isCompatibleWithFeature' not present in module
6921.175528413:7f8b11df2780: entry point 'setModCnf' not present in module
6921.175535294:7f8b11df2780: entry point 'getModCnfName' not present in module
6921.175541502:7f8b11df2780: entry point 'beginCnfLoad' not present in module

アイデア#3 - rsyslogdデバッグを有効にする

rsyslogdまた、より多くの洞察を得るためにデーモンデバッグを有効にしてみましょう。

$ sudo -i
$ export RSYSLOG_DEBUGLOG="/tmp/debuglog"
$ export RSYSLOG_DEBUG="Debug"

$ service rsyslog stop
$ rsyslogd -d | head -10    
7160.005597645:7fae096a3780: rsyslogd 7.2.6 startup, module path '', cwd:/root
7160.005872662:7fae096a3780: caller requested object 'net', not found (iRet -3003)
7160.005895004:7fae096a3780: Requested to load module 'lmnet'
7160.005906331:7fae096a3780: loading module '/lib64/rsyslog/lmnet.so'
7160.006023505:7fae096a3780: module lmnet of type 2 being loaded (keepType=0).
7160.006030872:7fae096a3780: entry point 'isCompatibleWithFeature' not present in module
7160.006033780:7fae096a3780: entry point 'setModCnf' not present in module
7160.006036209:7fae096a3780: entry point 'getModCnfName' not present in module
7160.006038359:7fae096a3780: entry point 'beginCnfLoad' not present in module
...
...
7160.006063913:7fae096a3780: rsyslog runtime initialized, version 7.2.6, current users 1
7160.006102179:7fae096a3780: source file syslogd.c requested reference for module 'lmnet', reference count now 2
7160.006113657:7fae096a3780: GenerateLocalHostName uses 'greeneggs'

バージョン情報の確認

$ rsyslogd -version
rsyslogd 7.2.6, compiled with:
    FEATURE_REGEXP:             Yes
    FEATURE_LARGEFILE:          No
    GSSAPI Kerberos 5 support:      Yes
    FEATURE_DEBUG (debug build, slow code): No
    32bit Atomic operations supported:  Yes
    64bit Atomic operations supported:  Yes
    Runtime Instrumentation (slow code):    No
    uuid support:               Yes

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

確認されたエラーと解決策

OPはこれをRed Hatにバグとして提出しました。

このエラーの特徴は次のとおりです。

当然のことながら、ホストの時間を設定してみると、仮想マシンの時間がホストの間違った時間と同じでした。それから私は/var/log/messagesがもはや更新されないことを知りました。

rsyslogサービス自体を再起動してファイルに書き込む以外に何もしないことがわかりました。これにより、次のログが記録されます。

  ---
   Apr 15 16:39:39 rhel7time-dev rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address'

  Apr 15 16:39:39 rhel7time-dev rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="574" x-info="http://www.rsyslog.com"] exiting on signal 15.
  Apr 15 16:39:39 rhel7time-dev rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2117" x-info="http://www.rsyslog.com"] start
  ---

それ以外の場合、ロガーを含むファイルには何も記録されません。

rsyslog.confで$ OmitLocalLoggingをコメントアウトすると、ファイルのロギングが再開されます(それまでrsyslog.confは変更されませんでした)。

ロギングを使用すると、これらすべてが免疫になります。 Journalctl -b は、ロガーが送信したすべての内容を含むジャーナルレコードを表示します。

これに対してある開発者はこう答えました。

この問題が発生した場合は、/var/lib/rsyslog/imjournal.state回避策としてデーモンを削除して再起動できます。

rsyslog は日付を直接処理せず、システム API を介してのみ処理します。しばらく前にimjournalでコードを確認してみると、systemdに問題があるようです。

参考までに以下を参照してください。https://github.com/rsyslog/rsyslog/issues/43

答え2

私の場合はsystemctl restart systemd-journald役に立ったので

File /run/log/journal/29c32d60f93c42489aabb4ebeb593f5b/system.journal corrupted or uncleanly shut down, renaming and replacing.
[12274404.541271] systemd-journald[15492]: Deleted empty journal /run/log/journal/29c32d60f93c42489aabb4ebeb593f5b/[email protected]~ (4096 bytes).

答え3

次のコマンドを使用してrsyslogconfを確認してください。rsyslogd -f /etc/rsyslog.conf -N 1
すべてが正常に機能したら、次のコマンドを使用してsystemd-journald.socketを再起動してみてください。 systemctl 再起動 systemd-journald.socket
「logger」コマンドを使用して、rsyslogが機能していることを確認できます。ロガー「こんにちは」

答え4

特にRHEL7では、Journaldとrsyslogdの間に驚くほど脆弱な依存関係があります。 Journaldは最初の標準ログハンドラになりました。 rsyslogdに送信されたログを処理し、/dev/logrsyslogdに渡す必要があります。ただし、rsyslogdのデフォルトのインストールでは、/dev/logRHELパッケージマネージャがディレクティブを追加してそれをバイパスします。

$SystemLogSocketName /run/systemd/journal/syslog

systemd-journald.socketこれは rsyslog が生成して書き込むソケットのパスです。デバイスは/dev/log開始を作成してトリガしますsystemd-journald.service

ただし、何らかの理由でディレクティブが欠落している場合または設定のどこかに致命的でないエラーがあります。デフォルト値をrsyslogd使用します。/dev/log作り直すソケットを使って聴くことができます。これには2つの効果があります。

  • プロセスによって送信されたメッセージは/dev/logログに到達しません。
  • ログメッセージがrsyslogdに達していません。

したがって、この問題をデバッグするには、rsyslogサービスを再起動してそのサービスのタイムスタンプを確認します/dev/log。時間が一致すると、どこかに設定エラーがあるか、ディレクティブがありません。

関連情報