查询python-systemd.journal,如journalctl-b和journalcl-list boots,



我正在寻找一种通过python systemd模块查询journalctl -bjournalctl --list-boots提供的信息的方法。

我已经编写了一个变通方法,将journalcl作为子流程运行并解析输出。也许还有更明显的方法。

import datetime
import re
import subprocess
from systemd import journal
def parse_datetime_data(data):
datetimedata_no_tz = data[0:data.rindex(" ")]
datetimedata_tz = data[data.rindex(" ")+1:-1]
datetimeValue = datetime.datetime.strptime(datetimedata_no_tz, 
"%a %Y-%m-%d %X")
return datetimeValue, datetimedata_tz
def get_bootlines():
bootlinesRaw = subprocess.check_output(['journalctl', '--list-boots', 
'--no-pager'],
encoding="utf-8").splitlines()
boots = {}
for bootlineRaw in bootlinesRaw:
if bootlineRaw:
lt = re.findall('^ *(-?d+) (w+) ([w -:]+).([w -:]+)',
bootlineRaw)
linedata = lt[0]
startdata = linedata[2]
bootstart,bootstart_tz = parse_datetime_data(startdata)
enddata = linedata[3]
bootend,bootend_tz = parse_datetime_data(enddata)
boots[int(linedata[0])] = {"BOOT_ID":linedata[1],
"start": bootstart, "start_tz": bootstart_tz,
"end": bootstart, "end_tz": bootend_tz}
return boots
boots = get_bootlines()

从外观上看,systemd.journal或底层本机模块都没有公开用于列出引导的API。

(不过,一旦手头有了引导id,就可以为日志阅读器API使用_BOOT_ID匹配器。(

查看journalctl的源代码,--list-boots所做的是对所有已知的日志条目进行迭代,并保留唯一的启动ID及其第一个和最后一个时间戳,因此您也可以在Python代码中这样做。

顺便说一句,与systemd>=251你可以直接做

>>> import json
>>> import subprocess
>>> json.loads(subprocess.check_output(["journalctl", "--output=json", "--list-boots"]))
[{'index': 0, 'boot_id': '5ab8a0b2e2624bcdba4d51d83a7a4fe2', 'first_entry': 1658396953303255, 'last_entry': 1662635352510679}]

最新更新