staging.inyokaproject.org

systemd log level in syslog anzeigen

Status: Gelöst | Ubuntu-Version: Server 20.04 (Focal Fossa)
Antworten |

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Hallo,

ich habe einen Service, der syslog abgrast. Anschließend kann ich dort nach Loglevel filtern. Dazu brauche ich den LogLevel in der jeweiligen Log-Zeile.

Dummerweise schreibt der journald die systemd-Logs ohne LogLevel, z.B.

systemd[1]: Failed to set up mount unit: Invalid argument

So eine Unart.

Kann ich dem journald irgendwie beibringen, dass er seine Einträge in syslog mit dem jeweiligen Loglevel ausstattet?

Via journalctl habe ich nun raus gefunden, dass dieser Eintrag als Warning klassifiziert wird.

Danke schon mal für eure Hilfe!

Gruß BillMaier

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

BillMaier schrieb:

Dummerweise schreibt der journald die systemd-Logs ohne LogLevel, z.B.

Der Loglevel ist schon intern vorhanden, er wird nur nicht standardmäßig mit ausgegeben

Kann ich dem journald irgendwie beibringen, dass er seine Einträge in syslog mit dem jeweiligen Loglevel ausstattet?

Mir fallen da einige Möglichkeiten dazu ein:

When outputting to a tty, lines are colored according to priority: lines of level ERROR and higher are colored red; lines of level NOTICE and higher are highlighted; lines of level DEBUG are colored lighter grey; other lines are displayed normally.

journalctl -u vdr.service -o json-pretty --since=-1m
{
        "__MONOTONIC_TIMESTAMP" : "15040569",
        "_EXE" : "/usr/bin/vdr",
        "__CURSOR" : "s=842a1b15f7254354933430f498240f95;i=b44bf7;b=bc3940086c7446be9f788f484aef2ce5;m=e58039;t=5a5f187770cf4;x=b15fb0b418245cf3",
        "_UID" : "666",
        "_SYSTEMD_UNIT" : "vdr.service",
        "SYSLOG_TIMESTAMP" : "May 18 21:54:21 ",
        "_PID" : "1150",
        "_GID" : "666",
        "_SOURCE_REALTIME_TIMESTAMP" : "1589831661980653",
        "_BOOT_ID" : "bc3940086c7446be9f788f484aef2ce5",
        "_SYSTEMD_INVOCATION_ID" : "567c24b85f7d4a3999821f5aec86aa3a",
        "_CAP_EFFECTIVE" : "2802000",
        "_SELINUX_CONTEXT" : "unconfined\n",
        "PRIORITY" : "6",
        "SYSLOG_IDENTIFIER" : "vdr",
        "_COMM" : "vdr",
        "SYSLOG_FACILITY" : "1",
        "_SYSTEMD_SLICE" : "system.slice",
        "MESSAGE" : "[1150] VDR version 2.4.1 started",
        "_HOSTNAME" : "yavdr08",
        "_MACHINE_ID" : "f263b7ebc4134365aa21753be243d985",
        "_TRANSPORT" : "syslog",
        "_CMDLINE" : "/usr/bin/vdr",
        "__REALTIME_TIMESTAMP" : "1589831661980916",
        "_SYSTEMD_CGROUP" : "/system.slice/vdr.service"
} 

Das kann man dann natürlich formatieren lassen (die Lösung ist so noch nicht perfekt, weil es Messages mit abweichenden Feldern geben kann):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
import fileinput
import json

LOGLEVEL = {
"1": "ALERT",
"2": "CRIT",
"7": "DEBUG",
"0": "EMERG",
"3": "ERR",
"6": "INFO",
"5": "NOTICE",
"4": "WARNING",
}

for line in fileinput.input():
    l = json.loads(line.rstrip())
    print(f"[{LOGLEVEL.get(l['PRIORITY'])}] {l['SYSLOG_RAW'].partition('>')[-1]}", end='')
./format_syslog.py < <(journalctl -u vdr -o json) 
  • Ein exiustierendes Programm wie pentix/qjournalctl so erweitern, dass man nicht nur nach Loglevel filtern kann, sondern es die auch mit anzeigt

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Vielen Dank.

Ich habe das jetzt erstmal so gelöst, dass ich das Loglevel auf error gesetzt habe:

cat /etc/systemd/journald.conf 
## Do not edit on server - for this will be overwritten by ansible provisioning

# Defaults can be restored by simply deleting this file.
# See journald.conf(5) for details.

[Journal]
MaxLevelSyslog=err

Für mich trotzdem unverständlich, dass man sich immer selbst um alles kümmern muss ...

Gruß BillMaier

Antworten |