如何查看和配置Linux的日志在Ubuntu和CentOS

Linux和运行其上可以产生的所有不同类型的消息,它被记录在不同的日志文件的应用程序。 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:

  • wtmp

  • utmp

  • dmesg

  • 消息

  • maillog或mail.log

  • 假脱机

  • auth.log或secure

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运行服务器,并以root身份从控制台和SSH会话访问它。 另外两个用户帐户(sysadmin和joebolg)也在访问系统。

最后一个命令告诉我们用户的登录历史:

[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文件的最后10行:

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守护程序在哪里保存其日志消息。 该指令来自文件中的一系列两部分行。

这个文件可以在这里找到rsyslog.d/50-default.conf ubuntu上。

两部分指令由一个选择器和一个动作 两部分由空格分隔。

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

选择器本身又被分成由点(。)分隔的两个部分。 点之前的第一部分称为* 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时 :邮件从授权和安全有关的事件到来
  • 克恩 :任何消息来自Linux内核的未来
  • 邮件 :通过邮件子系统生成的消息
  • 的cron:cron守护程序有关的消息
  • 守护 :邮件从未来的守护进程
  • 消息 :邮件从网络新闻子系统来
  • LPR:打印相关的日志信息
  • 用户 :登录与用户程序来的消息
  • 在local0到为local7:保留供本地使用

下面是升序排列的优先级列表:

  • 调试 :从程序的调试信息
  • 信息 :简单参考消息-无需干预
  • 声明 :条件,可能需要关注
  • 警告 :警告
  • 错误 :错误
  • 暴击 :病情危重
  • 警报 :条件,需要立即采取干预措施
  • 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

再次,如果我们想捕获除了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守护程序

  • 使用logger实用程序测试配置

在下面的示例中,我在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 ~]#    

到现在为止产生的日志信息, 记录器应用程序称为:

[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实用程序启动旋转。

日志配置文件

像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目录下。 这些也包含在logrotate.conf中include指令。 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  
}  

如您所见,syslog文件将每天重新初始化,并保持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 ~]#  

我们可以看到,所有三个新的日志文件已经创建。 maillog和安全文件仍为空,但新消息文件中已有一些数据。

最后一句话

希望本教程给了你一些关于Linux日志的想法。 你可以尝试看看你自己的开发或测试系统有一个更好的想法。 熟悉日志文件的位置及其配置设置后,请使用该知识来支持您的生产系统。 然后也许你可以创建一些别名指向这些文件,以节省一些打字时间。

提交者:Sadequl Hussain