Linuxでは、どのプログラムがログファイルを使用し、エントリを更新し、ログファイルを埋めるかを見つける方法です。
答え1
これに対する簡単な答えはありません。以下を使用できます。
通知する
inotify
ファイルが変更されたら通知を受け取ることができます。inotify
ユーティリティ自体ではなく、Linuxカーネルが提供するインタフェースですが、パッケージinotifywait
にあるものなどのいくつかのユーティリティもあります。inotify-tools
問題は、inotify
どのプロセスがファイルを変更したかを教えてくれないことです。
例:
mst@mst-nb1:~$ inotifywait 123
Setting up watches.
Watches established. # now i write to "123" in another terminal
123 MODIFY
ラソフ
どのプロセスがファイルを開いているかを確認する非常に強力なユーティリティですlsof
。たとえば、これにより、lsof /var/log/syslog
現在どのプロセスがファイルを開いているかを確認できます。
問題は、lsof
時間の経過とともにファイルを監視できず、ファイルが実行されたときに何が起こっているのかについてのスナップショットのみを提供できることです。あなたの場合、ファイルに何が記録されたのか知りたいのですが、ファイルが永久に開いているかどうかはわかりません(おそらくそうではない可能性が高い)。書き込みプロセスが常にファイルを開いたままにしない限り、あまり役に立ちませんlsof
。これは、書き込み中にファイルを実行する場合にのみ正しいプロセスを指すことができるためです。
lsof
以前のようにファイルを監視できない理由inotify
は、単にファイルシステムをスキャンして情報を取得しますが、監視者を設定しないため/proc
です。
例:
# Terminal 1 (I open the file)
mst@mst-nb1:~$ cat > 123
# Terminal 2
mst@mst-nb1:~$ lsof 123
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cat 24097 mst 1w REG 252,1 0 16791997 123
ロギングファイルシステム
これは最善の機会かもしれませんが、これを達成するにはかなりの努力が必要です。サーキットブレーカを使用して、loggedfs
ログファイルと同じディレクトリにインストールできます。次に、ファイルがいつ開かれたかについての詳細を提供する必要があります。
唯一の問題loggedfs
は、いくつかの単純なコマンドラインユーティリティほど使いにくいということです。
この問題を解決したい場合は、loggedfs
以下を参照してください。文書
結論として
結論は様々な可能性があるがsimple
方法がないということだ。
答え2
ログファイルは複数のソースから入力を受け取ります。通常、ソース、タイムスタンプ、およびいくつかのメッセージを説明する最初の単語で構成される行構造があります。
厳格な形式はありません。各アプリケーション(Webサーバーなど)には独自のファイルと形式があります(多くの場合、内容を要約または変更するための特定のツールもあります)。
答え3
簡単な方法は次のとおりです。auditd。
例:
/etc/audit/audit.rules
-w /var/tmp/foo -p w -k foo
以下は/var/log/audit/audit.logのエントリです。
type=SYSCALL msg=audit(1454353834.695:29):
arch=c000003e syscall=2 success=yes exit=3 a0=27cd460 a1=241 a2=1a4
a3=7fff4e278f30 items=2 ppid=10218 pid=10314 auid=0 uid=0 gid=0 euid=0
suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm="vi"
exe="/usr/bin/vim.basic" key="foo"
そこには、PIDや実行可能ファイルを含む多くの情報があります。また、見ることができますaureport
。