Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2623 connectés 

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

syslog-ng et mysql

n°1045331
pakicor
Posté le 26-05-2008 à 17:18:36  profilanswer
 

Bonjour,
J'utilise une centralisation de logs avec syslog-ng. Les logs sont ensuite stocker dans une base mysql. J'ai suivis plusieurs Tutos et documentations. Cela fonctionne très bien.  
La ou cela se corse, c'est que j'ai besoin de faire un traitement sur une des variables avant injection.
 
En fait, les logs que je vais centraliser sont uniquement des logs mail (postfix et courier). Le but est de récupérer les ID de mail de postfix contenu dans le message (qui correspond à la variable $MSG) du log, et ensuite d'insérer ces IDs dans un nouveau champ de la table de syslog ('Id' par exemple).  
 
Dans mon fichier de configuration de syslog-ng, j'ai ceci:

Code :
  1. ...
  2. destination d_mysql {       
  3.         program("/usr/bin/mysql -u syslogadmin --password=icor syslog" template("INSERT INTO logs (host,
  4.         facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY',
  5.         '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM',
  6.         '$MSG' );\n" ) template-escape(yes));
  7. };
  8. ...


Mon idée est d'appeler un script avec la même méthode, càd utiliser "program" qui appelle une commande en bash. Dans ce script, je récupère toute les variables du logs, je traite le champ message en recuperant les ID et j'appelle ensuite la commande mysql pour remplir ma base.
 
Le problème c'est que je n'arrive pas à récupérer la valeurs les variables $HOST, $FACILITY,...,$MSG.
 
J'ai tenter d'intercaler une commande "echo" pour tester justement la valeur des variables (ici $MSG):

Code :
  1. destination d_mysql {
  2.         program("echo $MSG >> /root/test.txt" );
  3.         program("/usr/bin/mysql -u syslogadmin --password=icor syslog" template("INSERT INTO logs (host,
  4.         facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY',
  5.         '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM',
  6.         '$MSG' );\n" ) template-escape(yes));
  7. };


       
La bizarrerie, c'est je n'arrive pas à récupérer la valeur $MSG alors que la commande mysql injecte correctement le log dans la base de donnée.
 
Est il possible d'opérer un traitement de la variable $MSG dans le fichier de configuration de syslog-ng avant injection dans la base ?
 
Toute aide est la bienvenue, merci d'avance.
 

mood
Publicité
Posté le 26-05-2008 à 17:18:36  profilanswer
 

n°1046268
pakicor
Posté le 28-05-2008 à 17:17:24  profilanswer
 

J'ai trouvé la solution à mon problème: en faite les "arguments" ou plutôt les "macros" passés en paramètre sont stockés dans le buffer STDIN. Il faut donc lire ce buffer pour récupérer les données.

Code :
  1. template t_essai { template("$HOSTµ$FACILITYµ$PRIORITYµ$LEVELµ$TAGµ$YEAR-$MONTH-$DAY $HOUR:$MIN:$SECµ$PROGRAMµ$MSG'\n" ); };
  2. program("/root/getIdPostfix.sh " template(t_essai));


et Dans mon script j'utilise la commande "read" pour lire le buffer STDIN.
 
     Mais cette solution est pas sans défaut: je perd des logs. Le temps d'exécutions du script bash est trop long par rapport à la vitesse d'arrivée des logs.
 
     Pour résoudre ce problème, je suis repartis à zéro: j'appelle une procédure stockée de mysql, à la place de la commande d'insertion, dans laquelle je traite le champs 'message' pour récupère les IDs de postfix. L'insertion se fait ensuite en fin de la procédure stockée:

Code :
  1. program("/usr/bin/mysql -u syslogadmin --password=icor syslog" template("CALL addToBase( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n" ) template-escape(yes));


Message édité par pakicor le 28-05-2008 à 17:19:03

Aller à :
Ajouter une réponse
 

Sujets relatifs
Mysql vers le closed sourceCode Mysql qui ne passe pas en Bash
problème server : impossible de démarrer apache/mysql[Résolu]Probleme de connexion mysql avec php
Connexion a distance a MySQL[mysql] database list could not be retrieved.
Probleme d'authentification des user avec postfix, mysql et courierQuel versions de PHP, Mysql et apache sous Redhat 5?
PHP ne peut charger l'extension mysqlFichier de log vers serveur SYSLOG ?
Plus de sujets relatifs à : syslog-ng et mysql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR