crea un file di registro


22

Esiste un modo per creare un file di registro per mantenere alcuni dati in / var / log / con l'aiuto di alcune funzioni di libreria o chiamate di sistema in linguaggio c in linux. E voglio anche conoscere gli standard che dovremmo seguire per scrivere ed elaborare il registro. Grazie


Si noti che qui le domande di programmazione sono generalmente fuori tema; dovresti chiedere loro su Stack Overflow . Una spiegazione dell'API va bene qui, ma le spiegazioni su come usarlo in C o in un altro linguaggio di programmazione appartengono normalmente allo Stack Overflow.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


31

Il modo standard per accedere da un programma C. è syslog.

Inizia includendo il file di intestazione:

#include <syslog.h>

Quindi all'inizio del programma, è necessario configurare syslog chiamando openlog:

openlog("programname", 0, LOG_USER);

Il primo argomento è l'identificazione o il tag, che viene aggiunto automaticamente all'inizio di ciascun messaggio. Inserisci qui il nome del tuo programma.

Il secondo argomento sono le opzioni che si desidera utilizzare o 0per il comportamento normale. L'elenco completo delle opzioni è disponibile man 3 syslog. Uno che potresti trovare utile è LOG_PID, che consente a syslog di registrare anche l'id del processo nel messaggio di registro.

Quindi, ogni volta che si desidera scrivere un messaggio di registro, si chiama syslog:

syslog(LOG_INFO, "%s", "Message");

Il primo argomento è la priorità. Le gamme di priorità da DEBUG(meno importante) a EMERG(solo per le emergenze) con DEBUG, INFOed ERRessendo il più comunemente usato. Vedi man 3 syslogper le tue opzioni.

Il secondo e il terzo argomento sono un formato e un messaggio, proprio come printf.

In quale file di registro appare questo dipende dalle impostazioni del tuo syslog.

Con un'impostazione predefinita, probabilmente entra /var/log/messages.


È possibile impostare un file di registro personalizzato utilizzando una delle funzionalità nell'intervallo LOG_LOCAL0a LOG_LOCAL7.

Li usi cambiando:

openlog("programname", 0, LOG_USER);

a

openlog("programname", 0, LOG_LOCAL0);

o

openlog("programname", 0, LOG_LOCAL1);

eccetera.

e aggiungendo una voce corrispondente a /etc/syslog.conf, ad es

local1.info /var/log/programname.log

e riavviare il server syslog, ad es

pkill -HUP syslogd

La .infoparte di local1.infosuddetti mezzi che tutti i messaggi che sono INFOo più importanti saranno connessi, compreso INFO, NOTICE, ERR(errore), CRIT(critico), ecc, ma non DEBUG.


In alternativa, puoi rsyslogprovare un filtro basato sulle proprietà , ad es

:syslogtag, isequal, "programname:"    /var/log/programname.log

Il syslogtag dovrebbe contenere un ":".

Oppure, se stai pianificando di distribuire il tuo software ad altre persone, probabilmente non è una buona idea fare affidamento sull'uso LOG_LOCALo su un rsyslogfiltro.

In tal caso, è necessario utilizzare LOG_USER(se si tratta di un programma normale) o LOG_DAEMON(se si tratta di un server), scrivere i messaggi di avvio e i messaggi di errore utilizzando syslog, ma scrivere tutti i messaggi di registro in un file esterno syslog. Ad esempio, Apache HTTPd accede a /var/log/apache2/*o /var/log/httpd/*, presumo, usando regolari open/ fopene write/ printfchiamate.


Grazie. Queste sono informazioni abbastanza utili. Per favore, spieghi di più sull'opzione log_local0-7. Per es. Voglio scrivere i miei dati (che hanno <self> parola nella riga di registro) nel file self.log. e alcuni registri in altri file.
Sushant Jain,

@Sushant Jain: quale distribuzione e versione di Linux stai prendendo di mira? Hai un vecchio syslog (ksyslogd) o rsyslog? rpm -qa | grep syslogo dpkg -l '*syslog*'probabilmente ti dirò quale.
Mikel,

log_local * sono, francamente, cimeli del passato quando sysklogdera l'unico gioco in città per il software syslog. Al giorno d'oggi software come syslog-ng, rsysloge dsyslogesistono e hanno capacità di filtraggio molto più sofisticato di servizio solo / livello.
Shadur,

Molte grazie. Il mio problema è stato risolto Ho un'altra domanda sull'analisi dei dati memorizzati nel file di registro. C'è un buon modo per farlo? In realtà sto cercando di creare uno strumento di statistiche di sistema. Quindi ne ho bisogno.
Sushant Jain,

@Sushant Jain. Felice di aiutare. Pubblica la tua domanda di analisi del registro come una domanda separata in modo che le persone possano vederla e fornire risposte adeguate.
Mikel,

2

Sarà necessario #include <syslog.h>, quindi utilizzare le syslog()funzioni per inviare dati a qualunque programma di registrazione del sistema sia attivo.

Vedi la pagina man qui .


La funzione syslog () scrive i dati in / var / log / syslog. mentre voglio scrivere i log nel mio file.
Sushant Jain,

Come Mikel spiega di seguito , puoi taggare i tuoi messaggi di log in modo tale che syslog capisca quale programma sei, quindi configura syslog per scrivere i messaggi di log dei tuoi programmi su un altro file.
Caleb,

1

Ci sono molte possibilità, qual è il tuo piano? Hai solo bisogno di un'opzione per accedere dalla riga di comando? Dai un'occhiata a logger(incluso in bsdutils ). Basta digitare:

usr@srv % logger test

e registrerà qualcosa del genere sul tuo /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

vedi anche man logger. A seconda del demone di registrazione è possibile ordinare questi messaggi in file specifici o filtrarli per priorità.

Ci sono anche alcune soluzioni per diversi linguaggi di programmazione, quindi per favore dimmi cosa vuoi fare ;-)


In realtà voglio farlo usando il linguaggio c. e ho informazioni in post mikel.
Sushant Jain,

1

Il filtro per nome del programma è scritto in modo diverso da quanto menzionato sopra, per le versioni recenti di rsyslog(la versione sulla mia macchina è 5.8.6) come mostrato di seguito:

if $programname == 'popa3d' then /var/log/popa3d.log

Per maggiori informazioni, guarda qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.