Envoyer des messages de journalisation à un autre location

Je veux envoyer des messages du programme C et du script Perl vers un file (par exemple, / var / log / mon_log). Je n'ai pas access à la configuration du démon syslog, donc je pense au lancement d'un démon syslog différent (syslog-ng).

Je suis capable d'envoyer des messages à partir de la command line, en utilisant la command logger et son option -u . Ces messages de journal sont enregistrés sur mon_log au lieu du file de messages habituel, mais je ne peux pas reproduire le même comportement de C ou Perl.

Apparemment, la fonction openlog n'a pas la possibilité de spécifier un socket pour la journalisation ou le PID du process de journalisation ou quelque chose qui me permet d'envoyer les messages à mon propre journal au lieu du journal système.

Peut-il être fait ou est-il impossible d'utiliser la bibliothèque syslog ?

Vous avez raison, la libc openlog() ne vous permet pas de spécifier un socket, mais cela ne serait généralement utile que si vous aviez besoin d'un syslogd séparé. (Une socket n'est pas la même chose que le file auquel les messages sont connectés, bien sûr.)

logger défaut (sur la plupart des systèmes, je pense) user.notice , donc si vous vous connectez au bon endroit, vous devriez faire quelque chose comme ça dans C:

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

Ou en perl:

 use Sys::Syslog qw(:DEFAULT setlogsock); setlogsock 'unix'; # setlogsock('unix','/opt/my_root/dev/log'); openlog("myprog","pid","user"); syslog("info","my message..."); 

Consultez vos openlog(3) et Sys::Syslog(3) pour plus de détails sur les constantes.

Si vous voulez vraiment vous connecter à un autre socket que /dev/log vous pouvez le faire facilement en perl avec la deuxième forme de setlogsocket() comme ci-dessus. Vous devrez peut-être utiliser un package Sys::Syslog récent, je l'ai vu échouer avec v0.17 quand un path d'access est spécifié.

Il est un peu tromper en C, vous devez connect() à la socket AF_UNIX et write() avec le bon format de message . Je vous recommand de lire la source pour logger (fonctions myopenlog() et mysyslog() ) dans une version récente is-util-linux-2.x .

Sur Linux (glibc) et FreeBSD, le path openlog() par openlog() est codé en dur ( _PATH_LOG depuis /usr/include/syslog.h ), je ne connais aucun moyen de le modifier lors de l'exécution (autre qu'un chroot ou .so injection de DLL).