如何在 Ubuntu、Debian 和 CentOS 上查看和配置 Linux 日志

介绍

Linux 系统管理员经常需要查看日志文件以解决问题,这是 sysadmin 会做的第一件事。

Linux 和运行在其上的应用程序可以生成所有不同类型的消息,这些消息被记录在各种日志文件中。Linux 使用一组配置文件,目录,程序,命令和戴蒙来创建,存储和回收这些日志消息。

在本教程中,我们将看看Linux日志机制的不同部分。

** Disclaimer**

本教程中的命令在CentOS 9,Ubuntu 22.10和Debian 11的平凡的子安装中进行了测试。

步骤 1 - 检查默认日志文件的位置

Linux 中的日志文件的默认位置是 /var/log. 您可以使用以下命令查看本目录中的日志文件列表:

1ls -l /var/log

您将在您的 CentOS 系统中看到类似的东西:

 1[secondary_label Output]
 2[root@centos-9-trim ~]# ls -l /var/log
 3total 49316
 4drwxr-xr-x. 2 root root 6 Sep 27 19:17 anaconda
 5drwx------. 2 root root 99 Jan 3 08:23 audit
 6-rw-rw----. 1 root utmp 1234560 Jan 3 16:16 btmp
 7-rw-rw----. 1 root utmp 17305344 Jan 1 00:00 btmp-20230101
 8drwxr-x---. 2 chrony chrony 6 Aug 10 2021 chrony
 9-rw-r--r--. 1 root root 130466 Dec 8 22:12 cloud-init.log
10-rw-r-----. 1 root adm 10306 Dec 8 22:12 cloud-init-output.log
11-rw-------. 1 root root 36979 Jan 3 16:03 cron
12-rw-------. 1 root root 27360 Dec 10 23:15 cron-20221211
13-rw-------. 1 root root 94140 Dec 17 23:07 cron-20221218
14-rw-------. 1 root root 95126 Dec 24 23:14 cron-20221225
15-rw-------. 1 root root 95309 Dec 31 23:04 cron-20230101
16

步骤 2 - 查看日志文件内容

以下是一些常见的日志文件,您可以在/var/log下找到:

  • wtmp
  • utmp
  • dmesg
  • messages
  • maillog or mail.log
  • spooler
  • auth.log or secure

wtmputmp文件跟踪用户登录和退出系统. 您不能直接通过终端中的cat命令读取这些文件的内容 - 还有其他特定命令,您将使用一些这些命令。

要查看目前谁已登录到 Linux 服务器,请使用who命令. 此命令从 /var/run/utmp’ 文件(对于 CentOS 和 Debian)或 /run/utmp’ (对于 Ubuntu) 获取其值。

以下是Ubuntu的例子:

1[secondary_label Output]
2root@ubuntu-22:~# who
3root pts/0 2023-01-03 16:23 (198.211.111.194)

在这种情况下,我们是系统的唯一用户。

最后命令告诉您用户的登录历史:

1[secondary_label Output]
2root@ubuntu-22:~# last
3root pts/0 198.211.111.194 Tue Jan 3 16:23 still logged in
4reboot system boot 5.19.0-23-generi Thu Dec 8 21:48 still running
5
6wtmp begins Thu Dec 8 21:48:51 2022

您还可以使用最后命令与一个管道(`` )添加一个搜索的特定用户。

要查找系统上一次重新启动时,您可以运行以下命令:

1last reboot

在 Debian 中,结果可能看起来像这样:

1[secondary_label Output]
2root@debian-11-trim:~# last reboot
3reboot system boot 5.10.0-11-amd64 Thu Dec 8 21:49 still running
4
5wtmp begins Thu Dec 8 21:49:39 2022

要查看上次有人登入系统时,请使用最后日志:

1lastlog

在 Debian 服务器上,您可能会看到这样的输出:

 1[secondary_label Output]
 2root@debian-11-trim:~# lastlog
 3Username Port From Latest
 4root pts/0 162.243.188.66 Tue Jan 3 16:23:03 +0000 2023
 5daemon                                     **Never logged in**
 6bin                                        **Never logged in**
 7sys                                        **Never logged in**
 8sync                                       **Never logged in**
 9games                                      **Never logged in**
