Envia a saída do comando para a tela e o syslog

3

Estou tentando enviar a saída de um comando para o nosso syslog e é isso que eu tenho até agora.

#!/bin/bash
log()
{
    logger -s -t $(basename $0) "$@"
}

/bin/echo "test" 2>&1 | (log)

e isso funciona perfeitamente!

[root@server bin]# sh /var/tmp/script.sh 
script.sh: test

No entanto, quando tento acrescentar uma string ao início da mensagem de log, ela não funciona!

#!/bin/bash
log()
{
    logger -s -t $(basename $0) "DEBUG: $@"
}

/bin/echo "test" 2>&1 | (log)

Esta é a saída

[root@server bin]# sh /var/tmp/script.sh
script.sh: DEBUG:

Como posso descompactar a variável $ @ / $ * e também adicionar um prefixo à mensagem de log sem perder o stdout do comando original?

    
por AK47 06.05.2016 / 11:57

2 respostas

2

Este é o comportamento documentado:

message

Write this message to the log; if not specified, and the -f flag is not provided, standard input is logged.

Felizmente, você pode adicionar as informações necessárias à entrada padrão do registrador:

log()
{
    {
        printf "DEBUG: $@"          # Prepends the prefix.
        cat                         # Outputs the original input.
    } | logger -s -t $(basename $0)
}
    
por 06.05.2016 / 12:13
1

A transmissão de argumentos para uma função que pode ser usada como $1 ou $@ não é igual à leitura de stdin .

Você terá que buscar os dados de stdin primeiro. O seguinte pode não ser a solução ideal, mas fornece uma dica:

#!/bin/bash
log()
{
    read INPUT
    logger -s -t $(basename $0) "DEBUG: $INPUT"
}

echo "test" | (log)
    
por 06.05.2016 / 12:14