システムログにapt / dpkgアクティビティを記録する

システムログにapt / dpkgアクティビティを記録する

私の目標は録音です。適切/dpkg活動用途システムログ(rsyslog)ログエントリを中央のsyslogサーバーに送信します。

dpkgは/var/log/dpkg.log、aptは/var/log/aptディレクトリに書き込みます。

私が調査した結果、aptとdpkgの両方がsyslogを使用できるようです。唯一のオプションはrsyslog "テキストファイル入力モジュール"機能(http://www.rsyslog.com/doc/master/configuration/modules/imfile.html)、定期的にログファイルに新しいコンテンツがあることを確認してください。

/etc/dpkg/dpkg.cfg設定ファイルにはlogオプションがありますが、dpkg.cfg オプションと機能のマニュアルページはありません。

それは真実です。rsyslog ファイル唯一の選択は?

答え1

dpkgの場合は、次のように追加できます。

status-logger "logger -t dpkg -p info"

到着/etc/dpkg/dpkg.cfg。 apt-getはdpkgを呼び出すので、apt-get / apt操作も記録されます。man loggerシステムログに記録されている情報の調整を参照してください。

構成を更新するためにこれを使用しています。

- name: dpkg syslog
  lineinfile:
   dest: /etc/dpkg/dpkg.cfg
   line: 'status-logger "logger -t dpkg -p info"'

systemdログを使用している場合は、次のようにログを簡単に確認できます。

journalctl SYSLOG_IDENTIFIER=dpkg

答え2

--logこのオプションを使用すると、dpkgが出力を記録する場所を変更できます。これはファイル名のみを受け入れます。 DPKGは、パッケージ操作のためのシンプルで効率的なツールで作られているので、仕事を複雑にするロガーがないことは利点です。最も簡単な方法は、すでに知っているようにファイルに書き込んでから、syslogがそのファイルから読み取ることです。

status-fdファイル記述子に状態を送信したり/dev/logstatus-logger中間子(man-in-the-middle)がエントリをsyslogに送信したりするために使用できます。

答え3

ディレクティブで指定されたログファイルと常に同じ出力を持つとは限りませんstatus-logger。 dpkgのソースコードには、再コンパイルしないと変更できないハードコーディングもあります。status-fdlogalternatives.log

そのため、ログファイルをfifoに置き換えて、ログの内容をジャーナルドにポンピングしてみました。 systemdの柔軟性により、追加の依存関係なしにこれを行うことができます。

  1. でbashスクリプトを準備します/usr/local/libexec/fifo2journal。忘れないでくださいchmod +x。スクリプトには、cat60秒の効果的なハードコーディングされたタイムアウトがあります。標準入力に使用可能なデータがない場合(または改行文字がない場合)、このスクリプトは読み取った行の一部のみを出力して終了します(リソースを節約するため)。

    #!/bin/bash
    while :; do
        if IFS= read -r -t 60; then
            printf "%s\n" "$REPLY"
        else
            printf "%s" "$REPLY"
            exit 0
        fi
    done
    
  2. システムデバイスを準備します。 (ファイルシステムでfifoを使用してソケットを有効にします)

    ㅏ。/etc/systemd/system/[email protected]

    [Unit]
    Description=fifo at %f
    
    [Socket]
    ListenFIFO=%f
    SocketMode=0660
    
    [Install]
    WantedBy=sockets.target
    

    雨。/etc/systemd/system/[email protected]

    [Unit]
    Description=fifo to journal for %f
    Requires=fifo2journal@%i.socket
    
    [Service]
    ExecStart=/usr/local/libexec/fifo2journal
    StandardInput=socket
    StandardOutput=journal
    SyslogIdentifier=%f
    SyslogFacility=user
    
  3. ディスク上の既存のログファイルを削除します(必要に応じてバックアップを作成してください)。システムソケットデバイスを有効にして起動します。

    systemctl daemon-reload
    for FILEPATH in /var/log/dpkg.log /var/log/alternatives.log; do
        rm -f "$FILEPATH"
        UNIT_NAME=$(systemd-escape [email protected] --path "$FILEPATH")
        systemctl enable "$UNIT_NAME"
        systemctl start "$UNIT_NAME"
    done
    

これで、ログ(journalctl -f -t /var/log/dpkg.log)を見てログに書き込む(echo hello >/var/log/dpkg.log)を試みることができます。

logrotateはfifoを空のログとして扱い、何もしません。

この方法を使用するには、ソケットを有効にするにはsystemdが実行されている必要があります。 systemdが実行されておらず、fifoを使用せずに(閉じた)fifoを開こうとすると、意図しないO_NONBLOCK結果が発生する可能性があります。特にchrootを介してrootfsを救出する場合は、さらにそうです。

O_NONBLOCKsystemdをアップグレードしていて、何らかの理由でソケットのアクティベーションが60秒ウィンドウ内に準備されておらず、fifoを開こうとするすべてのスレッドがハングする場合、潜在的な問題があります。このようなことが絶対に起こらないことを願っています。

関連情報