文章目录
- Systemd Journalctl日志持久化配置
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日志持久化配置是一个强大而灵活的工具,可以帮助我们更好地管理和审计系统日志。通过正确的配置和使用,我们可以充分利用这个工具来提高我们的运维效率。
参考资料:
- Arch Linux Wiki: Systemd/Journal
- Red Hat Customer Portal: Managing Logs with Journald and Rsyslog
- DigitalOcean: How To Use Journalctl to View and Manipulate Systemd Logs
附录
/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
:定义系统何时将日志数据从内存同步到磁盘。RateLimitIntervalSec
和RateLimitBurst
:定义日志消息的频率限制,即在给定的时间间隔内可以接受的最大消息数。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 journal
和 logrotate
都是用于管理日志文件的工具,但它们的工作方式和特性有一些区别。
-
日志格式:
systemd journal
存储的日志是二进制格式,这使得它可以提供更丰富的查询功能,例如按服务、优先级或时间范围过滤日志。logrotate
处理的通常是文本格式的日志,这种日志对人类来说更易读,但对机器来说处理起来可能就不那么方便了。
-
日志切割:
systemd journal
会自动管理日志文件的大小,当日志达到一定大小时,它会自动删除旧的日志来释放空间。你可以通过配置选项(如SystemMaxUse
和RuntimeMaxUse
)来控制日志文件的最大大小。logrotate
是通过定期运行(通常是每天)来进行日志切割的,它可以根据日志文件的大小、文件的年龄或者日期来决定何时进行切割。切割后的日志文件可以选择压缩以节省空间。
-
使用场景:
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