ti-enxame.com

Gravar no arquivo de log personalizado a partir de um script Bash

No Linux, sei como escrever uma mensagem simples no arquivo /var/log/messages, em um simples script do Shell que criei:

#!/bin/bash
logger "have fun!"

Quero parar de lançar mensagens no arquivo /var/log/messages padrão e criar o meu.

Eu tentei isso:

#!/bin/bash
logger "have more fun" > /var/log/mycustomlog

Ele ainda registra em /var/log/messages. Ele criou o /var/log/mycustomlog, mas está vazio.

Alguém viu o que estou perdendo?

34
coffeemonitor

logger registra nos recursos do syslog. Se você deseja que a mensagem vá para um arquivo específico, é necessário modificar a configuração do syslog adequadamente. Você pode adicionar uma linha como esta:

local7.*   -/var/log/mycustomlog

e reinicie o syslog. Então você pode fazer o logon assim:

logger -p local7.info "information message"
logger -p local7.err "error message"

e as mensagens aparecerão no arquivo de log desejado com o nível de log correto.

Sem fazer alterações na configuração do syslog, você poderia usar logger assim:

logger -s "foo bar" 2>> /var/log/mycustomlog

Isso instruiria logger a imprimir a mensagem para STDERR também (além de registrá-la no syslog), para que você pudesse redirecionar STDERR para um arquivo. No entanto, seria totalmente inútil, porque a mensagem já está registrada via syslog de qualquer maneira (com a prioridade padrão user.notice).

35
Ansgar Wiechers

@chepner defende que logger é dedicado ao registro de mensagens.

Eu preciso mencionar que @Thomas Haratyk simplesmente perguntou por que eu simplesmente não usei echo.

Na época, eu não sabia sobre eco, pois estou aprendendo Shell-scripting, mas ele estava certo.

Minha solução simples agora é esta:

#!/bin/bash
echo "This logs to where I want, but using echo" > /var/log/mycustomlog

O exemplo acima substituirá o arquivo após o>

Então, eu posso acrescentar a esse arquivo com isto:

#!/bin/bash
echo "I will just append to my custom log file" >> /var/log/customlog

Obrigado rapazes!

  • em uma nota lateral, é simplesmente minha preferência pessoal manter meus registros pessoais em /var/log/, mas tenho certeza de que existem outras boas idéias por aí. E como eu não criei um daemon, /var/log/ provavelmente não é o melhor lugar para o meu arquivo de log personalizado. (apenas dizendo)
31
coffeemonitor

Há uma boa quantidade de detalhes no registro de scripts do Shell por meio de variáveis ​​globais do Shell. Podemos emular o tipo semelhante de registro no script do Shell: http://www.cubicrace.com/2016/03/efficient-logging-mechnism-in-Shell.html O post possui detalhes sobre a introdução níveis de log como INFO, DEBUG, ERROR. Detalhes de rastreamento, como entrada de script, saída de script, entrada de função, saída de função.

Exemplo de log: enter image description here

6
Piyush Chordia

Se você vir a página do manual do logger:

$ man logger

LOGGER (1) Manual de Comandos Gerais do BSD LOGGER (1)

NAME logger - uma interface de comando do Shell para o módulo de log do sistema syslog (3)

SINOPSE registrador [-isd] [-f arquivo] [-p pri] [-t tag] [-u socket] [message ...]

DESCRIÇÃO O registrador faz entradas no log do sistema. Ele fornece uma interface de comando do Shell para o módulo de log do sistema syslog (3).

Diz claramente que fará o log do sistema. Se você deseja fazer logon no arquivo, pode usar ">>" para redirecionar para o arquivo de log.

3
pallav_rus

Eu fiz isso usando um filtro. A maioria dos sistemas Linux usa o rsyslog atualmente. Os arquivos de configuração estão localizados em /etc/rsyslog.conf e /etc/rsyslog.d.

Sempre que executo o comando logger -t SRI some message, desejo que "alguma mensagem" apareça apenas em /var/log/sri.log.

Para fazer isso, adicionei o arquivo /etc/rsyslog.d/00-sri.conf com o seguinte conteúdo.

# Filter all messages whose tag starts with SRI
# Note that 'isequal, "SRI:"' or 'isequal "SRI"' will not work.
#
:syslogtag, startswith, "SRI" /var/log/sri.log

# The stop command prevents this message from getting processed any further.
# Thus the message will not show up in /var/log/messages.
#
& stop

Em seguida, reinicie o serviço rsyslogd:

systemctl restart rsyslog.service

Aqui está uma sessão do Shell mostrando os resultados:

[[email protected] html]# logger -t SRI Hello World!
[[email protected] html]# cat /var/log/sri.log
Jun  5 10:33:01 rpm-server SRI[11785]: Hello World!
[[email protected] html]#
[[email protected] html]# # see that nothing shows up in /var/log/messages
[[email protected] html]# tail -10 /var/log/messages | grep SRI
[[email protected] html]#
0
shrewmouse