时代已经进化到 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的日志目录里拉方便的多。