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

两部分指令由 selectoraction 组成。 这两个部分由空格分隔。

选择器部分指定日志消息的来源和重要性,操作部分说明如何处理消息。

选择器本身又被分为由点 (.) 分隔的两部分。 点之前的第一部分称为*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 识别的不同类型的设施。 这是一个列表:

  • authauthpriv:来自授权和安全相关事件的消息
  • 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 日志记录的一些想法。 您可以尝试研究自己的开发或测试系统以获得更好的想法。 一旦您熟悉了日志文件的位置及其配置设置,就可以使用这些知识来支持您的生产系统。 然后也许您可以创建一些别名来指向这些文件,以节省一些打字时间。

提交人:Sadequl Hussain