赞
踩
在此文章中,我们将详细探讨systemd journalctl日志的持久化配置。本文将首先简单介绍systemd和journalctl,然后深入探讨如何配置和使用journalctl来实现日志的持久化。
Systemd是Linux系统的一个初始化系统和服务管理器,它负责启动系统后的所有服务。其中,Journal是systemd的一个组成部分,用于收集和存储系统日志。
Journalctl是一种工具,可以方便地从systemd的journal中检索日志信息。默认情况下,这些日志数据是易失的,也就是说,每次重启系统后,它们都会被清除。
# 查看所有日志条目
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
配置好日志持久化后,我们可以使用各种查询选项来过滤和查找日志信息。例如:
# 查看指定时间段的日志
journalctl --since "2022-01-01" --until "2022-01-31"
# 查看指定服务的日志
journalctl -u nginx.service
虽然日志持久化很有用,但如果不加以管理,日志文件可能会占用大量磁盘空间。我们可以通过配置/etc/systemd/journald.conf
文件来限制日志文件的大小。
[Journal]
# 日志文件最大占用空间
SystemMaxUse=500M
(注意这里SystemMaxUse是限制所有日志总占空间大小,SystemMaxFileSize是限制单个轮转日志文件的大小;RuntimeMaxUse用于限制在 /run/log/journal/ 中的日志数据占用的空间大小,这是管理非持久性存储的日志容量大小,已经设置了默认值,我们不用管)
配置后同样要重新启动服务:
# 重新启动服务
systemctl restart systemd-journald
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。
对于任何系统管理员来说,了解如何处理常见问题和遵循最佳实践都是至关重要的。在使用journalctl时,我们应始终记住以下几点:
/etc/systemd/journald.conf
文件总的来说,journalctl日志持久化配置是一个强大而灵活的工具,可以帮助我们更好地管理和审计系统日志。通过正确的配置和使用,我们可以充分利用这个工具来提高我们的运维效率。
参考资料:
/etc/systemd/journald.conf
原始文件及配置项解析原始文件
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
systemd journal
和 logrotate
都是用于管理日志文件的工具,但它们的工作方式和特性有一些区别。
日志格式:
systemd journal
存储的日志是二进制格式,这使得它可以提供更丰富的查询功能,例如按服务、优先级或时间范围过滤日志。logrotate
处理的通常是文本格式的日志,这种日志对人类来说更易读,但对机器来说处理起来可能就不那么方便了。日志切割:
systemd journal
会自动管理日志文件的大小,当日志达到一定大小时,它会自动删除旧的日志来释放空间。你可以通过配置选项(如 SystemMaxUse
和 RuntimeMaxUse
)来控制日志文件的最大大小。logrotate
是通过定期运行(通常是每天)来进行日志切割的,它可以根据日志文件的大小、文件的年龄或者日期来决定何时进行切割。切割后的日志文件可以选择压缩以节省空间。使用场景:
systemd journal
主要用于收集系统和服务的日志,它是 systemd 的一个组成部分,所以在使用 systemd 的系统上,无法避免使用 journal。logrotate
更多的是用于应用程序的日志管理,尤其是那些还没有采用 systemd 的系统或者那些产生大量日志的应用程序。两者都有各自的优点,也可以结合使用,比如让 systemd journal 收集日志,然后使用 logrotate 来管理 journal 导出的文本格式日志。
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/
我也不知道做了什么操作,发现又好了。
大概是以下操作之一:
清空日志:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。