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/log
das 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 logger
Befehl 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 logger
dem 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 %06N
und %:z
Formate 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