Linux

Linux journalctl 未與 systemctl 狀態同步 / Journalctl 未更新

  • November 15, 2020

我正在執行我的自定義服務,我們稱之為“foo.service”。這是一個記錄一些事情的 gunicorn python 程序。

我曾經能夠使用實時日誌概覽,journalctl -u <service> -f但現在日誌似乎卡在了一些過去的日誌中。當我使用systemctl status <service>它時,它確實顯示了最新的日誌。所以我的日誌記錄確實有效,但 journalctl 似乎卡住了,沒有顯示任何更新。

例子:

journalctl -u foo.service -f

Nov 25 16:19:09 <name> systemd[1]: Started Instance to load up the program and its endpoints.
Nov 25 16:19:09 <name> gunicorn[28267]: 2019-11-25 16:19:09,844 [INFO]: Connecting to localhost:9773
Nov 25 16:19:09 <name> gunicorn[28267]: 2019-11-25 16:19:09,845 [INFO]: Connecting to localhost:9771
Nov 25 16:19:09 <name> gunicorn[28267]: 2019-11-25 16:19:09,846 [INFO]: Connected
Nov 25 16:19:09 <name> gunicorn[28267]: 2019-11-25 16:19:09,846 [INFO]: Connected

systemctl status foo.service

Nov 26 11:39:53 <name> systemd[1]: Started Instance to load up the program and its endpoints.
Nov 26 11:39:53 <name> gunicorn[29117]: 2019-11-26 11:39:53,458 [INFO]: Connecting to localhost:9773
Nov 26 11:39:53 <name> gunicorn[29117]: 2019-11-26 11:39:53,459 [INFO]: Connecting to localhost:9771
Nov 26 11:39:53 <name> gunicorn[29117]: 2019-11-26 11:39:53,460 [INFO]: Connected
Nov 26 11:39:53 <name> gunicorn[29117]: 2019-11-26 11:39:53,460 [INFO]: Connected

後者是剛剛創建的日誌記錄,所以它就像一個魅力,但據我了解,journalctl 似乎也被更新了。這在過去確實有效,我從前天開始就遇到了這些問題。

我嘗試重新啟動 journalctl 但這似乎不起作用。

提前致謝。

編輯: 當我重新啟動服務時,我注意到 gunicorn 在查看 systemctl 服務的狀態時拋出異常,我無法向上滾動,所以我不知道錯誤的原因是什麼(systemctl 狀態):

Nov 26 15:08:27 <name> gunicorn[29390]:     self.log.info("Shutting down: %s", self.master_name)
Nov 26 15:08:27 <name> gunicorn[29390]:   File "/opt/my-program/venv/lib/python3.5/site-packages/gunicorn/glogging.py", line 271, in info
Nov 26 15:08:27 <name> gunicorn[29390]:     self.error_log.info(msg, *args, **kwargs)
Nov 26 15:08:27 <name> gunicorn[29390]: Message: 'Shutting down: %s'
Nov 26 15:08:27 <name> gunicorn[29390]: Arguments: ('Master',)
Nov 26 15:08:27 <name> systemd[1]: Started Instance to load up the program and its endpoints.

我的 foo.service 配置文件:

[Unit]
Description=Instance to load up the program and its endpoints
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/opt/my-program/my-program-thing
Environment="PATH=/opt/my-program/venv/bin"
ExecStart=/opt/my-program/venv/bin/gunicorn --workers 1 --threads 12 --bind unix:foo.sock -m 007 app:app --bind 0.0.0.0:8085 --access-logfile '/var/log/foo.info.log' --error-logfile '/var/log/foo.err.log'
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

嘗試將這些行添加到您的服務文件中

$$ Service $$標籤 StandardOutput=journal StandardError=journal

然後執行 systemctl daemon-reload,然後執行 systemctl restart your_service.service

我編輯答案供其他人輕鬆查看。問題是 /var 文件系統空間不足,因此 journalctl 無法將日誌保存到磁碟並隨後讀取,這就是 systemctl status 和 journalctl -fu 之間存在差異的原因。

引用自:https://serverfault.com/questions/993332