Linux 管理员 - 日志管理

Systemd 改变了 CentOS Linux 管理系统日志的方式。系统上的每个守护进程不再将日志放入单独的位置,而是使用 tailgrep 等工具作为对日志条目进行排序和过滤的主要方式,journald 为分析系统日志带来了单点管理。

systemd 日志记录背后的主要组件是:journal、jounralctl 和 journald.conf

journald 是主要的日志守护进程,可通过编辑 journald.conf 进行配置,而 journalctl 用于分析 journald 记录的事件。

journald 记录的事件包括 −内核事件、用户进程和守护进程服务。

设置正确的系统时区

在使用 journalctl 之前,我们需要确保系统时间设置为正确的时间。为此,我们要使用 timedatectl

让我们检查当前系统时间。

[root@centos rdc]# timedatectl status 
Local time: Mon 2017-03-20 00:14:49 MDT 
Universal time: Mon 2017-03-20 06:14:49 UTC 
RTC time: Mon 2017-03-20 06:14:49 
Time zone: America/Denver (MDT, -0600) 
NTP enabled: yes 
NTP synchronized: yes 
RTC in local TZ: no 
DST active: yes 
Last DST change: DST began at 
              Sun 2017-03-12 01:59:59 MST 
              Sun 2017-03-12 03:00:00 MDT 
Next DST change: DST ends (the clock jumps one hour backwards) at 
              Sun 2017-11-05 01:59:59 MDT 
              Sun 2017-11-05 01:00:00 MST
              
[root@centos rdc]#

目前,系统与当地时区一致。如果您的系统不是,让我们设置正确的时区。更改设置后,CentOS 将自动计算与当前时区的时区偏移量,立即调整系统时钟。

让我们使用 timedatectl 列出所有时区 −

[root@centos rdc]# timedatectl list-timezones 
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau

这是 timedatectl list-timezones 的有争议的输出。要查找特定的本地时区,可以使用 grep 命令 −

[root@centos rdc]# timedatectl list-timezones | grep -i "america/New_York"
America/New_York
[root@centos rdc]#

CentOS 使用的标签通常是国家/地区,用下划线代替空格(New_York 与"New York")。

现在让我们设置时区 −

[root@centos rdc]# timedatectl set-timezone "America/New_York"

[root@centos rdc]# date 
Mon Mar 20 02:28:44 EDT 2017

[root@centos rdc]#

您的系统时钟应自动调整时间。

使用 journalctl 分析日志

使用 journalctl

时的常用命令行开关
开关 操作
-k 仅列出内核消息
-u 按特定单元列出(httpd、sshd 等...)
-b 启动标签偏移量
-o 记录输出格式
-p 按日志类型(名称或编号)过滤
-F 字段名称或字段名称值
--utc UTC 偏移量时间
--since 按时间范围过滤

检查启动日志

首先,我们将检查和配置 CentOS Linux 中的启动日志。您首先会注意到,默认情况下,CentOS 不会存储在重启后持久的启动日志。

要检查每次重启的启动日志,我们可以发出以下命令 −

[root@centos rdc]# journalctl --list-boots 
-4 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT
-3 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT
-2 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT
-1 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT
 0 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:07:36 MDT

[root@centos rdc]#  

重启系统后,我们可以看到另一个条目。

[root@centos rdc]# journalctl --list-boots 
-5 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT
-4 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT
-3 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT
-2 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT
-1 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:09:57 MDT
 0 aa6aaf0f0f0d4fcf924e17849593d972 Mon 2017-03-20 01:10:07 MDT—Mon 2017-03-20 01:12:44 MDT
 
[root@centos rdc]#

现在,让我们检查一下最后一次启动日志记录实例 −

