Systemd与journalctl的双剑合璧

时代已经进化到 systemd 的年代了,service 应该是彻底没有市场了

systemd 的好处是写程序的时候再也不用 fork 甩脱父进程了,日志直接输出终端即可

对 java 来说也是个好事,所有的日志比如WARN ERROR INFO都可以交给journal来管理,这样要查找日志也非常方便了。

举个例子,我们要把一个java启动的程序做成 systemd 的:

vim /etc/systemd/system/circle.service

 1[Unit]
 2After=network.target
 3Wants=network.target
 4
 5[Service]
 6WorkingDirectory=/export/prod/server
 7Type=simple
 8ExecStart=/usr/bin/java -jar  -Dspring.config.location=application.properties -Dlog4j2.formatMsgNoLookups=true server.jar
 9Restart=on-failure
10RestartSec=1s
11
12[Install]
13WantedBy=multi-user.target

然后就可以运行了:

1systemctl daemon-reload
2systemctl start circle

注意上面的WorkingDirectory,因为下面java启动指定 application.properties 配置文件的时候没有用绝对路径,那么这里就要指定当前工作目录了。

另外RestartSec=1s也改了,缺省是10ms,太快了

当然这只是第一步,日志是归journal管了,journal还是需要进一步配置的

首先必须要持久化存储到磁盘,否则只会在/run/log/journal内存中存放,重启就没了

1#disk-usage查看的是: 内存+/var/log/journal的加起来的总和大小
2journalctl --disk-usage

然后我们需要修改配置,让它持久化

1vi /etc/systemd/journald.conf
2Storage=persistent

修改重启

1mkdir /var/log/journal
2systemd-tmpfiles --create --prefix /var/log/journal
3systemctl restart systemd-journald

最后刷一下,把内存的文件刷到磁盘中

1journalctl --flush

还可以设置保存天数:

1journalctl --vacuum-time=31d

查看是从那一天开始保存的,进目录查看时间戳即可

1cd /var/log/journal
2ls -lha 

最后就是一个秘籍了,如果把日志弄出来查看

1journalctl -u circle --since "2022-10-19 14:30:00" --until "2022-10-19 15:00:00"

开发人员经常问我要日志,这样就特别方便快捷了,比从log4j的日志目录里拉方便的多。


Awk的用法
Iptables的基本用法
comments powered by Disqus