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

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

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

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

vim /etc/systemd/system/circle.service

[Unit]
After=network.target
Wants=network.target

[Service]
WorkingDirectory=/export/prod/server
Type=simple
ExecStart=/usr/bin/java -jar  -Dspring.config.location=application.properties -Dlog4j2.formatMsgNoLookups=true server.jar
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

然后就可以运行了:

systemctl daemon-reload
systemctl start circle

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

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

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

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

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

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

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

修改重启

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

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

journalctl --flush

还可以设置保存天数:

journalctl --vacuum-time=31d

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

cd /var/log/journal
ls -lha 

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

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

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