root@centos rdc]# journalctl -b -5 
-- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Mon 2017-03-20 01:20:27 MDT. --
Mar 19 22:01:57 localhost.localdomain systemd-journal[97]: Runtime journal is using 8.0M 
(max allowed 108.4M
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuset
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpu
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
Mar 19 22:01:57 localhost.localdomain kernel: Linux version 3.10.0514.6.2.el7.x86_64 
(builder@kbuilder.dev.
Mar 19 22:01:57 localhost.localdomain kernel: Command line: 
BOOT_IMAGE=/vmlinuz-3.10.0-514.6.2.el7.x86_64 ro
Mar 19 22:01:57 localhost.localdomain kernel: Disabled fast string operations
Mar 19 22:01:57 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:

以上是我们上次启动的精简输出。我们还可以参考几小时、几天、几周、几个月甚至几年的启动日志。但是,默认情况下,CentOS 不存储持久启动日志。要启用持久存储启动日志,我们需要进行一些配置更改 −

  • 为启动日志创建中央存储点
  • 为新日志文件夹授予适当的权限
  • 配置 journald.conf 以进行持久日志记录

配置持久启动日志的启动位置

journald 想要存储持久启动日志的初始位置是 /var/log/journal。由于默认情况下不存在,让我们创建它 −

[root@centos rdc]# mkdir /var/log/journal

现在,让我们为目录赋予适当的权限 journald 守护进程访问 −

systemd-tmpfiles --create --prefix /var/log/journal

最后,让我们告诉 journald 它应该存储持久的启动日志。在 vim 或您最喜欢的文本编辑器中,打开 /etc/systemd/jounrald.conf"

# 有关详细信息,请参阅 journald.conf(5)。
[Journal]=Storage=peristent

我们关注的行是 Storage=。首先删除注释 #,然后更改为 Storage = persistent,如上所示。保存并重新启动您的 CentOS 系统,并注意在运行 journalctl list-boots 时应该有多个条目。

注意 − 不断变化的 machine-id(例如来自 VPS 提供商的机器 ID)可能会导致 journald 无法存储持久启动日志。这种情况有很多解决方法。最好仔细阅读发布到 CentOS 的最新修复程序管理员论坛,然后遵循那些找到可行的 VPS 解决方法的人的可靠建议。

要检查特定的启动日志,我们只需使用 journald --list-boots-b 开关获取每个偏移量。因此,要检查第二个启动日志,我们将使用 −

journalctl -b -2

未指定启动日志偏移量的 -b 的默认值将始终是上次重启后的当前启动日志。

按日志类型分析日志

来自 journald 的事件已编号并分为 7 种不同的类型 −

0 - emerg   :: System is unusable 
1 - alert   :: Action must be taken immediatly    
2 - crit    :: Action is advised to be taken immediatly 
3 - err     :: Error effecting functionality of application 
4 - warning :: Usually means a common issue that can affect security or usilbity 
5 - info    :: logged informtation for common operations 
6 - debug   :: usually disabled by default to troubleshoot functionality

因此,如果我们想查看所有警告,可以通过 journalctl 发出以下命令 −

[root@centos rdc]# journalctl -p 4
-- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Wed 2017-03-22 22:33:42 MDT. --
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: RSDP 00000000000f6a10 00024
(v02 PTLTD )
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: XSDT 0000000095eea65b 0005C
(v01 INTEL  440BX    06040000 VMW  01
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACP 0000000095efee73 000F4
(v04 INTEL  440BX    06040000 PTL  00
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: DSDT 0000000095eec749 1272A
(v01 PTLTD  Custom   06040000 MSFT 03
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACS 0000000095efffc0 00040
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: BOOT 0000000095eec721 00028
(v01 PTLTD  $SBFTBL$ 06040000  LTP 00
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: APIC 0000000095eeb8bd 00742
(v01 PTLTD  ? APIC   06040000  LTP 00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: MCFG 0000000095eeb881 0003C
(v01 PTLTD  $PCITBL$ 06040000  LTP 00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: SRAT 0000000095eea757 008A8
(v02 VMWARE MEMPLUG  06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: HPET 0000000095eea71f 00038
(v01 VMWARE VMW HPET 06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: WAET 0000000095eea6f7 00028
(v01 VMWARE VMW WAET 06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: Zone ranges: 
Mar 19 22:01:57 localhost.localdomain kernel:   DMA      [mem 0x000010000x00ffffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   DMA32    [mem 0x010000000xffffffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   Normal   empty 
Mar 19 22:01:57 localhost.localdomain kernel: Movable zone start for each node 
Mar 19 22:01:57 localhost.localdomain kernel: Early memory node ranges 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x000010000x0009dfff] 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x001000000x95edffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x95f000000x95ffffff] 
Mar 19 22:01:57 localhost.localdomain kernel: Built 1 zonelists in Node order,
mobility grouping on.  Total pages: 60 
Mar 19 22:01:57 localhost.localdomain kernel: Policy zone: DMA32 
Mar 19 22:01:57 localhost.localdomain kernel: ENERGY_PERF_BIAS: Set to
'normal', was 'performance'

以上显示了系统过去 4 天的所有警告。

使用 systemd 查看和浏览日志的新方法确实需要一点练习和研究才能熟悉。但是,由于输出格式不同,并且特别注意使所有打包的守护进程日志通用,因此值得采用。journald 比传统的日志分析方法提供了极大的灵活性和效率。