Systemd Journalctl日志持久化配置

在此文章中,我们将详细探讨systemd journalctl日志的持久化配置。本文将首先简单介绍systemd和journalctl,然后深入探讨如何配置和使用journalctl来实现日志的持久化。

1. systemd和journalctl概述

Systemd是Linux系统的一个初始化系统和服务管理器,它负责启动系统后的所有服务。其中,Journal是systemd的一个组成部分,用于收集和存储系统日志。

Journalctl是一种工具,可以方便地从systemd的journal中检索日志信息。默认情况下,这些日志数据是易失的,也就是说,每次重启系统后,它们都会被清除。

# 查看所有日志条目
journalctl

2. journalctl日志持久化的重要性

日志持久化的主要优点在于,它可以帮助我们保存重启后的日志信息,以便在需要时进行查阅和分析。这对于故障排除、安全审计以及性能监测等场景非常有价值。

3. 配置journalctl日志持久化

为了使journalctl的日志持久化,我们需要创建一个名为/var/log/journal的目录,并设置适当的权限。

# 创建日志目录
mkdir -p /var/log/journal

# 设置权限
systemd-tmpfiles --create --prefix /var/log/journal

在这里插入图片描述

另外,我们还需要在/etc/systemd/journald.conf文件中修改或添加以下配置:

[Journal]
Storage=persistent

在这里插入图片描述

然后,重新启动systemd-journald服务来应用新的配置。

# 重新启动服务
systemctl restart systemd-journald

4. 使用journalctl进行日志查询

配置好日志持久化后,我们可以使用各种查询选项来过滤和查找日志信息。例如:

# 查看指定时间段的日志
journalctl --since "2022-01-01" --until "2022-01-31"

# 查看指定服务的日志
journalctl -u nginx.service

5. 管理journalctl日志文件大小

虽然日志持久化很有用,但如果不加以管理,日志文件可能会占用大量磁盘空间。我们可以通过配置/etc/systemd/journald.conf文件来限制日志文件的大小。

[Journal]
# 日志文件最大占用空间
SystemMaxUse=500M

在这里插入图片描述

(注意这里SystemMaxUse是限制所有日志总占空间大小,SystemMaxFileSize是限制单个轮转日志文件的大小;RuntimeMaxUse用于限制在 /run/log/journal/ 中的日志数据占用的空间大小,这是管理非持久性存储的日志容量大小,已经设置了默认值,我们不用管)

配置后同样要重新启动服务:

# 重新启动服务
systemctl restart systemd-journald

6. 查看日志文件,验证持久化功能

ll /var/log/journal/

在这里插入图片描述

在这里插入图片描述

由于journal的二进制格式,不能直接使用文本编辑器(如vi或nano)打开和阅读这些文件,还得使用journalctl命令进行查看。

我们来验证一下是否成功实现日志持久化保存。我用journalctl -u ky_ai_ip_change.service查看我修改ip服务的日志。

重启前:

在这里插入图片描述

重启后:
在这里插入图片描述

日志确实持久化了( •̀ ω •́ )y

然后我把SystemMaxUse改成1M重复上面步骤再来一遍:

在这里插入图片描述

重启后查看日志:

在这里插入图片描述
在这里插入图片描述

Warning: journal has been rotated since unit was started, output may be incomplete.
-- Logs begin at Mon 2023-08-21 23:25:54 CST, end at Mon 2023-08-21 23:33:19 CST. --
-- No entries --

貌似是提示我说,我的修改ip服务的日志因为被轮转(rotated),已经转没了。

是因为我们设置的日志总占空间,太小辣!才1M,会很容易被别的系统服务日志冲没的。

还是改回500M。

7. 故障排除与最佳实践

对于任何系统管理员来说,了解如何处理常见问题和遵循最佳实践都是至关重要的。在使用journalctl时,我们应始终记住以下几点:

  • 定期检查和清理日志文件
  • 使用合适的查询选项来精确查找日志
  • 及时更新并备份/etc/systemd/journald.conf文件

8. 结论

总的来说,journalctl日志持久化配置是一个强大而灵活的工具,可以帮助我们更好地管理和审计系统日志。通过正确的配置和使用,我们可以充分利用这个工具来提高我们的运维效率。

参考资料:

附录

