Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

"syslog.h", scrivere log di sistema in C

        Scritto: Giansante Gabriele, 04/06/2001     

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.
  • void openlog( char *ident, int option, int facility )

    Serve ad aprire una connessione al logger di sistema.
    Il parametro ident rappresenta l'identificativo del programma all'interno del file di log. Nell'esempio mostrato successivamente, e' stato usato "test" come nome, cioe' lo stesso del programma generante. Non e' detto che il nome del programma ed il suo identificativo debbano essere uguali.
    In option bisogna indicare, in OR fra loro, le opzioni relative alla scrittura del log. Nell'esempio sono state usate LOG_PID e LOG_CONS. La prima consente di scrivere anche il PID del processo nel log, mentre la seconda permette la visualizzazione del messaggio di log sulla console nel caso non lo si riesca a scrivere su file.
    Infine, facility, rappresenta il tipo di messaggio per cui si apre la connessione al logger. Nell'esempio, facciamo finta che si tratti di un demone che vuole scrivere qualcosa.

  • void closelog( )

    Chiude la connessione aperta con "openlog".

  • void syslog( int priority, char *format )
    void syslog( int priority, char *format, ... )

    Con questa funzione si possono scrivere i propri messaggi sui file di log opportuni (dipende dai parametri usati in "openlog" e "syslog"). Il funzionamento e' simile alla funzione "printf", vediamo perche'.
    Innanzitutto, la priorita' e' una combinazione in OR del tipo di log, come specificato anche in "openlog", e del livello di logging (importanza del messaggio). Nell'esempio, il livello usato e' quello di WARNING (avvertimento).
    La stringa format contiene il testo da scrivere nel log. Si chiama "format" perche' e' in tutto analoga a quella dell'istruzione "printf": e' possibile indicare dei valori da sostituire nella stringa (%c, %d, %f, ecc.). Fa eccezione il simbolo "%m" che viene sostituito dalla stringa di errore identificata dall'ultimo valore di errno (vedere la gestione degli errori in C).
Prima di passare all'esempio di come si usano effettivamente le funzioni di logging, e' utile dare un'occhiata veloce ad un sottoinsieme significativo (non completo) delle costanti da poter usare come livello, opzioni e tipo di messaggio. Tutte le definizioni si possono trovare nel file "sys/syslog.h" ("/usr/include/sys/syslog.h" in Linux RedHat).

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/messages
Piu' precisamente, vediamo un esempio di come potrebbe apparire il messaggio:
May 31 18:44:00 ... test[15213]: Ciao questa e' una prova di Gabriele
La 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/maillog
proprio in virtu' dell'utilizzo della costante "LOG_MAIL".


Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'