私の目標は録音です。適切/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/log
、status-logger
中間子(man-in-the-middle)がエントリをsyslogに送信したりするために使用できます。
答え3
ディレクティブで指定されたログファイルと常に同じ出力を持つとは限りませんstatus-logger
。 dpkgのソースコードには、再コンパイルしないと変更できないハードコーディングもあります。status-fd
log
alternatives.log
そのため、ログファイルをfifoに置き換えて、ログの内容をジャーナルドにポンピングしてみました。 systemdの柔軟性により、追加の依存関係なしにこれを行うことができます。
でbashスクリプトを準備します
/usr/local/libexec/fifo2journal
。忘れないでくださいchmod +x
。スクリプトには、cat
60秒の効果的なハードコーディングされたタイムアウトがあります。標準入力に使用可能なデータがない場合(または改行文字がない場合)、このスクリプトは読み取った行の一部のみを出力して終了します(リソースを節約するため)。#!/bin/bash while :; do if IFS= read -r -t 60; then printf "%s\n" "$REPLY" else printf "%s" "$REPLY" exit 0 fi done
システムデバイスを準備します。 (ファイルシステムで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
ディスク上の既存のログファイルを削除します(必要に応じてバックアップを作成してください)。システムソケットデバイスを有効にして起動します。
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_NONBLOCK
systemdをアップグレードしていて、何らかの理由でソケットのアクティベーションが60秒ウィンドウ内に準備されておらず、fifoを開こうとするすべてのスレッドがハングする場合、潜在的な問題があります。このようなことが絶対に起こらないことを願っています。