10man                                        **Never logged in**
11lp                                         **Never logged in**
12mail                                       **Never logged in**
13news                                       **Never logged in**
14uucp                                       **Never logged in**
15proxy                                      **Never logged in**
16www-data                                   **Never logged in**
17backup                                     **Never logged in**
18list                                       **Never logged in**
19irc                                        **Never logged in**
20gnats                                      **Never logged in**
21nobody                                     **Never logged in**
22_apt                                       **Never logged in**
23messagebus                                 **Never logged in**
24uuidd                                      **Never logged in**
25

对于其他基于文本的日志文件,您可以使用尾巴命令来读取内容。

在下面的示例中,你试图查看 Debian 服务器上的 `/var/log/messages’ 文件的最后十行:

1sudo tail /var/log/messages

您将收到类似于此的输出:

1[secondary_label Output]
2root@debian-11-trim:~# tail /var/log/messages
3Jan 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
4Jan 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.
5Jan 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
6Jan 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
7Jan 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
8Jan 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目录中。

rsyslog配置文件

rsyslog大门从rsyslog.conf文件中获取配置信息,该文件位于/etc目录下方。

rsyslog.conf文件告诉rsyslog大师在哪里保存其日志信息。

此檔案可以在 Ubuntu 上找到「rsyslog.d/50-default.conf」。

两个部分指令由一个 selector 和一个 action 组成,两个部分由白色空间分开。

选择器部分指定了日志消息的来源和重要性,而行动部分则表示要如何处理该消息。

选择器本身又被分为两个部分,分为一个点(.)。点前的第一部分称为 facility(消息的来源),而点后的第二部分称为 priority(消息的严重性)。

共同,设施/优先级和操作对告诉rsyslog在生成符合标准的日志消息时该做什么。

您可以使用此命令查看 CentOS /etc/rsyslog.conf 文件的摘要:

1cat /etc/rsyslog.conf

你应该看到这样的东西作为输出:

 1[secondary_label Output]
 2# rsyslog configuration file
 3
 4# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
 5# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html 
 6# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
 7
 8#### GLOBAL DIRECTIVES ####
 9
10# Where to place auxiliary files
11global(workDirectory="/var/lib/rsyslog")
12
13# Use default timestamp format
14module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
15
16# Include all config files in /etc/rsyslog.d/
17include(file="/etc/rsyslog.d/*.conf" mode="optional")
18
19#### MODULES ####
20
21module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
22       SysSock.Use="off") # Turn off message reception via local log socket; 
23                          # local messages are retrieved through imjournal now.
24module(load="imjournal"             # provides access to the systemd journal
25       StateFile="imjournal.state") # File to store the position in the journal
26#module(load="imklog") # reads kernel messages (the same are read from journald)
27#module(load="immark") # provides --MARK-- message capability
28
29# Provides UDP syslog reception
30# for parameters see http://www.rsyslog.com/doc/imudp.html
31#module(load="imudp") # needs to be done just once
32#input(type="imudp" port="514")
33

要了解这一切意味着什么,让我们看看Linux所认可的不同类型的设施。

  • authauthpriv:来自授权和安全相关事件的消息
  • kern:来自Linux内核的任何消息
  • mail:由邮件子系统 生成的消息* cron:Cron daemon相关消息
  • daemon:来自daemons
  • news:来自网络新闻子系统
  • lpr:打印相关的日志消息 用户*:来自用户程序 的日志消息* 局部到本地7:保留本地使用

以下是以上升顺序列出的优先事项列表:

  • debug:来自程序的调试信息
  • info:简单的信息信息 - 不需要干预
  • 注意:可能需要注意的状态
  • 警告:警告
  • err:错误
  • crit:危急状态
  • 警告:需要立即干预的状态
  • emerg:紧急状态

所以现在让我们从文件中考虑下面的行:

1[secondary_label Output]
2
3# Log cron stuff
4cron.*                                                  /var/log/cron
5

这只是告诉rsyslog大象将来自cron大象的所有消息保存到名为/var/log/cron的文件中。点后的星座(*)意味着所有优先级的消息将被记录。

设施和优先事项可以以多种方式联系起来。

在其默认形式中,当点之后只指定一个优先级时,这意味着所有等于或大于该优先级的事件都将被困住。

1[secondary_label Output]
2mail.warn			/var/log/mail.warn

这将记录每个等于或大于警告优先级的消息,但将所有内容留在其下方,因此err,crit,alertemerg的消息也将记录在此文件中。

点后使用一个等级符号(=)将导致只记录指定优先级,所以如果我们只想抓住来自邮件子系统的信息消息,则规格会如下:

1[secondary_label Output]
2mail.=info			/var/log/mail.info

再次,如果我们想从邮件子系统中捕捉到除了信息消息之外的所有东西,则规格将如下所示:

1[secondary_label Output]
2mail.!info			/var/log/mail.info

1[secondary_label Output]
2mail.!=info			/var/log/mail.info

在第一种情况下,邮件.info 文件将包含比 info 优先级较低的一切内容,在第二种情况下,文件将包含所有信息的优先级超过 info。

同一线上的多个设施可以通过分开。

同一行中的多个源(‘facility.priority’)由半柱分开。

当一个操作被标记为恒星时,它意味着所有用户. 这是您的 CentOS rsyslog.conf 文件中的一个条目,它说的是:

1[secondary_label Output]
2# Everybody gets emergency messages
3*.emerg                                                 :omusrmsg:*

试着看看rsyslog.conf在你的Linux系统中说了些什么,这里是Debian服务器的摘要,以示另一个例子:

 1[secondary_label Output]
 2# /etc/rsyslog.conf configuration file for rsyslog
 3#
 4# For more information install rsyslog-doc and see
 5# /usr/share/doc/rsyslog-doc/html/configuration/index.html
 6
 7#################
 8#### MODULES ####
 9#################
10
11module(load="imuxsock") # provides support for local system logging
12module(load="imklog")   # provides kernel logging support
13#module(load="immark")  # provides --MARK-- message capability
14
15# provides UDP syslog reception
16#module(load="imudp")
17#input(type="imudp" port="514")
18
19# provides TCP syslog reception
20#module(load="imtcp")
21#input(type="imtcp" port="514")
22
23###########################
24#### GLOBAL DIRECTIVES ####
25###########################
26
27#
28# Use traditional timestamp format.
29# To enable high precision timestamps, comment out the following line.
30#
31$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
32
33#
34# Set the default permissions for all log files.
35#
36$FileOwner root
37$FileGroup adm
38$FileCreateMode 0640
39$DirCreateMode 0755
40$Umask 0022
41

正如你所看到的,Debian 将所有安全性/授权级别的消息保存在 /var/log/auth.log’ 中,而 CentOS 则将其保存在 /var/log/secure 中。

这些自定义配置文件通常位于/etc/rsyslog.d下的不同目录中。

以下是 Ubuntu 中的样子:

1[secondary_label Output]
23#
4# Include all config files in /etc/rsyslog.d/
5#
6$IncludeConfig /etc/rsyslog.d/*.conf
7

查看/etc/rsyslog.d目录中的内容:

1ls -l /etc/rsyslog.d

您将在您的终端中看到类似的东西:

1[secondary_label Output]
2-rw-r--r-- 1 root root 314 Sep 19 2021 20-ufw.conf
3-rw-r--r-- 1 root root 255 Sep 30 22:07 21-cloudinit.conf
4-rw-r--r-- 1 root root 1124 Nov 16 2021 50-default.conf

日志消息的目的地不一定是日志文件;该消息可以发送到用户的控制台。在这种情况下,动作字段将包含用户名。如果需要接收多个用户的消息,他们的用户名将以字符串分开。

由于它是网络操作系统的一部分,所以rsyslog大卫不仅可以本地保存日志消息,还可以将其传送到网络中的其他Linux服务器或作为其他系统的存储库。

1[secondary_label Output]
2kern.crit			@texas

步骤 4 - 创建和测试自己的日志消息

所以现在是时候为您创建自己的日志文件了. 要测试这一点,您将执行以下操作:

  • /etc/rsyslog.conf 文件中添加日志文件规格 *重新启动 rsyslog 戴蒙 *使用日志工具 测试配置

在下面的示例中,您将添加两个新的行到您的CentOS Linux系统的rsyslog.conf文件中,正如您可以通过下面的命令看到的那样,它们都来自一个名为 local4的设施,并且它们有不同的优先级。

1vi /etc/rsyslog.conf

这里是输出:

1[secondary_label Output]
2
3# New lines added for testing log message generation  
4       
5local4.crit                                             /var/log/local4crit.log  
6local4.=info                                            /var/log/local4info.log

接下来,您将重新启动服务,以便重新加载 config 文件数据:

1/etc/init.d/rsyslog restart

要现在生成日志消息,名为 logger 应用程序:

1logger -p local4.info " This is a info message from local 4"

/var/log目录下看,现在会显示两个新文件:

1[secondary_label Output]
23-rw-------  1 root root 0 Jan 3 11:21 local4crit.log  
4-rw-------  1 root root 72 Jan 3 11:22 local4info.log
5

local4info.log的大小不是零,所以当你打开它时,你会看到消息已被记录:

1cat /var/log/local4info.log
1[secondary_label Output]
2Jan 3 11:22:32 TestLinux root:  This is a info message from local 4

步骤5 - 旋转日志文件

随着越来越多的信息被写入日志文件,它们变得越来越大,这显然会带来潜在的性能问题。

Linux 使用旋转日志文件的概念,而不是清除或删除它们. 当日志被旋转时,会创建一个新的日志文件,而旧日志文件被重新命名并可选地压缩。日志文件可以有多个旧版本留在网络上。这些文件会在一段时间内返回并代表反弹。一旦产生了一定数量的反弹,新的日志旋转会导致最旧的日志文件被删除。

旋转是通过logrotate实用程序开始的。

logrotate配置文件

rsyslog一样,logrotate也取决于配置文件,这个文件的名称是logrotate.conf

以下是您在您的 Debian 服务器的 'logrotate.conf' 文件中看到的内容:

1cat /etc/logrotate.conf
 1[secondary_label Output]
 2# see "man logrotate" for details
 3
 4# global options do not affect preceding include directives
 5
 6# rotate log files weekly
 7weekly
 8
 9# keep 4 weeks worth of backlogs
10rotate 4
11
12# create new (empty) log files after rotating old ones
13create
14
15# use date as a suffix of the rotated file
16#dateext
17
18# uncomment this if you want your log files compressed
19#compress
20
21# packages drop log rotation information into this directory
22include /etc/logrotate.d
23
24# system-specific logs may also be configured here.

默认情况下,日志文件必须每周旋转,随时留有四个后备,当程序运行时,将生成一个新的、空的日志文件,可选的是旧的日志文件将被压缩。

唯一的例外是wtmpbtmp文件。wtmp跟踪系统登录和btmp跟踪错误登录尝试。

定制的日志旋转配置被保留在 /etc/logrotate.d 目录中. 这些配置也被包含在 logrotate.conf' 中,包含了 `include' 指令。

