Linux日志配置全攻略:Ubuntu、Debian和CentOS系统查看与管理方法
引言
Linux系统管理员经常需要查看日志文件以便进行故障排除。这是系统管理员首先要做的事情之一。
Linux和在其上运行的应用程序可以生成各种类型的消息,这些消息被记录在不同的日志文件中。Linux使用一组配置文件、目录、程序、命令和守护进程来创建、存储和回收这些日志消息。因此,了解系统保存其日志文件的位置以及如何使用相关命令可以在故障排除过程中节省宝贵的时间。
在这个教程中,我们将研究Linux日志机制的不同部分。
免责声明:本教程中的命令经过测试,适用于纯净安装的CentOS 9、Ubuntu 22.10和Debian 11。
第一步 – 检查默认的日志文件位置
在Linux中,默认的日志文件位置是/var/log。您可以使用以下命令查看该目录中的日志文件列表。
- ls -l /var/log
您在CentOS系统上会看到类似于这样的输出:
[root@centos-9-trim ~]# ls -l /var/log
total 49316
drwxr-xr-x. 2 root root 6 Sep 27 19:17 anaconda
drwx------. 2 root root 99 Jan 3 08:23 audit
-rw-rw----. 1 root utmp 1234560 Jan 3 16:16 btmp
-rw-rw----. 1 root utmp 17305344 Jan 1 00:00 btmp-20230101
drwxr-x---. 2 chrony chrony 6 Aug 10 2021 chrony
-rw-r--r--. 1 root root 130466 Dec 8 22:12 cloud-init.log
-rw-r-----. 1 root adm 10306 Dec 8 22:12 cloud-init-output.log
-rw-------. 1 root root 36979 Jan 3 16:03 cron
-rw-------. 1 root root 27360 Dec 10 23:15 cron-20221211
-rw-------. 1 root root 94140 Dec 17 23:07 cron-20221218
-rw-------. 1 root root 95126 Dec 24 23:14 cron-20221225
-rw-------. 1 root root 95309 Dec 31 23:04 cron-20230101
...
第二步 – 查看日志文件内容
以下是在/var/log目录下您会找到的一些常见的日志文件:
- wtmp
- utmp
- dmesg
- messages
- maillog 或 mail.log
- spooler
- auth.log 或 secure
wtmp和utmp文件记录着用户登录和退出系统的情况。您不能直接使用控制台中的cat命令读取这些文件的内容——需要使用其他特定的命令,而您将使用其中的一些命令。
要查看当前登录到Linux服务器上的用户,可以使用who命令。该命令从/var/run/utmp文件(对于CentOS和Debian)或/run/utmp文件(对于Ubuntu)获取其数据。
这里有一个来自Ubuntu的例子:
root@ubuntu-22:~# who
root pts/0 2023-01-03 16:23 (198.211.111.194)
在这个特定的情况下,我们是该系统的唯一使用者。
last命令可以告诉您用户的登录历史:
root@ubuntu-22:~# last
root pts/0 198.211.111.194 Tue Jan 3 16:23 still logged in
reboot system boot 5.19.0-23-generi Thu Dec 8 21:48 still running
wtmp begins Thu Dec 8 21:48:51 2022
您还可以使用last命令,并通过管道(|)为特定用户添加grep搜索。
要查找系统上一次重新启动的时间,可以运行以下命令:
- last reboot
在Debian中可能会呈现如下结果:
root@debian-11-trim:~# last reboot
reboot system boot 5.10.0-11-amd64 Thu Dec 8 21:49 still running
wtmp begins Thu Dec 8 21:49:39 2022
要查看某人上次登录系统的时间,请使用lastlog命令:
- lastlog
在Debian服务器上,您可能会看到如下输出:
root@debian-11-trim:~# lastlog
Username Port From Latest
root pts/0 162.243.188.66 Tue Jan 3 16:23:03 +0000 2023
daemon **从未登录**
bin **从未登录**
sys **从未登录**
sync **从未登录**
games **从未登录**
man **从未登录**
lp **从未登录**
mail **从未登录**
news **从未登录**
uucp **从未登录**
proxy **从未登录**
www-data **从未登录**
backup **从未登录**
list **从未登录**
irc **从未登录**
gnats **从未登录**
nobody **从未登录**
_apt **从未登录**
messagebus **从未登录**
uuidd **从未登录**
...
对于其他基于文本的日志文件,您可以使用cat、head或tail命令来阅读内容。
在下面的示例中,您尝试查看Debian服务器上/var/log/messages文件的最后十行:
- sudo tail /var/log/messages
您会收到一个类似于这样的输出:
(输出内容)
root@debian-11-trim:~# tail /var/log/messages
Jan 1 00:10:14 debian-11-trim rsyslogd: [origin software="rsyslogd" swVersion="8.2102.0" x-pid="30025" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 ssh_watcher.go:65: [SSH Watcher] Port knocking detected.
Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:43: [DO-Managed Keys Actioner] Metadata contains 1 ssh keys and 1 dotty keys
Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:49: [DO-Managed Keys Actioner] Attempting to update 1 dotty keys
Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:70: [DO-Managed Keys Actioner] Updating 2 keys
Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:75: [DO-Managed Keys Actioner] Keys updated
第三步 – 使用rsyslog守护进程
在日志记录机制的核心是rsyslog守护程序。该服务负责监听来自Linux系统不同部分的日志消息,并将消息路由到/var/log目录中的适当日志文件。它还可以将日志消息转发到另一台Linux服务器。
rsyslog配置文件
rsyslog守护进程从rsyslog.conf文件中获取其配置信息。该文件位于/etc目录下。
rsyslog.conf文件告诉rsyslog守护进程日志消息的保存位置。这个指令由文件中的一系列两部分的行提供。
这个文件可以在Ubuntu的rsyslog.d/50-default.conf路径下找到。
这个由两部分指令组成,包括一个选择器和一个动作。这两部分由空格分隔。
选择器部分指定了日志消息的来源和重要性,而动作部分则说明了如何处理该消息。
选择器本身又分为由句点(.)分隔的两个部分。句点之前的第一部分被称为设施(消息的来源),句点之后的第二部分被称为优先级(消息的严重程度)。
一起,设施/优先级和动作对告诉rsyslog在生成符合条件的日志消息时应该做什么。
您可以使用以下命令查看CentOS /etc/rsyslog.conf文件的摘录:
- cat /etc/rsyslog.conf
你应该看到像这样的输出。
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
#### MODULES ####
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
…
为了理解这一切的含义,让我们考虑Linux所认可的不同类型的设施。以下是一个列表:
- auth或authpriv:来自授权和安全相关事件的消息
- kern:来自Linux内核的任何消息
- mail:由邮件子系统生成的消息
- cron:与Cron守护进程相关的消息
- daemon:来自守护进程的消息
- news:来自网络新闻子系统的消息
- lpr:与打印相关的日志消息
- user:来自用户程序的日志消息
- local0到local7:保留供本地使用
这里是按升序排列的优先级列表:
- debug:来自程序的调试信息
- info:简单的信息性消息 – 不需要干预
- notice:可能需要注意的情况
- warn:警告
- err:错误
- crit:严重情况
- alert:需要立即干预的情况
- emerg:紧急情况
现在我们来考虑一下文件中的以下行内容:
…
# Log cron stuff
cron.* /var/log/cron
…
这仅仅是告诉rsyslog守护进程将来自cron守护进程的所有消息保存到一个名为/var/log/cron的文件中。句点后面的星号(*)表示所有优先级的消息都将被记录。同样地,如果设施被指定为星号,那么它将表示所有来源。
设施和优先级可以以多种方式相关联。
在默认情况下,当点号之后只指定了一个优先级时,它意味着所有等于或高于该优先级的事件都将被捕获。因此,以下指令会导致来自邮件子系统的任何优先级为警告或更高的消息被记录在/var/log目录下的特定文件中。
mail.warn /var/log/mail.warn
这将记录所有警告级别等于或高于该级别的消息,但会排除所有低于该级别的消息。因此,此文件中也将记录错误、严重、警报或紧急级别的消息。
在句号后面使用等号(=)将仅记录指定优先级的日志。所以,如果我们只想捕获来自邮件子系统的信息消息,配置应该类似以下内容:
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文件中的这个条目所表达的就是这个意思:
# 所有人都会收到紧急消息
*.emerg :omusrmsg:*
尝试查看您的Linux系统中rsyslog.conf文件的内容。以下是来自另一台Debian服务器的摘录作为示例:
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
module(load="imklog") # provides kernel logging support
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
…
正如你所见,Debian将所有安全和授权级别的消息保存在/var/log/auth.log中,而CentOS则保存在/var/log/secure下。
rsyslog的配置还可以来自其他自定义文件。这些自定义配置文件通常位于/etc/rsyslog.d目录下。rsyslog.conf文件使用$IncludeConfig指令引入这些目录。
这是在Ubuntu中的外观:
…
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
…
使用以下命令查看位于/etc/rsyslog.d目录下的内容:
- ls -l /etc/rsyslog.d
您将在您的终端机上看到类似这样的内容:
-rw-r--r-- 1 root root 314 Sep 19 2021 20-ufw.conf
-rw-r--r-- 1 root root 255 Sep 30 22:07 21-cloudinit.conf
-rw-r--r-- 1 root root 1124 Nov 16 2021 50-default.conf
日志消息的目的地不一定是日志文件,消息可以发送到用户的控制台。在这种情况下,动作字段将包含用户名。如果需要向多个用户发送消息,他们的用户名之间用逗号分隔。如果需要广播消息给每个用户,则在动作字段中用星号(*)指定。
由于是网络操作系统的一部分,rsyslog守护程序不仅可以将日志消息存储在本地,还可以将其转发到网络中的其他Linux服务器,或者作为其他系统的存储库。该守护程序在UDP端口514上监听日志消息。以下示例将内核关键消息转发到名为”texas”的服务器:
kern.crit @texas
步骤四 – 创建和测试您自己的日志信息
现在是时候让您自己创建日志文件了。为了测试此功能,您将按以下步骤操作:
- 在/etc/rsyslog.conf文件中添加日志文件规范
- 重启rsyslog守护程序
- 使用logger工具测试配置
在下面的示例中,您将在CentOS Linux系统的rsyslog.conf文件中添加两行新的代码。正如您通过以下命令所看到的那样,它们都来自一个名为local4的设施,并且具有不同的优先级:
- vi /etc/rsyslog.conf
这是文章《如何在Ubuntu、Debian和CentOS中查看和配置Linux日志》的第4部分(共5部分)。
… # 新增的行用于测试日志消息生成
local4.crit /var/log/local4crit.log
local4.=info /var/log/local4info.log
接下来,您需要重新启动服务,以重新加载配置文件数据。
为了现在生成日志信息,调用了日志记录应用程序。
现在查看/var/log目录下显示了两个新文件。
-rw——- 1 root root 72 Jan 3 11:22 local4info.log …
当你打开local4info.log时,你会看到已经记录了消息,因为它的大小不为零。
第五步 – 轮换日志文件
随着越来越多的信息被记录在日志文件中,它们变得越来越大。这显然带来了潜在的性能问题。此外,文件的管理变得繁琐。
Linux使用轮换日志文件的概念来替代清除或删除日志文件。当日志文件被轮换时,会创建一个新的日志文件并将旧的日志文件重命名,同时可选择进行压缩。因此,一个日志文件可以保留多个旧版本在线上。这些文件会保存一段时间,并代表了积压的日志。一旦产生了一定数量的积压,新的日志轮换将导致最旧的日志文件被删除。
轮换是通过logrotate实用程序发起的。
日志轮换配置文件的设置
就像rsyslog一样,logrotate也依赖于一个配置文件,这个文件的名称是logrotate.conf。它位于/etc目录下。
以下是您在Debian服务器的logrotate.conf文件中所看到的内容。
# global options do not affect preceding include directives
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
#dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may also be configured here.
默认情况下,日志文件每周轮换一次,同时在线保留四个存档。当程序运行时,将生成一个新的空日志文件,可选择是否压缩旧日志文件。
唯一的例外是wtmp和btmp文件。wtmp文件用于跟踪系统登录记录,而btmp文件用于记录错误的登录尝试。这两个日志文件每个月都要进行轮换,如果找到任何以前的wtmp或btmp文件,不会返回错误。
自定义日志轮换配置保存在/etc/logrotate.d目录下。这些配置也会在logrotate.conf文件中通过include指令进行包含。Debian安装会显示此目录的内容。
-rw-r–r– 1 root root 120 Jan 30 2021 alternatives
-rw-r–r– 1 root root 173 Jun 10 2021 apt
-rw-r–r– 1 root root 130 Oct 14 2019 btmp
-rw-r–r– 1 root root 160 Oct 19 2021 chrony
-rw-r–r– 1 root root 112 Jan 30 2021 dpkg
-rw-r–r– 1 root root 374 Feb 17 2021 rsyslog
-rw-r–r– 1 root root 235 Feb 19 2021 unattended-upgrades
-rw-r–r– 1 root root 145 Oct 14 2019 wtmp
rsyslog 的内容展示了如何轮换一系列日志文件。
/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
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
如你所见,消息文件每天都会重新初始化,保留四天的日志在线。其他日志文件每周轮换一次。
值得注意的是 postrotate 指令。它指定了在整个日志轮换完成后发生的动作。
第六步 – 测试轮换
这是文章《如何在Ubuntu、Debian和CentOS中查看和配置Linux日志》的第5部分(共5部分)。
在Linux系统中,您可以手动运行logrotate来循环利用一个或多个日志文件。为此,您需要将相关的配置文件作为命令的参数来指定。
为了演示这个过程,我们在一个测试的CentOS服务器的/var/log目录下查看日志文件列表。
ls -l /var/log
total 49324
-rw-------. 1 root root 84103 Jan 3 17:20 messages
-rw-------. 1 root root 165534 Dec 10 23:12 messages-20221211
-rw-------. 1 root root 254743 Dec 18 00:00 messages-20221218
-rw-------. 1 root root 217810 Dec 25 00:00 messages-20221225
-rw-------. 1 root root 237726 Dec 31 23:45 messages-20230101
drwx------. 2 root root 6 Mar 2 2022 private
drwxr-xr-x. 2 root root 6 Feb 24 2022 qemu-ga
lrwxrwxrwx. 1 root root 39 Mar 2 2022 README -> ../../usr/share/doc/systemd/README.logs
-rw-------. 1 root root 2514753 Jan 3 17:25 secure
-rw-------. 1 root root 2281107 Dec 10 23:59 secure-20221211
-rw-------. 1 root root 9402839 Dec 17 23:59 secure-20221218
-rw-------. 1 root root 8208657 Dec 25 00:00 secure-20221225
-rw-------. 1 root root 7081010 Dec 31 23:59 secure-20230101
drwxr-x---. 2 sssd sssd 6 Jan 17 2022 sssd
-rw-------. 1 root root 0 Dec 8 22:11 tallylog
-rw-rw-r--. 1 root utmp 2688 Jan 3 16:22 wtmp
logrotate.conf文件的部分内容如下所示:
cat /etc/logrotate.conf
# 详见"man logrotate"
# 全局选项不会影响前面的include指令
# 每周轮换日志文件
weekly
# 保留4周的备份日志
rotate 4
# 轮换旧日志文件后创建新的(空)日志文件
create
# 使用日期作为轮换文件的后缀
dateext
# 如果您想压缩日志文件,请取消此行的注释
#compress
# 软件包将日志轮换信息放入此目录
include /etc/logrotate.d
# 特定于系统的日志也可以在这里配置。
接下来你运行logrotate命令。
logrotate -fv /etc/logrotate.conf
在产生新文件、遇到错误等情况下,消息会逐渐滚动显示。等到一切平息下来,你可以检查是否有新的邮件、安全或消息文件。
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
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
ls -l /var/log/secure*
-rw------- 1 root root 0 Jan 3 12:34 /var/log/secure
-rw-------. 1 root root 4187 Jan 3 16:41 /var/log/secure-20230103
-rw------- 1 root root 591 Jan 3 18:28 /var/log/secure-20230103
正如我们所见,已经创建了三个新的日志文件。邮件日志和安全文件仍然为空,但新建的消息文件里已经有了一些数据。
结论
希望这个教程能为您提供关于Linux日志记录的一些思路。您可以尝试查看自己的开发或测试系统,以更好地了解。一旦您熟悉了日志文件的位置和配置设置,就可以利用这些知识来支持您的生产系统。然后,您可以创建一些别名来指向这些文件,以节省输入时间。