utilitário de gravação de arquivo de log no bash (o logger não cria arquivos)?

utilitário de gravação de arquivo de log no bash (o logger não cria arquivos)?

Costumo escrever arquivos de log em /tmp ou /var ao criar scripts bash grandes ou complicados para ajudar na depuração ou simplesmente para rastrear o fluxo do programa. Eu geralmente faço algo parecido com echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/logo que é bom, mas não algo que possa ser facilmente ingerido em programas que esperam um formato syslog "padrão" (piadas do Apache à parte). Tentei obter o loggercomando para criar um novo arquivo de log em algum lugar, mas não parece haver uma opção para isso. Eu suspeito que isso deixa essa parte para o syslogd e sua configuração de instalação.

Eu poderia modificar meu formato "padrão" acima para incluir nome de host, um recurso de beliche e PID, mas provavelmente há outras nuances e formatos que posso estar ignorando e que alguém já descobriu.

Existe um utilitário semelhante ao loggerque pode gravar um arquivo de log formatado em RFCxxx sem passar pelo syslog?

Responder1

Acho que você poderia fazer isso manualmente...

A parte divertida são os vários formatos. Aqui estão as funções para o Bash produzir ambosRFC 5424eRFC 3164mensagens de estilo. Os formatos %06Ne %:zno carimbo de data/hora do primeiro podem exigir a data GNU, não tenho certeza.

#!/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

O PID impresso é o do script e a saída é mais ou menos assim:

<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

informação relacionada