1ls -l /etc/logrotate.d
 1[secondary_label Output]
 2total 32
 3-rw-r--r-- 1 root root 120 Jan 30 2021 alternatives
 4-rw-r--r-- 1 root root 173 Jun 10 2021 apt
 5-rw-r--r-- 1 root root 130 Oct 14 2019 btmp
 6-rw-r--r-- 1 root root 160 Oct 19 2021 chrony
 7-rw-r--r-- 1 root root 112 Jan 30 2021 dpkg
 8-rw-r--r-- 1 root root 374 Feb 17 2021 rsyslog
 9-rw-r--r-- 1 root root 235 Feb 19 2021 unattended-upgrades
10-rw-r--r-- 1 root root 145 Oct 14 2019 wtmp

rsyslog的内容展示了如何回收多个日志文件:

1cat /etc/logrotate.d/rsyslog
 1[secondary_label Output]
 2/var/log/syslog
 3/var/log/mail.info
 4/var/log/mail.warn
 5/var/log/mail.err
 6/var/log/mail.log
 7/var/log/daemon.log
 8/var/log/kern.log
 9/var/log/auth.log
10/var/log/user.log
11/var/log/lpr.log
12/var/log/cron.log
13/var/log/debug
14/var/log/messages
15{
16        rotate 4
17        weekly
18        missingok
19        notifempty
20        compress
21        delaycompress
22        sharedscripts
23        postrotate
24                /usr/lib/rsyslog/rsyslog-rotate
25        endscript
26}

