如何在Linux的Bash中检查系统日志?

126

在C语言中我们这样记录日志:

syslog( LOG_INFO, "proxying %s", url );

在Linux中,我们如何检查日志?


函数 syslog 不是会向系统日志中写入吗?(除非你在谈论用于访问内核消息环缓冲区的较低级别的函数,但我怀疑 url 是一个 int。) - Cascabel
2
这个问题应该迁移到unix.SE.com,不确定是否值得为mod的注意而标记(我已经标记了)。 - Alexander Malakhov
7个回答

198

less /var/log/syslog 命令怎么样?


1
@kern:你使用的是哪个Linux发行版和版本? - NPE
7
@kern:请查看您的/etc/syslog.conf文件的内容。 - NPE
36
tail -f /var/log/syslog 很棒,因为它可以在数据写入 syslog 时展示最近的输出。如果你需要实时调试问题而不是查看过去的信息,这个命令非常有用。 - counterbeing
27
实际上,CentOS 使用的是 /etc/rsyslog.conf 文件。 - Roman Goyenko
但是默认情况下,只有root用户有权限读取/var/log/syslog。还有其他方法吗? - Arunprasad Rajkumar
1
@ArunprasadRajkumar 另一种方法是避免将面向普通用户的日志消息记录到系统日志中。 - Dmitry Grigoryev

48
在 Fedora 19 上,看起来答案是 /var/log/messages。不过请检查 /etc/rsyslog.conf 是否已被更改。

我已经在openSUSE上检查过了,发现它也适用于它。谢谢分享! - silvioprog
同样适用于CentOS。 - kap

41

默认情况下,它会记录在系统日志中的/var/log/syslog,因此可以通过以下方式进行阅读:

tail -f /var/log/syslog

如果文件不存在,请检查 /etc/syslog.conf 以查看 syslogd 的配置文件。 请注意,配置文件可能不同,因此请检查运行中的进程是否使用了其他文件:
# ps wuax | grep syslog
root      /sbin/syslogd -f /etc/syslog-knoppix.conf

注意:在某些发行版(如Knoppix)中,所有的记录消息可能会被发送到不同的终端(例如/dev/tty12),因此要访问例如tty12,请尝试按下Control+Alt+F12

您还可以使用lsof工具查找syslogd进程正在使用的日志文件,例如:

sudo lsof -p $(pgrep syslog) | grep log$ 

如果想在shell中向syslogd发送测试消息,可以尝试以下命令:

echo test | logger

用跟踪工具进行故障排除(Linux 上使用 strace,Unix 上使用 dtruss),例如:

sudo strace -fp $(cat /var/run/syslogd.pid)

28

一个非常酷的工具是journalctl

例如,要将syslog显示到控制台:journalctl -t <syslog-ident>,其中<syslog-ident>是您在初始化syslog时赋予openlog函数的标识。


如果您使用syslog-ng与systemd服务,您可以使用journalctl --unit=syslog-ng@default.service查看系统日志。 - smac89
这应该被标记为正确答案,而不是使用特定的发行版和配置文件名,并使用grep过滤。 - Gonmator

15

tail -f /var/log/syslog | grep process_name 其中process_name是我们感兴趣的进程名称。


4

如果您喜欢Vim,它内置了syslog文件的语法突出显示功能,例如,它将以红色突出显示错误消息。

vi +'syntax on' /var/log/syslog

1
在一些Linux系统(例如Debian和Ubuntu)中,syslog每天都会进行轮换,您将拥有多个日志文件,其中最新的两个文件未经压缩,而较旧的文件已经被压缩:
$ ls -l /var/log/syslog*
-rw-r----- 1 root adm  888238 Aug 25 12:02 /var/log/syslog
-rw-r----- 1 root adm 1438588 Aug 25 00:05 /var/log/syslog.1
-rw-r----- 1 root adm   95161 Aug 24 00:07 /var/log/syslog.2.gz
-rw-r----- 1 root adm  103829 Aug 23 00:08 /var/log/syslog.3.gz
-rw-r----- 1 root adm   82679 Aug 22 00:06 /var/log/syslog.4.gz
-rw-r----- 1 root adm  270313 Aug 21 00:10 /var/log/syslog.5.gz
-rw-r----- 1 root adm  110724 Aug 20 00:09 /var/log/syslog.6.gz
-rw-r----- 1 root adm  178880 Aug 19 00:08 /var/log/syslog.7.gz

要搜索所有的系统日志文件,您可以使用以下命令:

$ sudo zcat -f `ls -tr /var/log/syslog*` | grep -i error | less

这里 zcat 首先解压并打印所有的系统日志文件(从最旧的开始),grep 进行搜索,less 分页显示搜索结果。

如果要在每一行前面添加系统日志文件的名称,可以使用 zgrep

$ sudo zgrep -i error `ls -tr /var/log/syslog*` | less

$ zgrep -V | grep zgrep
zgrep (gzip) 1.6

在这两种情况下,如果普通用户无法读取syslog文件,则需要使用sudo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接