我正在运行一个写入 log.txt 的应用程序。该应用程序已更新到新版本,使得支持的插件不再兼容。它强制将大量错误写入 log.txt,并且似乎不支持写入不同的日志文件。
如何将它们写入不同的日志?
我考虑过用硬链接替换 log.txt (应用程序无法区分差异,对吗?)或指向 /dev/null 的硬链接。我有什么选择?
答案1
您可以创建到 /dev/null 的符号链接,并且不需要是 root:
ln -s /dev/null log.txt
答案2
# cp -a /dev/null log.txt
这将使用正确的主要和次要开发编号复制您的空设备,以便log.txt
您拥有另一个null
.
设备在内核中根本无法通过名称来识别,而是通过其主设备号和次设备号来识别。因为我不知道你有什么操作系统,所以我发现从我们已经知道的地方复制数字很方便。如果您使用错误的主设备号和次设备号,您很可能制作了其他设备,可能是磁盘或您不想写入的其他设备。
答案3
这里的其他答案可能会起作用。特别是,符号链接解决方案可能是最简单的解决方案。我提供这个主要是为了完整性。
如果包含该文件的文件系统不支持设备(例如,它是使用该选项安装的),那么涉及mknod
(或)的解决方案就会出现问题。当然,跨文件系统的硬链接根本不起作用。cp -a
nodev
硬链接或创建新设备节点的替代方法是使用绑定挂载,它允许您将文件或目录从文件系统树的一部分挂载到另一部分。因此,例如,您可以运行:
mount -o bind /dev/null /path/to/log.txt
这很像硬链接,但是:
- 它可以跨文件系统操作(因为它不像硬链接那样基于文件系统索引节点)
- 它适用于只读文件系统(因为您实际上并未修改文件系统)
一个完整的例子:
bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
答案4
好吧,一种使用命名管道的不优雅方法:
# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null
您几乎可以对转储的日志执行任何操作,例如过滤或发送数控。