parent
275abc1eb5
commit
608c16007e
7 changed files with 45 additions and 85 deletions
@ -0,0 +1,43 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
import json |
||||||
|
import subprocess |
||||||
|
|
||||||
|
import cereal.messaging as messaging |
||||||
|
from openpilot.common.swaglog import cloudlog |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
pm = messaging.PubMaster(['androidLog']) |
||||||
|
cmd = ['journalctl', '-f', '-o', 'json'] |
||||||
|
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True) |
||||||
|
assert proc.stdout is not None |
||||||
|
try: |
||||||
|
for line in proc.stdout: |
||||||
|
line = line.strip() |
||||||
|
if not line: |
||||||
|
continue |
||||||
|
try: |
||||||
|
kv = json.loads(line) |
||||||
|
except json.JSONDecodeError: |
||||||
|
cloudlog.exception("failed to parse journalctl output") |
||||||
|
continue |
||||||
|
|
||||||
|
msg = messaging.new_message('androidLog') |
||||||
|
entry = msg.androidLog |
||||||
|
entry.ts = int(kv.get('__REALTIME_TIMESTAMP', 0)) |
||||||
|
entry.message = json.dumps(kv) |
||||||
|
if '_PID' in kv: |
||||||
|
entry.pid = int(kv['_PID']) |
||||||
|
if 'PRIORITY' in kv: |
||||||
|
entry.priority = int(kv['PRIORITY']) |
||||||
|
if 'SYSLOG_IDENTIFIER' in kv: |
||||||
|
entry.tag = kv['SYSLOG_IDENTIFIER'] |
||||||
|
|
||||||
|
pm.send('androidLog', msg) |
||||||
|
finally: |
||||||
|
proc.terminate() |
||||||
|
proc.wait() |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
main() |
@ -1 +0,0 @@ |
|||||||
logcatd |
|
@ -1,3 +0,0 @@ |
|||||||
Import('env', 'messaging', 'common') |
|
||||||
|
|
||||||
env.Program('logcatd', 'logcatd_systemd.cc', LIBS=[messaging, common, 'systemd']) |
|
@ -1,75 +0,0 @@ |
|||||||
#include <systemd/sd-journal.h> |
|
||||||
|
|
||||||
#include <cassert> |
|
||||||
#include <csignal> |
|
||||||
#include <map> |
|
||||||
#include <string> |
|
||||||
|
|
||||||
#include "third_party/json11/json11.hpp" |
|
||||||
|
|
||||||
#include "cereal/messaging/messaging.h" |
|
||||||
#include "common/timing.h" |
|
||||||
#include "common/util.h" |
|
||||||
|
|
||||||
ExitHandler do_exit; |
|
||||||
int main(int argc, char *argv[]) { |
|
||||||
|
|
||||||
PubMaster pm({"androidLog"}); |
|
||||||
|
|
||||||
sd_journal *journal; |
|
||||||
int err = sd_journal_open(&journal, 0); |
|
||||||
assert(err >= 0); |
|
||||||
err = sd_journal_get_fd(journal); // needed so sd_journal_wait() works properly if files rotate
|
|
||||||
assert(err >= 0); |
|
||||||
err = sd_journal_seek_tail(journal); |
|
||||||
assert(err >= 0); |
|
||||||
|
|
||||||
// workaround for bug https://github.com/systemd/systemd/issues/9934
|
|
||||||
// call sd_journal_previous_skip after sd_journal_seek_tail (like journalctl -f does) to makes things work.
|
|
||||||
sd_journal_previous_skip(journal, 1); |
|
||||||
|
|
||||||
while (!do_exit) { |
|
||||||
err = sd_journal_next(journal); |
|
||||||
assert(err >= 0); |
|
||||||
|
|
||||||
// Wait for new message if we didn't receive anything
|
|
||||||
if (err == 0) { |
|
||||||
err = sd_journal_wait(journal, 1000 * 1000); |
|
||||||
assert(err >= 0); |
|
||||||
continue; // Try again
|
|
||||||
} |
|
||||||
|
|
||||||
uint64_t timestamp = 0; |
|
||||||
err = sd_journal_get_realtime_usec(journal, ×tamp); |
|
||||||
assert(err >= 0); |
|
||||||
|
|
||||||
const void *data; |
|
||||||
size_t length; |
|
||||||
std::map<std::string, std::string> kv; |
|
||||||
|
|
||||||
SD_JOURNAL_FOREACH_DATA(journal, data, length) { |
|
||||||
std::string str((char*)data, length); |
|
||||||
|
|
||||||
// Split "KEY=VALUE"" on "=" and put in map
|
|
||||||
std::size_t found = str.find("="); |
|
||||||
if (found != std::string::npos) { |
|
||||||
kv[str.substr(0, found)] = str.substr(found + 1, std::string::npos); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
MessageBuilder msg; |
|
||||||
|
|
||||||
// Build message
|
|
||||||
auto androidEntry = msg.initEvent().initAndroidLog(); |
|
||||||
androidEntry.setTs(timestamp); |
|
||||||
androidEntry.setMessage(json11::Json(kv).dump()); |
|
||||||
if (kv.count("_PID")) androidEntry.setPid(std::atoi(kv["_PID"].c_str())); |
|
||||||
if (kv.count("PRIORITY")) androidEntry.setPriority(std::atoi(kv["PRIORITY"].c_str())); |
|
||||||
if (kv.count("SYSLOG_IDENTIFIER")) androidEntry.setTag(kv["SYSLOG_IDENTIFIER"]); |
|
||||||
|
|
||||||
pm.send("androidLog", msg); |
|
||||||
} |
|
||||||
|
|
||||||
sd_journal_close(journal); |
|
||||||
return 0; |
|
||||||
} |
|
Loading…
Reference in new issue