如何获取从终端运行的任何应用程序的日志或错误输出?

如何获取从终端运行的任何应用程序的日志或错误输出?

我想知道如何获取程序的日志文件。这对于在应用程序崩溃时查找其中的错误很有用。

我的意思是通过终端打开应用程序,然后在同时写入日志文件。

是否有特殊命令可以执行此操作,还是每次运行应用程序时都会自动执行此操作?如果是,那么日志文件存储在哪里?

答案1

并非所有应用程序都会留下日志,这取决于它们背后的编码,即使是复杂的应用程序也可能没有日志记录功能。

如果应用程序具有调试、详细或日志功能,则该选项将在man该应用程序的页面中声明,即:man ssh将向您显示如果您使用,ssh -v您将获得在打开到主机的隧道时在后台执行的命令的详细输出,ssh -y将输出到 syslog 而不是 stderr。

但有些应用程序没有这种功能。虽然这些strace可以用作任何应用程序的调试实用程序,但它会记录所有系统调用和信号,我发现在运行应用程序时发生任何崩溃或意外故障时它很有用,而且大多数时候它可以帮助我解决没有内置调试或日志选项的应用程序的问题,即输出strace ls

execve("/usr/bin/ls", ["ls"], [/* 95 vars */]) = 0
brk(0)                                  = 0x20b6000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7e5ca3000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=118369, ...}) = 0
mmap(NULL, 118369, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd7e5c86000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20l\0\0\0\0\0\0"..., 832) = 832
...
...
...

这使您可以了解发生了什么以及为什么应用程序无法在其代码中停止。

答案2

我认为您想要的只是在终端中查看文本并同时将其写入文件:

ls -l | tee -a ls.log

这会将您的文件列到终端和ls.log-a如果ls.log存在,则用于附加而不是覆盖。

请注意,这不适用于终端应用程序,例如lesstop任何具有菜单和滚动条的应用程序。

如果“日志”中缺少某些文本,则必须重定向将错误消息输出到标准输出:

ls filedoesnotexist_or_whatever_leads_to_an_error 2>&1 | tee -a ls.log

相关内容