介绍
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
ormail.log
spooler
auth.log
orsecure
wtmp
和utmp
文件跟踪用户登录和退出系统. 您不能直接通过终端中的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所认可的不同类型的设施。
- auth或 authpriv:来自授权和安全相关事件的消息
- 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
,alert
或emerg
的消息也将记录在此文件中。
点后使用一个等级符号(=
)将导致只记录指定优先级,所以如果我们只想抓住来自邮件子系统的信息消息,则规格会如下:
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]
2…
3#
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]
2…
3-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.
默认情况下,日志文件必须每周旋转,随时留有四个后备,当程序运行时,将生成一个新的、空的日志文件,可选的是旧的日志文件将被压缩。
唯一的例外是wtmp
和btmp
文件。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日志的想法. 您可以尝试看看自己的开发或测试系统,以获得更好的想法. 一旦您熟悉日志文件的位置和配置设置,使用这些知识来支持您的生产系统。