如何在 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
。