/etc/systemd/journald.conf原始文件及配置项解析(ubuntu20.04)

  • 原始文件

    cat /etc/systemd/journald.conf
    
    #  This file is part of systemd.
    #
    #  systemd is free software; you can redistribute it and/or modify it
    #  under the terms of the GNU Lesser General Public License as published by
    #  the Free Software Foundation; either version 2.1 of the License, or
    #  (at your option) any later version.
    #
    # Entries in this file show the compile time defaults.
    # You can change settings by editing this file.
    # Defaults can be restored by simply deleting this file.
    #
    # See journald.conf(5) for details.
    
    [Journal]
    #Storage=auto
    #Compress=yes
    #Seal=yes
    #SplitMode=uid
    #SyncIntervalSec=5m
    #RateLimitIntervalSec=30s
    #RateLimitBurst=10000
    #SystemMaxUse=
    #SystemKeepFree=
    #SystemMaxFileSize=
    #SystemMaxFiles=100
    #RuntimeMaxUse=
    #RuntimeKeepFree=
    #RuntimeMaxFileSize=
    #RuntimeMaxFiles=100
    #MaxRetentionSec=
    #MaxFileSec=1month
    #ForwardToSyslog=yes
    #ForwardToKMsg=no
    #ForwardToConsole=no
    #ForwardToWall=yes
    #TTYPath=/dev/console
    #MaxLevelStore=debug
    #MaxLevelSyslog=debug
    #MaxLevelKMsg=notice
    #MaxLevelConsole=info
    #MaxLevelWall=emerg
    #LineMax=48K
    #ReadKMsg=yes
    
  • 解析

    #  这个文件是 systemd 的一部分。
    #
    #  systemd 是自由软件;你可以在 GNU 较小通用公共许可证的条款下重新发布和/或修改它
    #  该许可证由自由软件基金会发布;可以选择许可证的版本 2.1 或者
    #  (如果你愿意)任何后续版本。
    #
    # 此文件中的条目显示了编译时的默认设置。
    # 你可以通过编辑此文件来更改设置。
    # 只需删除此文件,即可恢复默认设置。
    #
    # 详细信息请参阅 journald.conf(5)。
    

    (就是说想要恢复默认设置,只需删除此文件即可。)

    • Storage:定义日志数据应存储在何处,例如 ‘volatile’(临时文件系统)或 ‘persistent’(磁盘)。
    • Compress:定义是否应压缩存储在日志中的数据。
    • Seal:确定是否使用Forward Secure Sealing (FSS) 保护日志条目免受篡改。
    • SplitMode:定义如何拆分日志文件,例如根据用户ID或登录会话。
    • SyncIntervalSec:定义系统何时将日志数据从内存同步到磁盘。
    • RateLimitIntervalSecRateLimitBurst:定义日志消息的频率限制,即在给定的时间间隔内可以接受的最大消息数。
    • SystemMaxUse, SystemKeepFree, SystemMaxFileSize, SystemMaxFiles:定义系统日志所能使用的磁盘空间,以及应保留多少空闲空间。
    • RuntimeMaxUse, RuntimeKeepFree, RuntimeMaxFileSize, RuntimeMaxFiles:定义运行时日志的大小和文件数量限制。
    • MaxRetentionSec:定义系统应保留旧日志条目的最长时间。
    • MaxFileSec:定义单个日志文件的最大生存时间。
    • ForwardToSyslog, ForwardToKMsg, ForwardToConsole, ForwardToWall:定义是否将日志消息转发到syslog、内核消息日志、控制台或所有登录用户。
    • TTYPath:定义写入终端消息的TTY设备路径。
    • MaxLevelStore, MaxLevelSyslog, MaxLevelKMsg, MaxLevelConsole, MaxLevelWall:定义各种日志目标的最大日志级别。
    • LineMax:定义日志条目的最大行长度。
    • ReadKMsg:定义是否从内核消息日志读取并添加到系统日志。

    配置项的具体配置方法可参考官方文档:https://www.freedesktop.org/software/systemd/man/journald.conf.html

20240228 openEuler20.03 journald.conf 原始文件

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes

journal与logrotate日志管理工具的区别

systemd journallogrotate 都是用于管理日志文件的工具,但它们的工作方式和特性有一些区别。

  1. 日志格式:

    • systemd journal 存储的日志是二进制格式,这使得它可以提供更丰富的查询功能,例如按服务、优先级或时间范围过滤日志。
    • logrotate 处理的通常是文本格式的日志,这种日志对人类来说更易读,但对机器来说处理起来可能就不那么方便了。
  2. 日志切割:

    • systemd journal 会自动管理日志文件的大小,当日志达到一定大小时,它会自动删除旧的日志来释放空间。你可以通过配置选项(如 SystemMaxUseRuntimeMaxUse)来控制日志文件的最大大小。
    • logrotate 是通过定期运行(通常是每天)来进行日志切割的,它可以根据日志文件的大小、文件的年龄或者日期来决定何时进行切割。切割后的日志文件可以选择压缩以节省空间。
  3. 使用场景:

    • systemd journal 主要用于收集系统和服务的日志,它是 systemd 的一个组成部分,所以在使用 systemd 的系统上,无法避免使用 journal。
    • logrotate 更多的是用于应用程序的日志管理,尤其是那些还没有采用 systemd 的系统或者那些产生大量日志的应用程序。

