créer un fichier journal

22

Existe-t-il un moyen de créer un fichier journal pour conserver certaines données dans / var / log / à l'aide d'une fonction de bibliothèque ou d'un appel système en langage c sous linux. Et je veux aussi connaître les normes que nous devons suivre pour écrire et traiter le journal. Merci

Sushant Jain
la source
Veuillez noter que les questions de programmation sont généralement hors sujet ici; vous devriez leur demander sur Stack Overflow . Une explication de l'API est correcte ici, mais des explications sur la façon de l'utiliser en C ou dans un autre langage de programmation appartiennent normalement à Stack Overflow.
Gilles 'SO- arrête d'être méchant'

Réponses:

31

La manière standard de se connecter à partir d'un programme C est syslog.

Commencez par inclure le fichier d'en-tête:

#include <syslog.h>

Puis au début de votre programme, vous devez configurer syslog en appelant openlog:

openlog("programname", 0, LOG_USER);

Le premier argument est l'identification ou la balise, qui est automatiquement ajoutée au début de chaque message. Mettez le nom de votre programme ici.

Le second argument est les options que vous souhaitez utiliser, ou 0pour le comportement normal. La liste complète des options est disponible man 3 syslog. Celui que vous pourriez trouver utile est LOG_PID, ce qui fait que syslog enregistre également l'ID du processus dans le message du journal.

Ensuite, chaque fois que vous souhaitez écrire un message de journal, vous appelez syslog:

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

Le premier argument est la priorité. Les plages prioritaires de DEBUG( le moins important) à EMERG(uniquement pour les situations d' urgence) avec DEBUG, INFOet ERRétant les plus couramment utilisés. Voir man 3 syslogpour vos options.

Les deuxième et troisième arguments sont un format et un message, tout comme printf.

Le fichier journal dans lequel cela apparaît dépend de vos paramètres Syslog.

Avec une configuration par défaut, il entre probablement dans /var/log/messages.


Vous pouvez configurer un fichier journal personnalisé en utilisant l'une des fonctionnalités de la plage LOG_LOCAL0à LOG_LOCAL7.

Vous les utilisez en modifiant:

openlog("programname", 0, LOG_USER);

à

openlog("programname", 0, LOG_LOCAL0);

ou

openlog("programname", 0, LOG_LOCAL1);

etc.

et en ajoutant une entrée correspondante /etc/syslog.conf, par exemple

local1.info /var/log/programname.log

et redémarrer le serveur syslog, par exemple

pkill -HUP syslogd

La .infopartie des local1.infomoyens ci - dessus que tous les messages qui sont INFOou plus importants seront enregistrés, y compris INFO, NOTICE, ERR(erreur), CRIT(critique), etc., mais pas DEBUG.


Sinon, rsyslogvous pouvez essayer un filtre basé sur les propriétés , par exemple

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

Le syslogtag doit contenir un ":".

Ou, si vous prévoyez de distribuer votre logiciel à d'autres personnes, ce n'est probablement pas une bonne idée de s'appuyer sur l'utilisation LOG_LOCALou un rsyslogfiltre.

Dans ce cas, vous devez utiliser LOG_USER(s'il s'agit d'un programme normal) ou LOG_DAEMON(s'il s'agit d'un serveur), écrire vos messages de démarrage et vos messages d'erreur en utilisant syslog, mais écrire tous vos messages de journal dans un fichier extérieur à syslog. Par exemple, Apache HTTPd se connecte à /var/log/apache2/*ou /var/log/httpd/*, je suppose, en utilisant des appels réguliers open/ fopenet write/ printf.

Mikel
la source
Merci, ce sont des informations très utiles. Mais pourriez-vous s'il vous plaît expliquer plus sur l'option log_local0-7. Par exemple. Je veux écrire mes données (qui ont <self> mot dans la ligne de journal) dans le fichier self.log. et certains journaux dans d'autres fichiers.
Sushant Jain
@Sushant Jain: Quelle distribution et version Linux ciblez-vous? Avez-vous un ancien syslog (ksyslogd) ou rsyslog? rpm -qa | grep syslogou dpkg -l '*syslog*'vous dira probablement lequel.
Mikel
log_local * sont, franchement, des reliques de l'époque où sysklogdétait le seul jeu en ville pour le logiciel syslog. De nos jours , des logiciels comme syslog-ng, rsysloget dsyslogexistent et ont des capacités de filtrage beaucoup plus sophistiquées que tout le service / niveau.
Shadur
Merci beaucoup. Mon problème a été résolu. J'ai une autre question sur l'analyse des données stockées dans le fichier journal. Existe-t-il un bon moyen de le faire? En fait, j'essaie de créer un outil de statistiques système. J'en ai donc besoin.
Sushant Jain
@Sushant Jain. Heureux de vous aider. Veuillez publier votre question d'analyse du journal en tant que question distincte afin que les gens puissent la voir et fournir des réponses appropriées.
Mikel
2

Vous voudrez #include <syslog.h>, puis utilisez les syslog()fonctions pour envoyer des données à n'importe quel programme de journalisation système actif.

Voir la page de manuel ici .

Caleb
la source
La fonction syslog () écrit des données dans / var / log / syslog. alors que je veux écrire des journaux dans mon propre fichier.
Sushant Jain
Comme Mikel l'explique ci-dessous, vous pouvez marquer vos messages de journal de telle manière que syslog comprenne quel programme vous êtes, puis configurer syslog pour écrire vos messages de journal de programmes dans un fichier différent.
Caleb
1

Il y a beaucoup de possibilités, quel est votre plan? Avez-vous juste besoin d'une option pour vous connecter à partir de la ligne de commande? Jetez un oeil à logger(inclus dans bsdutils ). Tapez simplement:

usr@srv % logger test

et il enregistrera quelque chose comme ceci dans votre /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

voir aussi man logger. Selon votre démon de journalisation, vous pouvez trier ces messages dans des fichiers spécifiques ou les filtrer par priorité.

Il existe également des solutions pour différents langages de programmation, alors dites-moi ce que vous voulez faire ;-)

binfalse
la source
En fait, je veux le faire en utilisant le langage c. et j'ai des infos dans le mikel post.
Sushant Jain
1

Le filtrage par nom de programme est écrit différemment de ce qui est mentionné ci-dessus, pour les versions récentes de rsyslog(la version sur ma machine est 5.8.6) comme indiqué ci-dessous:

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

Pour plus d'informations, regardez ici

suresh
la source