|
||
| [IT] "syslog.h", scrivere log di sistema in C | ||
|
"syslog.h", scrivere log di sistema in C. Syslogd e' un demone di sistema tramite il quale i programmi possono salvare i propri log. Ad esempio, il kernel, il server FTP, quello DNS e tanti altri programmi usano syslogd. Lo scopo di questo articoletto, pero' non e' spiegare il funzionamento di syslog, bensi' mostrare come usarlo nei propri programmi C. Per usare le funzioni di logging e' necessario installare il pacchetto (rpm per Linux RedHat) glibc-devel-....Il file da includere nei propri programmi e' syslog.h,il quale altro non fa che puntare a sys/syslog.h. L'interfaccia syslog.h contiene soprattutto le seguenti tre funzioni da usare per interfacciarsi con il sistema di logging.
Livello di logging (sys/syslog.h). Piu' e' basso il valore della costante, piu' il log e' importante: #define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */Tipo di messaggio (sys/syslog.h): #define LOG_KERN (0<<3) /* kernel messages */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */ #define LOG_AUTH (4<<3) /* security/authorization messages */ #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */ #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* ftp daemon */Opzioni di apertura del log (sys/syslog.h): #define LOG_PID 0x01 /* log the pid with each message */ #define LOG_CONS 0x02 /* log on the console if errors in sending */ #define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ #define LOG_NDELAY 0x08 /* don't delay open */ #define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ #define LOG_PERROR 0x20 /* log to stderr as well */Il seguente e' un esempio funzionante di come scrivere un messaggio di log. Per compilare il semplice programma e creare l'eseguibile "test", basta usare "gcc test.c -otest". Una volta compilato, per eseguirlo digitare "./test" dalla directory contenente l'eseguibile.
//-------------------------
// File: test.c
// Comp.: gcc test.c -otest
// Run: test
//-------------------------
#include <syslog.h>
int main()
{
//Apro la connessione al sistema di logging nella modalita' voluta
openlog("test", LOG_CONS || LOG_PID, LOG_DAEMON);
//Scrivo il messaggio
syslog(LOG_DAEMON || LOG_WARNING,"Ciao questa e' una prova di Gabriele");
//Chiudo la connessione
closelog();
}
Il codice e' stato compilato ed eseguito su una distribuzione Linux RedHat 7.0.Il messaggio "personalizzato" e' stato scritto nel file /var/log/messagesPiu' precisamente, vediamo un esempio di come potrebbe apparire il messaggio: May 31 18:44:00 ... test[15213]: Ciao questa e' una prova di GabrieleLa struttura e' semplice. La prima cosa che viene scritta e' il timestamp, ovvero il momento esatto in cui viene salvata l'informazione (precisione al secondo). Seguono l'identificazione della macchina/host (al posto dei puntini), il nome che e' stato associato al processo (in questo caso lo stesso "test", come scritto nella chiamata ad "openlog()") con il PID fra parentesi quadre ed infine, il testo voluto. Un'ultimo esempio, per provare parametri differenti:
//-------------------------
// File: test2.c
// Comp.: gcc test2.c -otest2
// Run: test2
//-------------------------
#include <syslog.h>
int main()
{
//Apro la connessione al sistema di logging nella modalita' voluta
openlog("testGabry", LOG_CONS || LOG_PID, LOG_MAIL);
//Scrivo il messaggio
syslog(LOG_MAIL || LOG_EMERG,"Prova per un'emergenza!!!");
//Chiudo la connessione
closelog();
}
Rispetto al primo esempio, cambiano il livello (LOG_EMERG), il tipo di messaggio (LOG_MAIL) e l'identificativo del programma
nel file di log. Il risultato prodotto sara' qualcosa del tipo:
Jun 4 00:05:41 ... testGabry[1220]: Prova per un'emergenza!!!Notare come il nome scritto sia "testGabry", nonostante il programma abbia come nome "test2". Inoltre, questa volta, sempre su Linux RedHat, il log viene scritto in /var/log/maillogproprio in virtu' dell'utilizzo della costante "LOG_MAIL". |
||
(c) 1999-2006
|