Dienstprogramm zum Schreiben von Protokolldateien in Bash (Logger erstellt keine Dateien)?

Dienstprogramm zum Schreiben von Protokolldateien in Bash (Logger erstellt keine Dateien)?

Ich schreibe häufig Protokolldateien in /tmp oder /var, wenn ich große oder komplizierte Bash-Skripte erstelle, um das Debuggen zu erleichtern oder einfach den Programmfluss zu verfolgen. Normalerweise mache ich etwas Ähnliches wie echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/logdas hier, was in Ordnung ist, aber nichts, was ohne weiteres in Programme aufgenommen werden kann, die ein „Standard“-Syslog-Format erwarten (Apache-Witze beiseite). Ich habe versucht, den loggerBefehl zum Erstellen einer neuen Protokolldatei irgendwo zu bekommen, aber es scheint keine Option dafür zu geben. Ich vermute, es überlässt diesen Teil syslogd und seiner Einrichtungskonfiguration.

Ich könnte mein oben genanntes „Standard“-Format ändern, um den Hostnamen, eine Bunk-Funktion und eine PID einzuschließen, aber es gibt wahrscheinlich andere Nuancen und Formate, die ich möglicherweise übersehe und die jemand bereits herausgefunden hat.

Gibt es ein ähnliches Dienstprogramm, mit loggerdem eine Protokolldatei im RFCxxx-Format geschrieben werden kann, ohne das Syslog zu durchlaufen?

Antwort1

Ich denke, Sie könnten das einfach von Hand machen ...

Der Spaß sind die verschiedenen Formate. Hier sind Funktionen für Bash, um beides zu erzeugenRFC 5424UndRFC 3164Stilnachrichten. Die %06Nund %:zFormate im Zeitstempel der ersten erfordern möglicherweise ein GNU-Datum, ich bin nicht sicher.

#!/bin/bash

# print RFC 5424 syslog message, without structured data,
# somewhat like 'logger -i --rfc5424=notq', e.g.
# <13>1 2021-10-28T14:48:10.613772+03:00 myhost ilkkachu 20415 - - a problem happened
# format is
# <prio>version date host tag pid - - message
lognew() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift 
        local prio=$(( facility*8 + severity ))
        local version=1
        local date=$(date +"%Y-%m-%dT%H:%M:%S.%06N%:z")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%d %s %s %s %d - - %s\n" "$prio" "$version" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

# print RFC 3164 syslog message,
# somewhat like 'logger -i --rfc3164'
# <13>Oct 28 14:49:13 myhost ilkkachu[20418]: another problem happened
# format:
# <prio>date host tag[pid]: message
logold() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift
        local prio=$(( facility*8 + severity ))
        local date=$(LC_ALL=C date +"%b %_d %H:%M:%S")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%s %s %s[%d]: %s\n" "$prio" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

log_facility=1 # user
log_tag="test"

# 6 = info
lognew 6 testing messaging
# 4 = warning
logold 4 obsolete message format

Die ausgedruckte PID ist die des Skripts und die Ausgabe sieht ungefähr so ​​aus:

<14>1 2021-10-28T15:06:17.413125+03:00 myhost test 20499 - - testing messaging
<12>Oct 28 15:06:17 myhost test[20499]: obsolete message format

verwandte Informationen