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