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
).