A menudo escribo archivos de registro en /tmp o /var cuando hago scripts bash grandes o complicados para ayudar en la depuración o simplemente para rastrear el flujo del programa. Por lo general, hago algo parecido a echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/log
lo cual está bien, pero no es algo que pueda ser ingerido fácilmente en programas que esperan un formato syslog "estándar" (aparte de las bromas de Apache). Intenté obtener el logger
comando para crear un nuevo archivo de registro en algún lugar, pero no parece haber una opción para ello. Sospecho que deja esa parte en manos de syslogd y la configuración de sus instalaciones.
Podría modificar mi formato "estándar" anterior para incluir el nombre de host, una instalación de litera y PID, pero probablemente hay otros matices y formatos que podría estar pasando por alto y que alguien ya ha descubierto.
¿Existe una utilidad similar logger
que pueda escribir un archivo de registro con formato RFCxxx sin pasar por syslog?
Respuesta1
Creo que podrías hacerlo a mano...
La parte divertida son los distintos formatos. Aquí hay funciones para que Bash produzca ambosRFC 5424yRFC 3164mensajes de estilo. Los formatos %06N
y %:z
en la marca de tiempo del primero pueden requerir la fecha GNU, no estoy seguro.
#!/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
El PID impreso es el del script y el resultado es algo como esto:
<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