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