如何在 Ubuntu、Debian 和 CentOS 上查看和配置 Linux 日志
介绍
Linux 系统管理员经常需要查看日志文件以进行故障排除。这是系统管理员要做的第一件事。
Linux 和在其上运行的应用程序可以生成所有不同类型的消息,这些消息记录在各种日志文件中。 Linux 使用一组配置文件、目录、程序、命令和守护进程来创建、存储和回收这些日志消息。因此,了解系统将其日志文件保存在何处以及如何使用相关命令有助于在故障排除期间节省宝贵的时间。
在本教程中,我们将了解 Linux 日志记录机制的不同部分。
免责声明
本教程中的命令在 CentOS 9、Ubuntu 22.10 和 Debian 11 的普通安装中进行了测试。
第 1 步 - 检查默认日志文件位置
Linux 中日志文件的默认位置是 /var/log
。您可以使用以下命令查看该目录中的日志文件列表:
- ls -l /var/log
你会在你的 CentOS 系统上看到类似的东西:
Output[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
…
第 2 步 - 查看日志文件内容
以下是您可以在 /var/log
下找到的一些常见日志文件:
wtmp
utmp
dmesg
消息
maillog
或mail.log
后台处理程序
auth.log
或secure
wtmp
和 utmp
文件跟踪用户登录和退出系统。您不能在终端中使用 cat
命令直接读取这些文件的内容——还有其他特定命令,您将使用其中一些命令。
要查看当前登录到 Linux 服务器的用户,请使用 who
命令。此命令从 /var/run/utmp
文件(对于 CentOS 和 Debian)或 /run/utmp
(对于 Ubuntu)获取其值。
这是一个来自 Ubuntu 的例子:
Outputroot@ubuntu-22:~# who
root pts/0 2023-01-03 16:23 (198.211.111.194)
在这种特殊情况下,我们是系统的唯一用户。
last
命令告诉您用户的登录历史:
Outputroot@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 中,结果可能如下所示:
Outputroot@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 服务器上,您可能会看到如下输出:
Outputroot@debian-11-trim:~# lastlog
Username Port From Latest
root pts/0 162.243.188.66 Tue Jan 3 16:23:03 +0000 2023
daemon **Never logged in**
bin **Never logged in**
sys **Never logged in**
sync **Never logged in**
games **Never logged in**
man **Never logged in**
lp **Never logged in**
mail **Never logged in**
news **Never logged in**
uucp **Never logged in**
proxy **Never logged in**
www-data **Never logged in**
backup **Never logged in**
list **Never logged in**
irc **Never logged in**
gnats **Never logged in**
nobody **Never logged in**
_apt **Never logged in**
messagebus **Never logged in**
uuidd **Never logged in**
…
对于其他基于文本的日志文件,您可以使用cat
、head
或tail
命令来读取内容。
在下面的示例中,您试图查看 Debian 服务器上 /var/log/messages
文件的最后十行:
- sudo tail /var/log/messages
您将收到类似于此的输出:
Outputroot@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 DropletAgent[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 DropletAgent[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 DropletAgent[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 DropletAgent[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 DropletAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:75: [DO-Managed Keys Actioner] Keys updated
第 3 步 - 使用 rsyslog 守护进程
日志记录机制的核心是 rsyslog
守护进程。此服务负责侦听来自 Linux 系统不同部分的日志消息,并将消息路由到 /var/log
目录中的适当日志文件。它还可以将日志消息转发到另一台 Linux 服务器。
rsyslog 配置文件
rsyslog
守护进程从 rsyslog.conf
文件中获取其配置信息。该文件位于 /etc
目录下。
rsyslog.conf
文件告诉 rsyslog
守护进程在哪里保存它的日志消息。该指令来自文件中一系列由两部分组成的行。
该文件可以在 Ubuntu 上的 rsyslog.d/50-default.conf
中找到。
两部分指令由一个选择器 和一个操作 组成。这两部分由空白分隔。
选择器部分指定日志消息的来源和重要性,操作部分说明如何处理消息。
选择器本身又分为两部分,用点 (.
) 分隔。点之前的第一部分称为设施(消息的来源),点之后的第二部分称为优先级(消息的严重性)。
facility/priority 和 action 对一起告诉 rsyslog
在生成符合条件的日志消息时要做什么。
您可以使用以下命令查看 CentOS /etc/rsyslog.conf
文件的摘录:
- cat /etc/rsyslog.conf
你应该看到类似这样的输出:
Output# 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 守护进程相关消息
- 守护进程:来自守护进程的消息
- news:来自网络新闻子系统的消息
- lpr:打印相关日志信息
- 用户:来自用户程序的日志消息
- local0 到 local7:保留供本地使用
以下是按升序排列的优先级列表:
- debug:来自程序的调试信息
- info:简单的信息性消息 - 无需干预
- 注意:可能需要注意的情况
- 警告:警告
- err:错误
- crit:临界状态
- 警报:需要立即干预的情况
- emerg:紧急情况
现在让我们考虑文件中的以下行:
Output…
# Log cron stuff
cron.* /var/log/cron
…
这只是告诉 rsyslog
守护进程将来自 cron
守护进程的所有消息保存在名为 /var/log/cron
的文件中。点后的星号 (*
) 表示将记录所有优先级的消息。同样,如果将设施指定为星号,则表示所有来源。
设施和优先级可以通过多种方式关联。
在其默认形式中,当点后仅指定一个优先级时,这意味着所有等于或大于该优先级的事件都将被捕获。因此,以下指令会导致来自邮件子系统且具有警告或更高优先级的任何消息被记录在 /var/log
下的特定文件中:
Outputmail.warn /var/log/mail.warn
这将记录等于或大于警告优先级的每条消息,但保留低于它的所有消息。因此,带有err
、crit
、alert
或emerg
的消息也会记录在该文件中。
在点之后使用等号 (=
) 将导致仅记录指定的优先级。因此,如果我们只想捕获来自邮件子系统的信息消息,则规范如下所示:
Outputmail.=info /var/log/mail.info
同样,如果我们想从邮件子系统捕获除信息消息之外的所有内容,规范将类似于以下内容
Outputmail.!info /var/log/mail.info
或者
Outputmail.!=info /var/log/mail.info
在第一种情况下,mail.info
文件将包含优先级低于 info 的所有内容。在第二种情况下,该文件将包含优先级高于信息的所有消息。
同一行中的多个设施可以用逗号分隔。
同一行中的多个源 (facility.priority
) 用分号分隔。
当一个动作被标记为星号时,它意味着所有用户。这是 CentOS rsyslog.conf
文件中的一个条目,它的意思是:
Output# Everybody gets emergency messages
*.emerg :omusrmsg:*
尝试查看 rsyslog.conf
在您的 Linux 系统中说的是什么。这是另一个示例的 Debian 服务器的摘录:
Output# /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 中的样子:
Output…
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
…
查看 /etc/rsyslog.d
目录下的内容:
- ls -l /etc/rsyslog.d
您会在终端中看到类似的内容:
Output-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”的服务器。
Outputkern.crit @texas
第 4 步 - 创建和测试您自己的日志消息
所以现在是您创建自己的日志文件的时候了。要对此进行测试,您将执行以下操作:
- 在
/etc/rsyslog.conf
文件中添加日志文件规范 - 重新启动
rsyslog
守护进程 - 使用记录器实用程序测试配置
在以下示例中,您将在 CentOS Linux 系统的 rsyslog.conf
文件中添加两行。正如您可以通过以下命令看到的那样,它们中的每一个都来自名为 local4 的设施,并且它们具有不同的优先级。
- vi /etc/rsyslog.conf
这是输出:
Output…
# New lines added for testing log message generation
local4.crit /var/log/local4crit.log
local4.=info /var/log/local4info.log
接下来,您将重新启动服务,以便重新加载配置文件数据:
- /etc/init.d/rsyslog restart
现在要生成日志消息,调用记录器应用程序:
- logger -p local4.info " This is a info message from local 4"
在 /var/log
目录下查看现在显示两个新文件:
Output…
-rw------- 1 root root 0 Jan 3 11:21 local4crit.log
-rw------- 1 root root 72 Jan 3 11:22 local4info.log
…
local4info.log
的大小不为零。所以当你打开它时,你会看到消息已经被记录下来:
- cat /var/log/local4info.log
OutputJan 3 11:22:32 TestLinux root: This is a info message from local 4
第 5 步 - 轮换日志文件
随着越来越多的信息被写入日志文件,它们变得越来越大。这显然会带来潜在的性能问题。此外,文件的管理变得麻烦。
Linux 使用循环日志文件的概念,而不是清除或删除它们。轮转日志时,会创建一个新的日志文件,旧的日志文件会被重命名并可选择进行压缩。因此,一个日志文件可以有多个旧版本保持在线。这些文件将在一段时间内返回并代表积压。一旦产生了一定数量的积压,新的日志轮换将导致最旧的日志文件被删除。
旋转是通过 logrotate
实用程序启动的。
logrotate 配置文件
和rsyslog
一样,logrotate
也依赖于一个配置文件,这个文件的名字是logrotate.conf
。它位于 /etc
下。
以下是您在 Debian 服务器的 logrotate.conf
文件中看到的内容:
- cat /etc/logrotate.conf
Output# see "man logrotate" for details
# 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
目录下。这些也包含在带有 include
指令的 logrotate.conf
中。 Debian 安装显示该目录的内容:
- ls -l /etc/logrotate.d
Outputtotal 32
-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
的内容显示了如何回收多个日志文件:
- cat /etc/logrotate.d/rsyslog
Output/var/log/syslog
/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
}
如您所见,messages
文件将每天重新初始化,并在线保留四天的日志。其他日志文件每周轮换一次。
同样值得注意的是 postrotate
指令。这指定了在整个日志轮换完成后发生的操作。
第 6 步 - 测试旋转
logrotate
可以手动运行以回收一个或多个文件。为此,您将相关的配置文件指定为命令的参数。
要查看其工作原理,这里是测试 CentOS 服务器中 /var/log
目录下的部分日志文件列表:
- ls -l /var/log
Outputtotal 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
Output# see "man logrotate" for details
# 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 be also be configured here.
接下来运行 logrotate
命令:
- logrotate -fv /etc/logrotate.conf
当生成新文件、遇到错误等时,消息会滚动。当尘埃落定后,您检查新的 mail
、secure
或 messages
文件:
- ls -l /var/log/mail*
Output-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*
Output-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 ```
正如我们所见,所有三个新日志文件都已创建。 maillog
和 secure
文件仍然是空的,但是新的 messages
文件中已经有一些数据了。
结论
希望本教程已经为您提供了有关 Linux 日志记录的一些想法。您可以尝试查看自己的开发或测试系统以获得更好的想法。一旦您熟悉了日志文件的位置及其配置设置,就可以使用这些知识来支持您的生产系统。然后您可以创建一些别名来指向这些文件,以节省一些打字时间。