Syslog-ng et base mysql
Par Toniob le vendredi, mai 11 2007, 11:06 - Geekerie - Lien permanent
On peut trouver assez facilement sur internet des tutoriaux permettant de mettre en place un serveur de log centralisé grâce à php-syslog-ng. Je ne peux d'ailleurs que vous conseillez celui d'ubuntu-fr. Toutefois la technique employée me semblait un peu complexe.
Alors je me suis un peu creusé la tête. Ça m'a causé un anévrisme mais ça passera je crois. Donc pour résumer, afin de peupler la base Mysql avec logs arrivant sur le serveur, on indique au démon de les envoyer dans un tube. Ensuite, un script tourne en boucle afin de lire le contenu et d'écrire dans la base données.
Vous pouvez vous en rendre compte, on a vu mieux qu'une boucle infinie qui va consommer un peu trop de ressources. Sans compter qu'il faut lancer ce script automatiquement au démarrage et personnellement, j'aime pas trop polluer mon répertoire /etc/init.d/.
La solution que j'ai trouvé est de s'appuyer sur une autre méthode de syslog-ng, la redirection vers un programme. En effet, Mysql peut être lancer en mode batch. Ainsi, il n'y a pas de prompt et le client se met en attente de commandes SQL. C'est exactement ce qu'on veut. Il suffit de configurer syslog-ng ainsi :
destination d_mysql {
program(
"mysql -u syslogfeeder --password=xxxxxxxx syslog -B > /dev/null"
template("INSERT INTO logs (host, facility, priority,
level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL',
'$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n")
template-escape(yes)
);
};
Et voilà, pas besoin d'utiliser plein d'artifices, ça se fait tout seul. Le seul problème, c'est que le mot de passe d'accès à la base de données et visible via la commande ps. Mais normalement, l'accès au serveur devrait être contrôlé...
Commentaires
Yo !
J'avais trouvé la méthode préconisé par balabit pas terrible (script shell et mysqlclient).
J'ai développé ça:
http://freshmeat.net/projects/my_pi...
Est il possible de faire un traitement sur la variable $MSG avant l'injection ? mon but est de récupérer des ID de log mail postfix contenu dans le message ($MSG) et de les ajouter dans un nouveau champ ID dans la table mysql...
Pas à ma connaissance avec syslog-ng. Par contre, il existe des fonctions en mysql qui permettent de travailler sur les chaînes de caractères, ça peut être un bon départ.