diff --git a/scripts/syslog-tail.sh b/scripts/syslog-tail.sh index 6dbfef6..6d1d920 100644 --- a/scripts/syslog-tail.sh +++ b/scripts/syslog-tail.sh @@ -25,6 +25,22 @@ set -u +# WICHTIG: Telegraf startet inputs.exec-Unterprozesse mit den Rechten des +# Dienst-Benutzers (im Container uid=999 "telegraf"), NICHT mit den Rechten des +# Telegraf-Prozesses. /hostfs/var/log/syslog gehoert Gruppe "adm" (Modus 640) — +# als uid 999 ist die Datei nicht lesbar und das Script gibt still nichts aus. +# Deshalb: Lesen ueber cat als root, wenn wir nicht schon root sind und sudo/cat +# verfuegbar ist. +read_head() { + if [ "$(id -u)" -eq 0 ]; then + head -c "$2" "$1" 2>/dev/null + elif command -v sudo >/dev/null 2>&1; then + sudo -n head -c "$2" "$1" 2>/dev/null + else + head -c "$2" "$1" 2>/dev/null + fi +} + FILES="${SYSLOG_FILES:-/hostfs/var/log/syslog /hostfs/var/log/kern.log}" MAX_LINES="${SYSLOG_MAX_LINES:-500}" STATE_DIR="${SYSLOG_STATE_DIR:-/var/lib/telegraf-syslog}" @@ -71,17 +87,14 @@ for f in $FILES; do for (i = 1; i <= length(s); i++) { c = substr(s, i, 1); if (c < "0" || c > "9") return 0 } return 1 } - # "2026-09-13T22:52:10..." -> Sekunden seit Epoche (mktime braucht "Y M D H M S") - function ts2epoch(t, y, mo, d, h, mi, se) { - if (length(t) < 19) return 0 - if (substr(t, 5, 1) != "-" || substr(t, 8, 1) != "-" || substr(t, 11, 1) != "T") return 0 - y = substr(t, 1, 4); mo = substr(t, 6, 2); d = substr(t, 9, 2) - h = substr(t, 12, 2); mi = substr(t, 15, 2); se = substr(t, 18, 2) - if (!isdig(y) || !isdig(mo) || !isdig(d) || !isdig(h) || !isdig(mi) || !isdig(se)) return 0 - # mktime ist bei mawk vorhanden; sonst Fallback auf jetzt - e = mktime(y " " mo " " d " " h " " mi " " se) - return (e > 0) ? e : 0 - } + # WICHTIG: KEINEN Zeitstempel selbst berechnen. + # Die Syslog-Zeit ist LOKAL (+02:00), mawk/mktime kennt aber keine + # Zeitzonen-Offsets — im UTC-Container entstand daraus ein Wert 2 h in der + # Zukunft und Loki wies jeden Push ab: + # "entry for stream '{…}' has timestamp too new: 2026-09-13T23:08:19Z" + # Ohne Zeitstempel stempelt Telegraf die Zeile beim Einsammeln — bei + # interval = 30s genau genug und zeitzonensicher. + function ts2epoch(t) { return 0 } /./ { line = $0 @@ -91,7 +104,6 @@ for f in $FILES; do if (substr(line, 5, 1) == "-" && substr(line, 8, 1) == "-" && substr(line, 11, 1) == "T") { sp1 = index(line, " ") if (sp1 > 0) { - ts = substr(line, 1, sp1 - 1) rest = substr(line, sp1 + 1) sp2 = index(rest, " ") if (sp2 > 0) { host = substr(rest, 1, sp2 - 1); rest = substr(rest, sp2 + 1) } @@ -106,16 +118,12 @@ for f in $FILES; do msg = substr(msg, colon + 2) } } - e = ts2epoch(ts) - if (e > 0) ns = e "000000000" } } - if (ns == "") ns = sprintf("%.0f000000000", systime()) - - # Tag heisst jhost, NICHT host: Telegraf setzt host= als global_tag. - printf "journal,source=%s,ident=%s,priority=%s,jhost=%s message=\"%s\" %s\n", \ - etag(SRC), etag(ident), etag(prio), etag(host), estr(msg), ns + # Kein Zeitstempel -> Telegraf setzt ihn (zeitzonensicher, siehe oben). + printf "journal,source=%s,ident=%s,priority=%s,jhost=%s message=\"%s\"\n", \ + etag(SRC), etag(ident), etag(prio), etag(host), estr(msg) } '