¿Utilidad de escritura de archivos de registro en bash (el registrador no crea archivos)?

¿Utilidad de escritura de archivos de registro en bash (el registrador no crea archivos)?

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/loglo 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 loggercomando 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 loggerque 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 %06Ny %:zen 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

información relacionada