正如你所看到的,消息文件将每天重新启动,有四天的日志将保持在线。

值得一提的是postrotate指令,它指定了整个日志旋转完成后发生的操作。

步骤6 - 测试旋转

logrotate 可以手动运行以回收一个或多个文件,并且要做到这一点,您可以指定相应的配置文件作为命令的参数。

要了解如何工作,以下是测试 CentOS 服务器中的/var/log目录下的日志文件的部分列表:

1ls -l /var/log
 1[secondary_label Output]
 2total 49324
 3 4-rw-------. 1 root root 84103 Jan 3 17:20 messages
 5-rw-------. 1 root root 165534 Dec 10 23:12 messages-20221211
 6-rw-------. 1 root root 254743 Dec 18 00:00 messages-20221218
 7-rw-------. 1 root root 217810 Dec 25 00:00 messages-20221225
 8-rw-------. 1 root root 237726 Dec 31 23:45 messages-20230101
 9drwx------. 2 root root 6 Mar 2 2022 private
10drwxr-xr-x. 2 root root 6 Feb 24 2022 qemu-ga
11lrwxrwxrwx. 1 root root 39 Mar 2 2022 README -> ../../usr/share/doc/systemd/README.logs
12-rw-------. 1 root root 2514753 Jan 3 17:25 secure
13-rw-------. 1 root root 2281107 Dec 10 23:59 secure-20221211
14-rw-------. 1 root root 9402839 Dec 17 23:59 secure-20221218
15-rw-------. 1 root root 8208657 Dec 25 00:00 secure-20221225
16-rw-------. 1 root root 7081010 Dec 31 23:59 secure-20230101
17drwxr-x---. 2 sssd sssd 6 Jan 17 2022 sssd
18-rw-------. 1 root root 0 Dec 8 22:11 tallylog
19-rw-rw-r--. 1 root utmp 2688 Jan 3 16:22 wtmp

