Il modo standard per accedere da un programma C è syslog
.
Inizia includendo il file di intestazione:
#include <syslog.h>
Quindi, all'inizio del tuo programma, dovresti configurare syslog chiamando openlog
:
openlog("programname", 0, LOG_USER);
Il primo argomento è l'identificativo o il tag, che viene aggiunto automaticamente all'inizio di ogni messaggio. Inserisci qui il nome del tuo programma.
Il secondo argomento sono le opzioni che vuoi usare, o 0
per il comportamento normale. L'elenco completo delle opzioni è in man 3 syslog
. Uno che potresti trovare utile è LOG_PID
, che fa in modo che syslog registri anche l'id del processo nel messaggio di log.
Quindi, ogni volta che vuoi scrivere un messaggio di log, chiami syslog
:
syslog(LOG_INFO, "%s", "Message");
Il primo argomento è la priorità. La priorità va da DEBUG
(meno importante) a EMERG
(solo per emergenze) con DEBUG
, INFO
e ERR
essendo il più comunemente usato. Vedi man 3 syslog
per le tue opzioni
Il secondo e il terzo argomento sono un formato e un messaggio, proprio come printf.
Il file di log in cui appare dipende dalle impostazioni del tuo syslog.
Con una configurazione predefinita, probabilmente va in /var/log/messages
.
Puoi impostare un file di registro personalizzato utilizzando una delle funzionalità nell'intervallo LOG_LOCAL0
a LOG_LOCAL7
.
Li usi cambiando:
openlog("programname", 0, LOG_USER);
a
openlog("programname", 0, LOG_LOCAL0);
o
openlog("programname", 0, LOG_LOCAL1);
ecc.
e aggiungendo una voce corrispondente a /etc/syslog.conf
, ad esempio
local1.info /var/log/programname.log
e riavviare il server syslog, ad es.
pkill -HUP syslogd
Il .info
parte di local1.info
sopra significa che tutti i messaggi che sono INFO
o più importanti verranno registrati, incluso INFO
, NOTICE
, ERR
(errore), CRIT
(critico), ecc., ma non DEBUG
.
Oppure, se hai rsyslog
, potresti provare un filtro basato sulla proprietà, ad esempio
:syslogtag, isequal, "programname:" /var/log/programname.log
Il tag syslog dovrebbe contenere un ":".
Oppure, se hai intenzione di distribuire il tuo software ad altre persone, probabilmente non è una buona idea fare affidamento sull'utilizzo di LOG_LOCAL
o un rsyslog
filtro.
In tal caso, dovresti usare LOG_USER
(se è un programma normale) o LOG_DAEMON
(se è un server), scrivi i tuoi messaggi di avvio e di errore usando syslog
, ma scrivi tutti i tuoi messaggi di log in un file al di fuori di syslog
. Ad esempio, Apache HTTPd accede a /var/log/apache2/*
o /var/log/httpd/*
, presumo di usare il normale open
/fopen
e write
/printf
chiamate.
Ti consigliamo di #include <syslog.h>
, quindi utilizza syslog()
funzioni per inviare dati a qualunque programma di registrazione del sistema sia attivo.
Vedi la pagina man qui.