两者都有各自的优点,也可以结合使用,比如让 systemd journal 收集日志,然后使用 logrotate 来管理 journal 导出的文本格式日志。

20231017 发现日志达到设置上限了,日志并未自动删除,新的日志也没有储存。一时半会找不到解决办法,通过设置MaxRetentionSec=7day自动清理7天前的日志来临时解决

今天调试ip修改服务,发现重启后新的日志并未正常保存,重启前日志倒是可以看到的:

在这里插入图片描述

查看systemd-journald服务状态:

systemctl status systemd-journald
root@nvidia:/ky/boot/journal_persistence# systemctl status systemd-journald
● systemd-journald.service - Journal Service
     Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled)
     Active: active (running) since Tue 2023-10-17 18:07:39 CST; 2h 36min ago
TriggeredBy: ● systemd-journald-audit.socket
             ● systemd-journald-dev-log.socket
             ● systemd-journald.socket
       Docs: man:systemd-journald.service(8)
             man:journald.conf(5)
   Main PID: 6899 (systemd-journal)
     Status: "Processing requests..."
      Tasks: 1 (limit: 8126)
     Memory: 1.8M
     CGroup: /system.slice/systemd-journald.service
             └─6899 /lib/systemd/systemd-journald

Oct 17 18:07:39 nvidia systemd-journald[6899]: Journal started
Oct 17 18:07:39 nvidia systemd-journald[6899]: System Journal (/var/log/journal/dbfef1aa0b064bcf9d30ec3ad0886edb) is 514.5M, max 500.0M, 0B free.
Oct 17 18:07:39 nvidia systemd-journald[6899]: System Journal (/var/log/journal/dbfef1aa0b064bcf9d30ec3ad0886edb) is 514.5M, max 500.0M, 0B free.
root@nvidia:/ky/boot/journal_persistence# 

发现上面有一句:(/var/log/journal/dbfef1aa0b064bcf9d30ec3ad0886edb) is 514.5M, max 500.0M, 0B free.

表明可能自动清理旧日志功能并未正常执行。

用下面命令查看journal日志占用大小,发现已经超了。:

journalctl --disk-usage

在这里插入图片描述

使用以下命令手动删除超出限制的旧日志,但是并未发现有任何变化:

journalctl --vacuum-size=500M

在这里插入图片描述

使用以下命令手动删除某个时间外的旧日志,发现删除了一部分日志:

journalctl --vacuum-time=1d

在这里插入图片描述

配置删除指定时间前的旧日志

一时半会找不到什么解决办法,它超过容量限制居然不自动删除,为了临时解决这个问题,我可能要设置一个自动删除指定日期前旧日志的选项才行。

将以下选项加入到/etc/systemd/journald.conf中:

MaxRetentionSec=7day

在这里插入图片描述

然后重启systemd-journald服务:

systemctl restart systemd-journald

虽然空间已经清空了,但是重启后,日志还是消失了(尝试设置SyncIntervalSec=1s,每隔1秒从内存将日志同步到硬盘)

现在空间是足够的:

在这里插入图片描述

分析可能是重启时journal没有把日志从内存同步到硬盘中去,因为默认同步时间几分钟一次的。

但是我们可以在/etc/systemd/journald.conf设置SyncIntervalSec=1s参数,这个参数将1秒钟同步一次,我试试是否可行

在这里插入图片描述

设置完后重启服务:systemctl restart systemd-journald

分析日志文件(看起来好像也没问题?)

ll /var/log/journal/dbfef1aa0b064bcf9d30ec3ad0886edb/

在这里插入图片描述

存在日志跳跃,真的无语。。。

在这里插入图片描述
在这里插入图片描述

20231018 发现日志无法正常持久化了,重启后不保留之前的日志,后来不知怎么又给弄好了。。。

我也不知道做了什么操作,发现又好了。

大概是以下操作之一:

  • 清空日志:

    journalctl --vacuum-time=1s
    journalctl --vacuum-size=1
    
  • 重新创建日志目录(如果存在不重新创建)并正确配置权限:

    sudo mkdir -p /var/log/journal
    sudo systemd-tmpfiles --create --prefix /var/log/journal
    sudo systemctl restart systemd-journald
    
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