如何在Ubuntu和Centos上查看和配置Linux日志
介绍
Linux 系统管理员经常需要查看日志文件以进行故障排除。 事实上,这是任何系统管理员都会做的第一件事。
Linux 及其上运行的应用程序可以生成所有不同类型的消息,这些消息记录在各种日志文件中。 Linux 使用一组配置文件、目录、程序、命令和守护进程来创建、存储和回收这些日志消息。 因此,了解系统将其日志文件保存在何处以及如何使用相关命令有助于在故障排除期间节省宝贵的时间。
在本教程中,我们将了解 Linux 日志记录机制的不同部分。
免责声明
本教程中的命令在 CentOS 6.4、Ubuntu 12 和 Debian 7 的普通安装中进行了测试。
默认日志文件位置
Linux 中日志文件的默认位置是 /var/log。
您可以使用简单的 ls -l /var/log 命令查看此目录中的日志文件列表。
这是我在 CentOS 系统中看到的:
[root@TestLinux ~]# ls -l /var/log
total 1472 -rw-------. 1 root root 4524 Nov 15 16:04 anaconda.ifcfg.log -rw-------. 1 root root 59041 Nov 15 16:04 anaconda.log -rw-------. 1 root root 42763 Nov 15 16:04 anaconda.program.log -rw-------. 1 root root 299910 Nov 15 16:04 anaconda.storage.log -rw-------. 1 root root 40669 Nov 15 16:04 anaconda.syslog -rw-------. 1 root root 57061 Nov 15 16:04 anaconda.xlog -rw-------. 1 root root 1829 Nov 15 16:04 anaconda.yum.log drwxr-x---. 2 root root 4096 Nov 15 16:11 audit -rw-r--r-- 1 root root 2252 Dec 9 10:27 boot.log -rw------- 1 root utmp 384 Dec 9 10:31 btmp -rw-------. 1 root utmp 1920 Nov 28 09:28 btmp-20131202 drwxr-xr-x 2 root root 4096 Nov 29 15:47 ConsoleKit -rw------- 1 root root 2288 Dec 9 11:01 cron -rw-------. 1 root root 8809 Dec 2 17:09 cron-20131202 -rw-r--r-- 1 root root 21510 Dec 9 10:27 dmesg -rw-r--r-- 1 root root 21351 Dec 6 16:37 dmesg.old -rw-r--r--. 1 root root 165665 Nov 15 16:04 dracut.log -rw-r--r--. 1 root root 146876 Dec 9 10:44 lastlog -rw------- 1 root root 950 Dec 9 10:27 maillog -rw-------. 1 root root 4609 Dec 2 17:00 maillog-20131202 -rw------- 1 root root 123174 Dec 9 10:27 messages -rw-------. 1 root root 458481 Dec 2 17:00 messages-20131202 -rw------- 1 root root 2644 Dec 9 10:44 secure -rw-------. 1 root root 15984 Dec 2 17:00 secure-20131202 -rw------- 1 root root 0 Dec 2 17:09 spooler -rw-------. 1 root root 0 Nov 15 16:02 spooler-20131202 -rw-------. 1 root root 0 Nov 15 16:02 tallylog -rw-rw-r--. 1 root utmp 89856 Dec 9 10:44 wtmp -rw------- 1 root root 3778 Dec 6 16:48 yum.log
查看日志文件内容
以下是您可以在 /var/log 下找到的一些常见日志文件:
- 重量级
- utmp
- dmesg
- 消息
- maillog 或 mail.log
- 假脱机
- auth.log 或安全
wtmp 和 utmp 文件跟踪登录和退出系统的用户。 你不能使用 cat 直接读取这些文件的内容——有特定的命令。
我们现在将使用其中一些命令。
要查看当前登录 Linux 服务器的用户,只需使用 who 命令。 此命令从 /var/run/utmp 文件(对于 CentOS 和 Debian)或 /run/utmp(对于 Ubuntu)获取其值。
这是一个来自 CentOS 的例子:
[root@TestLinux ~]# who
root tty1 2013-12-09 10:44 root pts/0 2013-12-09 10:29 (10.0.2.2) sysadmin pts/1 2013-12-09 10:31 (10.0.2.2) joeblog pts/2 2013-12-09 10:39 (10.0.2.2)
在这种特殊情况下,我是系统的唯一用户。 我从 Oracle VirtualBox 运行服务器,并从控制台和 SSH 会话以 root 身份访问它。 另外两个用户帐户(sysadmin 和 joeblg)也在访问系统。
最后一条命令告诉我们用户的登录历史:
[root@TestLinux ~]# last | grep sysadmin
sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31 still logged in sysadmin pts/0 10.0.2.2 Fri Nov 29 15:42 - crash (00:01) sysadmin pts/0 10.0.2.2 Thu Nov 28 17:06 - 17:13 (00:06) sysadmin pts/0 10.0.2.2 Thu Nov 28 16:17 - 17:05 (00:48) sysadmin pts/0 10.0.2.2 Thu Nov 28 09:29 - crash (06:04) sysadmin pts/0 10.0.2.2 Wed Nov 27 16:37 - down (00:29) sysadmin tty1 Wed Nov 27 14:05 - down (00:36) sysadmin tty1 Wed Nov 27 13:49 - 14:04 (00:15)
在此示例中,我试图查找用户 sysadmin 的登录历史记录。 正如你所看到的,有几个例子他设法使系统崩溃。
要了解系统上次重新启动的时间,我们可以运行以下命令:
[root@TestLinux ~]# last reboot
结果可能如下所示
reboot system boot 2.6.32-358.el6.x Mon Dec 9 10:27 - 10:47 (00:19) reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:37 - 10:47 (2+18:10) reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:28 - 16:36 (00:08) reboot system boot 2.6.32-358.el6.x Fri Dec 6 11:06 - 16:36 (05:29) reboot system boot 2.6.32-358.el6.x Mon Dec 2 17:00 - 16:36 (3+23:36) reboot system boot 2.6.32-358.el6.x Fri Nov 29 16:01 - 16:36 (7+00:34) reboot system boot 2.6.32-358.el6.x Fri Nov 29 15:43 - 16:36 (7+00:53) ... ... wtmp begins Fri Nov 15 16:11:54 2013
要查看某人上次登录系统的时间,请使用 lastlog:
[root@TestLinux ~]# lastlog
在我的系统中,输出如下所示:
Username Port From Latest root tty1 Mon Dec 9 10:44:30 +1100 2013 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in** uucp **Never logged in** operator **Never logged in** games **Never logged in** gopher **Never logged in** ftp **Never logged in** nobody **Never logged in** vcsa **Never logged in** saslauth **Never logged in** postfix **Never logged in** sshd **Never logged in** sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31:50 +1100 2013 dbus **Never logged in** joeblog pts/2 10.0.2.2 Mon Dec 9 10:39:24 +1100 2013
对于其他基于文本的日志文件,您可以使用 cat、head 或 tail 命令来读取内容。
在下面的示例中,我试图查看 Debian 框中 /var/log/messages 文件的最后十行:
debian@debian:~$ sudo tail /var/log/messages
输出:
Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP filters: protocol multicast Dec 16 01:21:08 debian kernel: [ 9.648220] Bridge firewalling registered Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO (Voice Link) ver 0.6 Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO socket layer initialized Dec 16 01:21:08 debian kernel: [ 9.832215] lp: driver loaded but no devices found Dec 16 01:21:08 debian kernel: [ 9.868897] ppdev: user-space parallel port driver Dec 16 01:21:11 debian kernel: [ 12.748833] [drm] Initialized drm 1.1.0 20060810 Dec 16 01:21:11 debian kernel: [ 12.754412] pci 0000:00:02.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, low) -> IRQ 11 Dec 16 01:21:11 debian kernel: [ 12.754412] [drm] Initialized vboxvideo 1.0.0 20090303 for 0000:00:02.0 on minor 0
rsyslog 守护进程
日志机制的核心是 rsyslog 守护进程。 该服务负责监听来自 Linux 系统不同部分的日志消息,并将消息路由到 /var/log 目录中的适当日志文件。 它还可以将日志消息转发到另一台 Linux 服务器。
rsyslog 配置文件
rsyslog 守护程序从 rsyslog.conf
文件中获取其配置信息。 该文件位于 /etc 目录下。
基本上,rsyslog.conf 文件告诉 rsyslog 守护程序将其日志消息保存在哪里。 该指令来自文件中的一系列两部分行。
这个文件可以在 ubuntu 上的 rsyslog.d/50-default.conf
找到。
两部分指令由 selector 和 action 组成。 这两个部分由空格分隔。
选择器部分指定日志消息的来源和重要性,操作部分说明如何处理消息。
选择器本身又被分为由点 (.) 分隔的两部分。 点之前的第一部分称为*acility(消息的来源),点之后的第二部分称为优先级(消息的严重性)。
设施/优先级和操作对一起告诉 rsyslog 在生成符合条件的日志消息时要做什么。
以下是 CentOS rsyslog.conf 文件的摘录:
# rsyslog v5 configuration file ... ... # Include all config files in /etc/rsyslog.d/ IncludeConfig /etc/rsyslog.d/*.conf #### RULES #### # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log ... ...
为了理解这一切意味着什么,让我们考虑一下 Linux 识别的不同类型的设施。 这是一个列表:
- auth 或 authpriv:来自授权和安全相关事件的消息
- kern:来自 Linux 内核的任何消息
- mail:邮件子系统生成的消息
- cron:Cron 守护进程相关消息
- daemon:来自守护进程的消息
- news:来自网络新闻子系统的消息
- lpr:打印相关日志信息
- user:记录来自用户程序的消息
- local0 to local7:保留本地使用
以下是按升序排列的优先级列表:
- debug:来自程序的调试信息
- info:简单的信息性消息 - 无需干预
- notice:可能需要注意的情况
- 警告:警告
- 错误:错误
- crit:临界状态
- alert:需要立即干预的情况
- emerg:紧急情况
所以现在让我们考虑文件中的以下行:
cron.* /var/log/cron
这只是告诉 rsyslog 守护进程将来自 cron 守护进程的所有消息保存在一个名为 /var/log/cron 的文件中。 点 (.) 后的星号 (*) 表示将记录所有优先级的消息。 同样,如果设施被指定为星号,则表示所有来源。
设施和优先级可以通过多种方式关联。
在其默认形式中,当点后仅指定一个优先级时,意味着所有等于或大于该优先级的事件都将被捕获。 因此,以下指令会导致来自邮件子系统且具有警告或更高优先级的任何消息记录在 /var/log 下的特定文件中:
mail.warn /var/log/mail.warn
这将记录等于或大于警告优先级的每条消息,但将所有内容都保留在它之下。 因此,带有 err、crit、alert 或 emerg 的消息也将记录在此文件中。
在点 (.) 之后使用等号 (=) 将导致仅记录指定的优先级。 因此,如果我们只想捕获来自邮件子系统的信息消息,规范将类似于以下内容:
mail.=info /var/log/mail.info
同样,如果我们想捕获邮件子系统中除信息消息之外的所有内容,规范将类似于以下内容
mail.!info /var/log/mail.info
或者
mail.!=info /var/log/mail.info
在第一种情况下,mail.info 文件将包含优先级低于 info 的所有内容。 在第二种情况下,该文件将包含优先级高于 info 的所有消息。
同一行中的多个设施可以用逗号分隔。
同一行中的多个源(facility.priority)用分号分隔。
当操作标记为星号 (*) 时,表示所有用户。 我的 CentOS rsyslog.conf 文件中的这个条目就是这么说的:
# Everybody gets emergency messages *.emerg *
尝试查看 rsyslog.conf 在您的 Linux 系统中的含义。 这是我正在运行的 Debian 服务器的摘录:
# /etc/rsyslog.conf Configuration file for rsyslog. # # For more information see # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html ... ... auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # mail.info -/var/log/mail.info mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Logging for INN news system. # news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice
如您所见,Debian 将所有安全/授权级别消息保存在 /var/log/auth.log
中,而 CentOS 将其保存在 /var/log/secure
中。
rsyslog 的配置也可以来自其他自定义文件。 这些自定义配置文件通常位于 /etc/rsyslog.d 下的不同目录中。 rsyslog.conf 文件使用 $IncludeConfig 指令包含这些目录。
这是它在 Ubuntu 中的样子:
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf .... .... $IncludeConfig /etc/rsyslog.d/*.conf
/etc/rsyslog.d 目录下的内容如下所示:
-rw-r--r-- 1 root root 311 Mar 17 2012 20-ufw.conf -rw-r--r-- 1 root root 252 Apr 11 2012 21-cloudinit.conf -rw-r--r-- 1 root root 1655 Mar 30 2012 50-default.conf
现在日志消息的目的地不一定是日志文件; 消息可以发送到用户的控制台。 在这种情况下,操作字段将包含用户名。 如果多个用户需要接收消息,则他们的用户名用逗号分隔。 如果消息需要广播给每个用户,它由操作字段中的星号 (*) 指定。
由于是网络操作系统的一部分,rsyslog 守护进程不仅可以将日志消息保存在本地,还可以将它们转发到网络中的另一台 Linux 服务器或充当其他系统的存储库。 守护程序在 UDP 端口 514 中侦听日志消息。 下面的示例将内核关键消息转发到名为“texas”的服务器。
kern.crit @texas
创建和测试您自己的日志消息
所以现在是我们创建自己的日志文件的时候了。
为了测试这一点,我们将执行以下操作
- 在 /etc/rsyslog.conf 文件中添加日志文件规范
- 重新启动 rsyslog 守护进程
- 使用记录器实用程序测试配置
在以下示例中,我在 CentOS Linux 系统的 rsyslog.conf 文件中添加了两个新行。 如您所见,它们中的每一个都来自一个名为 local4 的设施,并且它们具有不同的优先级。
[root@TestLinux ~]# vi /etc/rsyslog.conf
.... .... # New lines added for testing log message generation local4.crit /var/log/local4crit.log local4.=info /var/log/local4info.log
接下来,重新启动服务,重新加载配置文件数据:
[root@TestLinux ~]# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] [root@TestLinux ~]#
现在要生成日志消息,调用 logger 应用程序:
[root@TestLinux ~]# logger -p local4.info " This is a info message from local 4"
现在查看 /var/log 目录下会显示两个新文件:
... ... -rw------- 1 root root 0 Dec 9 11:21 local4crit.log -rw------- 1 root root 72 Dec 9 11:22 local4info.log
local4info.log 的大小不为零。 因此,当它打开时,我看到消息已被记录:
[root@TestLinux ~]# cat /var/log/local4info.log
Dec 9 11:22:32 TestLinux root: This is a info message from local 4
轮换日志文件
随着越来越多的信息写入日志文件,它们变得越来越大。 这显然会带来潜在的性能问题。 此外,文件的管理变得繁琐。
Linux 使用“轮换”日志文件的概念,而不是清除或删除它们。 轮换日志时,会创建一个新的日志文件,并重命名旧的日志文件并可选择压缩。 因此,一个日志文件可以有多个在线的旧版本。 这些文件将在一段时间内返回并代表积压。 一旦产生了一定数量的积压,新的日志轮换将导致最旧的日志文件被删除。
轮换是通过 logrotate 实用程序启动的。
logrotate 配置文件
和 rsyslog 一样,logrotate 也依赖于一个配置文件,这个文件的名字是 logrotate.conf。 它位于 /etc 下。
这是我在 Debian 服务器的 logrotate.conf 文件中看到的内容:
debian@debian:~$ cat /etc/logrotate.conf
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 } # system-specific logs may be configured here
这些线条是不言自明的。 默认情况下,日志文件每周轮换一次,任何时候有四个待办事项在线。 当程序运行时,将生成一个新的空日志文件,并且可以选择压缩旧的日志文件。
唯一的例外是 wtmp 和 btmp 文件。 wtmp 跟踪系统登录,btmp 跟踪错误的登录尝试。 这两个日志文件都将每月轮换一次,如果可以找到任何以前的 wtmp 或 btmp 文件,则不会返回错误。
自定义日志轮换配置保存在 etc/logrotate.d 目录下。 这些也包含在带有 include 指令的 logrotate.conf 中。 Debian 安装显示了这个目录的内容:
debian@debian:~$ ls -l /etc/logrotate.d
total 44 -rw-r--r-- 1 root root 173 Apr 15 2011 apt -rw-r--r-- 1 root root 79 Aug 12 2011 aptitude -rw-r--r-- 1 root root 135 Feb 24 2010 consolekit -rw-r--r-- 1 root root 248 Nov 28 2011 cups -rw-r--r-- 1 root root 232 Sep 19 2012 dpkg -rw-r--r-- 1 root root 146 May 12 2011 exim4-base -rw-r--r-- 1 root root 126 May 12 2011 exim4-paniclog -rw-r--r-- 1 root root 157 Nov 16 2010 pm-utils -rw-r--r-- 1 root root 94 Aug 8 2010 ppp -rw-r--r-- 1 root root 515 Nov 30 2010 rsyslog -rw-r--r-- 1 root root 114 Nov 26 2008 unattended-upgrades
rsyslog 的内容显示了如何回收一些日志文件:
debian@debian:~$ cat /etc/logrotate.d/rsyslog
/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog reload > /dev/null endscript } /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload > /dev/null endscript }
如您所见,系统日志文件将每天重新初始化,并保留 7 天的在线日志。 其他日志文件每周轮换一次。
另外值得注意的是 postrotate 指令。 这指定了在整个日志轮换完成后发生的操作。
测试旋转
可以手动运行 Logrotate 以回收一个或多个文件。 为此,我们只需将相关配置文件指定为命令的参数。
要了解它是如何工作的,这里是我的测试 CentOS 服务器中 /var/log 目录下的部分日志文件列表:
[root@TestLinux ~]# ls -l /var/log
total 800 ... -rw------- 1 root root 359 Dec 17 18:25 maillog -rw-------. 1 root root 1830 Dec 16 16:35 maillog-20131216 -rw------- 1 root root 30554 Dec 17 18:25 messages -rw-------. 1 root root 180429 Dec 16 16:35 messages-20131216 -rw------- 1 root root 591 Dec 17 18:28 secure -rw-------. 1 root root 4187 Dec 16 16:41 secure-20131216 ... ...
logrotate.conf 文件的部分内容如下所示:
[root@TestLinux ~]# cat /etc/logrotate.conf
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create ... ...
接下来我们运行 logrotate 命令:
[root@TestLinux ~]# logrotate -fv /etc/logrotate.conf
当生成新文件、遇到错误等时,消息会滚动。 尘埃落定后,我们会尝试检查新邮件、安全或消息文件:
[root@TestLinux ~]# ls -l /var/log/mail* -rw------- 1 root root 0 Dec 17 18:34 /var/log/maillog -rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216 -rw------- 1 root root 359 Dec 17 18:25 /var/log/maillog-20131217 [root@TestLinux ~]# ls -l /var/log/messages* -rw------- 1 root root 148 Dec 17 18:34 /var/log/messages -rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 -rw------- 1 root root 30554 Dec 17 18:25 /var/log/messages-20131217 [root@TestLinux ~]# ls -l /var/log/secure* -rw------- 1 root root 0 Dec 17 18:34 /var/log/secure -rw-------. 1 root root 4187 Dec 16 16:41 /var/log/secure-20131216 -rw------- 1 root root 591 Dec 17 18:28 /var/log/secure-20131217 [root@TestLinux ~]#
正如我们所看到的,所有三个新的日志文件都已创建。 邮件日志和安全文件仍然是空的,但新消息文件中已经包含一些数据。
最后的话
希望本教程为您提供了有关 Linux 日志记录的一些想法。 您可以尝试研究自己的开发或测试系统以获得更好的想法。 一旦您熟悉了日志文件的位置及其配置设置,就可以使用这些知识来支持您的生产系统。 然后也许您可以创建一些别名来指向这些文件,以节省一些打字时间。