「logrotate.conf」檔案的部分內容看起來如下:

1cat /etc/logrotate.conf
 1[secondary_label Output]
 2# see "man logrotate" for details
 3
 4# global options do not affect preceding include directives
 5
 6# rotate log files weekly
 7weekly
 8
 9# keep 4 weeks worth of backlogs
10rotate 4
11
12# create new (empty) log files after rotating old ones
13create
14
15# use date as a suffix of the rotated file
16dateext
17
18# uncomment this if you want your log files compressed
19#compress
20
21# packages drop log rotation information into this directory
22include /etc/logrotate.d
23
24# system-specific logs may be also be configured here.

接下来,运行logrotate命令:

1logrotate -fv /etc/logrotate.conf

当新文件生成时,消息滚动,出现错误等 当尘埃定居时,您可以检查新的邮件,安全消息文件:

1ls -l /var/log/mail*
1[secondary_label Output]
2-rw-------  1 root root 0 Dec 17 18:34 /var/log/maillog 
3-rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216  
4-rw-------  1 root root 359 Dec 17 18:25 /var/log/maillog-20131217
1ls -l /var/log/messages*
1[secondary_label Output]
2-rw-------  1 root root 148 Dec 17 18:34 /var/log/messages
3-rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 
4-rw-------  1 root root 30554 Dec 17 18:25 /var/log/messages-20131217 
1ls -l /var/log/secure*
1-rw-------  1 root root 0 Jan 3 12:34 /var/log/secure
2-rw-------. 1 root root 4187 Jan 3 16:41 /var/log/secure-20230103 
3-rw-------  1 root root 591 Jan 3 18:28 /var/log/secure-20230103 ```

邮件日志安全文件仍然是空的,但新的消息文件已经有一些数据。

结论

希望本教程给了您一些关于Linux日志的想法. 您可以尝试看看自己的开发或测试系统,以获得更好的想法. 一旦您熟悉日志文件的位置和配置设置,使用这些知识来支持您的生产系统。

Published At
Categories with 技术
comments powered by Disqus