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