Envie mensagens de log para um local diferente

3

Eu quero enviar mensagens do programa C e do script Perl para um arquivo (por exemplo, / var / log / my_log). Eu não tenho acesso à configuração do daemon syslog, então eu acho que no lançamento de um daemon syslog differente (syslog-ng).

Eu sou capaz de enviar mensagens a partir da linha de comando, usando o comando logger e sua opção -u . Essas mensagens de log são registradas no my_log em vez do arquivo de mensagens usual, mas não consigo reproduzir o mesmo comportamento de C ou Perl.

A função openlog, aparentemente, não tem nenhuma opção para especificar um soquete para registro, ou o PID do processo de registro ou algo que me permita enviar as mensagens para o meu próprio log, em vez do log do sistema.

Pode ser feito ou é impossível usar a biblioteca syslog ?

    
por JoseLSegura 01.03.2013 / 13:13

1 resposta

3

Você está correto, a libc openlog() não permite que você especifique um soquete, mas isso geralmente seria útil se você precisasse de um syslogd separado. (Um socket não é o mesmo que o arquivo que as mensagens estão logadas, é claro).

logger é o padrão (na maioria dos sistemas eu acho) user.notice , então se ele estiver logando no lugar correto você deve fazer algo assim em C:

#include <syslog.h>
  ...
  openlog("myprog",LOG_PID,LOG_USER);
  syslog(LOG_INFO,"%s","my message...");

Ou em perl:

use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock 'unix';   
# setlogsock('unix','/opt/my_root/dev/log');

openlog("myprog","pid","user");
syslog("info","my message...");

Veja as páginas openlog(3) e Sys::Syslog(3) man para detalhes sobre as constantes.

Se você realmente quiser logar em um socket diferente de /dev/log , você pode fazer isso facilmente em perl com a segunda forma de setlogsocket() como acima. Você pode precisar usar um pacote Sys::Syslog recente, eu vi ele falhar com a v0.17 quando um caminho é especificado.

É um pouco mais complicado em C, você precisa connect() para o AF_UNIX socket e write() para com o formato de mensagem correto . Eu recomendo que você leia a fonte para logger (funções myopenlog() e mysyslog() ) em uma versão recente do ish util-linux-2.x .

No Linux (glibc) e no FreeBSD, o caminho que openlog() usa é codificado ( _PATH_LOG de /usr/include/syslog.h ), não sei como alterá-lo em tempo de execução (além de um chroot ou% injeção da DLL.so).

    
por 01.03.2013 / 15:08

Tags