如何在Ubuntu、Debian和CentOS中查看和配置Linux日志
开头
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 or mail.log
- spooler
- auth.log or 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)
在这个特定的情况下,我们是该系统的唯一使用者。
最后一个命令告诉你用户的登录历史。
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
您还可以使用最后一条命令,并通过管道(|)为特定用户添加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 **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
你会收到一个类似于这样的输出。
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 or authpriv: Messages coming from authorization and security related events
- kern: Any message coming from the Linux kernel
- mail: Messages generated by the mail subsystem
- cron: Cron daemon related messages
- daemon: Messages coming from daemons
- news: Messages coming from network news subsystem
- lpr: Printing related log messages
- user: Log messages coming from user programs
- local0 to local7: Reserved for local use
这里是按升序排列的优先级列表。
- debug: Debug information from programs
- info: Simple informational message – no intervention is required
- notice: Condition that may require attention
- warn: Warning
- err: Error
- crit: Critical condition
- alert: Condition that needs immediate intervention
- emerg: Emergency condition
现在我们来考虑一下文件中的以下行内容。
… # 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文件中的这个条目所表达的就是这个意思。
# Everybody gets emergency messages *.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
步骤四 – 创建和测试您自己的日志信息
现在是时候让你自己创建日志文件了。为了测试此功能,你将按以下步骤操作:
- Add a log file specification in /etc/rsyslog.conf file
- Restart the rsyslog daemon
- Test the configuration using the logger utility
在下面的示例中,您将在CentOS Linux系统的rsyslog.conf文件中添加两行新的代码。正如您通过以下命令所看到的那样,它们都来自一个名为local4的设施,并且具有不同的优先级。
- vi /etc/rsyslog.conf
这是输出结果。
… # 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目录下显示了两个新文件。
… -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
Jan 3 11:22:32 TestLinux root: This is a info message from local 4
第五步 – 轮流日志文件
随着越来越多的信息被记录在日志文件中,它们变得越来越大。这显然带来了潜在的性能问题。此外,文件的管理变得繁琐。
Linux使用旋转日志文件的概念来替代清除或删除日志文件。当日志文件被旋转时,会创建一个新的日志文件并将旧的日志文件重命名,同时可选择进行压缩。因此,一个日志文件可以保留多个旧版本在线上。这些文件会保存一段时间,并代表了积压的日志。一旦产生了一定数量的积压,新的日志旋转将导致最旧的日志文件被删除。
旋转是通过logrotate实用程序发起的。
日志轮换配置文件的设置
就像rsyslog一样,logrotate也依赖于一个配置文件,这个文件的名称是logrotate.conf。它位于/etc目录下。
以下是您在Debian服务器的logrotate.conf文件中所看到的内容。
- cat /etc/logrotate.conf
# 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目录下。这些配置也会在logrotate.conf文件中通过include指令进行包含。Debian安装会显示此目录的内容。
- ls -l /etc/logrotate.d
total 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
/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 }
如你所见,消息文件每天都会重新初始化,保留四天的日志在线。其他日志文件每周轮换一次。
值得注意的是 postrotate 指令。它指定了在整个日志轮换完成后发生的动作。
第六步 – 测试旋转
在中文中,只需要一个选项:可以手动运行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
# 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
在产生新文件、遇到错误等情况下,消息会逐渐滚动。等到一切平息下来,你可以检查是否有新邮件、安全或消息文件。
- 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日志记录给你一些思路。你可以尝试查看自己的开发或测试系统,更好地了解。一旦你熟悉了日志文件的位置和配置设置,利用这些知识来支持你的生产系统。然后,你可以创建一些别名来指向这些文件,以节省打字时间。