设置systemd的journal日志磁盘占用
缘起
最近在看家里的服务器和里边的虚拟机的运行情况,发现/var/log/journal/
占用了大量的磁盘空间,多的能达到2-3G。
比较好奇是什么样的日志这么占用空间,传统的syslog或者message一般会gzip压缩轮转,不会这么大,因此有了这次的折腾分析,在此记录下。
折腾过程
首先看了下这个journal日志是什么,搜索后发现这个是systemd系统的日志系统。
内部包含了从启动到后续运行的各种的系统日志,包括系统级的日志,比如kernel日志、dmesg日志,也包含user级别的日志,比如crontab执行等等。
那么为什么这个日志在ubuntu下这么大呢,和系统的设置有关,ubuntu系统配置的journal日志默认保存在/var/logz中,并且没怎么清理。
加上nas不间断运行,系统日志就非常大了。
注:这个journal日志相对强大,能够记录多次机器从启动开始的运行日志,是方便排查分析系统问题的,比如分析系统重启原因、卡死原因。
怎么缩减
问了大模型,可以修改配置,设置压缩journal日志,同时可以设置日志最大大小。
修改方式如下:
vi /etc/systemd/journald.conf 反注释 Compress=yes 开启压缩 反注释SystemMaxUse=300M 保存退出
这样就设置了最大日志300M,并开启了日志压缩
怎么验证缩减生效了
设置后重启机器,使用如下命令确认:
sudo service systemd-journald status
有类似的日志,说明是生效了Rotating system journal.
然后坑的点来了
为了验证效果,去分析了树莓派的系统和一个vps服务器的ubuntu系统的journal日志,发现一个及其奇怪的问题,在这个问题上分析了好久。
在树莓派上,没有/var/log/journal/
目录,那么是不是/etc/systemd/journald.conf
配置文件中的配置不同呢?
经过分析,和debian系统对比(树莓派系统基于debian),此配置文件默认均为注释状态,没有什么异常的。
那为什么树莓派系统表现不一致就引起了我的好奇。
使用大模型问了几次,都讲日志是存储在/var/log中的,经过多次的分析,包括systemd日志存储位置等等的搜索,有了如下线索:
1、journal日志存在哪里了呢?
经过网上查询,发现journal日志可能也存储在/run/log/journal
目录
在这个目录看了一下,还真的是在这里,但是文件较小,同时这个/run目录是内存文件系统,不会落到磁盘上。
这也是之前分析树莓派卡死问题,没找到上一次的系统日志,因为重启直接就丢失了。
然后分析了ubuntu的vps的系统,发现也是类似的,文件存储在/run/log/journal
目录下
2、什么控制了journal日志的存储位置呢
因为配置和debian和ubuntu的是一样的,为什么表现不一致呢?
journal的日志存储的几种设置
有了上面的分析,直接google搜索systemd journalctl /run/log /var/log
关键字,就发现了有价值的信息:
There the "Storage=" option controls whether to store journal data or not, and where. Possible values are "volatile", "persistent", "auto" and "none". Defaults to "auto". If "volatile", journal log data will be stored only in memory, i.e. below the /run/log/journal hierarchy (which is created if needed). If "persistent", data will be stored preferably on disk, i.e. below the /var/log/journal hierarchy (which is created if needed), with a fallback to /run/log/journal (which is created if needed), during early boot and if the disk is not writable. "auto" is similar to "persistent" but the directory /var/log/journal is not created if needed, so that its existence controls where log data goes. "none" turns off all storage, all log data received will be dropped.
而默认的journal配置文件中设置为auto,这也解释了为啥没有/var/log/journal/
的系统中,文件是存储在/run下的内存文件系统中。
而树莓派和云端vps为什么这么配置呢?应该是对应的系统发行版的策略。
这两种系统都是对磁盘空间很敏感的,且都是systemd的系统,系统中默认不新建/var/log/journal/,存储到内存中,能有效的降低磁盘写入量,减少系统消耗。
另外一点补充
系统启动过程中,在kernel启动前期,如果磁盘还没有准备好,设置了记录到/var/log,前期的journal日志存储在哪里呢?
答案是也在/run/log/journal中,在磁盘准备好后,会迁移过去。
可以stat /run/log/journal
查看文件的修改时间,基本和开机时间是一致的,说明开机时先写入到这里一部分的,但当前这个目录为空白,就是转移到物理存储了。
总结
至此,systemd的journal日志的大小问题,以及为什么有的系统存储在/var/log,有的没有的问题就释疑了。 而system作为当前几乎所有发行版都会采用的管理组件,内部的模块和功能非常复杂,这个日志模块只是其中的一个小点了~~~
另外个人感觉journal日志的配置方式不太合理,有较强的迷惑性,这里的差异,应该在jouranl的配置文件中说明白,包括存储的机制,因为配置的auto依赖了文件是否存在,是非常奇怪的。。。。。。
参考文档
https://askubuntu.com/questions/864722/where-is-journalctl-data-stored
https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html
发表评论