Enregistrer les journaux dans une base MySQL avec Syslog-NG
Par défaut, Syslog-NG écrit les événements dans des fichiers textes, dits fichiers journaux, situés dans le dossier "/var/log". Ajouter à cela le stockage dans MySQL permet d'accéder au journaux plus simplement via des interfaces Web telles que PHP-Syslog-NG. Ce guide décrit la configuration d'un backend MySQL à Syslog-NG.
Ce guide est testé sur:
- Debian 6.0 Squeeze
Pré-requis
Ce guide nécessite un serveur MySQL disposant du script mysql-tools disponible dans le guide Installer et configurer MySQL sur Debian.
Ce guide nécessite un serveur Syslog-NG disposant d'une configuration modulaire, telle que décrite par Créer une configuration modulaire pour Syslog-NG.
Paramètres
Renseignez le nom d'hôte du serveur configuré :
DOMAIN="$(cat '/etc/mailname')"
Renseignez le nom d'hôte de votre serveur MySQL (si vous ne savez pas de quoi il s'agit, ne modifiez pas cette valeur) :
MYSQL_HOST="localhost"
Si votre serveur MySQL n'est pas local, ce guide effectuera une connexion SSH pour y créer la base de données.
Installation
Préparation de l'environnement
Installez les logiciels nécessaires:
command apt-get install mysql-client libdbd-mysql
Création de la base de données
Créez la base de données :
if [ "${MYSQL_HOST}" = "localhost" ]; then MYSQL_PARAMS=$(command mysql-tools --db-prefix="syslog" --create "${DOMAIN}") else command echo "Saisissez le mot de passe de l'utilisateur root MySQL :" command read -s PASSWORD MYSQL_PARAMS=$(command ssh "root@${MYSQL_HOST}" "command mysql-tools \
--db-prefix='syslog' --host='$(command cat '/etc/mailname')' \
--password='${PASSWORD}' --create '${DOMAIN}'") fi
Récupérez les paramètres de la nouvelle base de données:
MYSQL_DB="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_DB" \ | cut --delimiter="=" --fields="2-")" MYSQL_USER="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_USER" \ | cut --delimiter="=" --fields="2-")" MYSQL_PASSWORD="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_PASSWORD" \ | cut --delimiter="=" --fields="2-")" echo "${MYSQL_PARAMS}"
Créez la table destinée à contenir les journaux:
command echo "CREATE TABLE IF NOT EXISTS logs ( id bigint unsigned NOT NULL AUTO_INCREMENT, host varchar(128) default NULL, facility varchar(10) default NULL, priority varchar(10) default NULL, level varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime default NULL, program varchar(15) default NULL, msg text, seq bigint unsigned NOT NULL default '0', counter int(11) NOT NULL default '1', fo datetime default NULL, lo datetime default NULL, PRIMARY KEY (id), KEY datetime (datetime), KEY sequence (seq), KEY priority (priority), KEY facility (facility), KEY program (program), KEY host (host) ) ENGINE=MyISAM;" \
| command mysql --user="${MYSQL_USER}" --password="${MYSQL_PASSWORD}" \
--host="${MYSQL_HOST}" "${MYSQL_DB}"
Configuration de Syslog-NG
Configurez Syslog-NG pour stocker les messages dans la base de données:
echo "# Log to MySQL table.
options { stats_freq(3600); keep_hostname(yes); flush_lines(16); log_fifo_size(16384); }; destination d_mysql { sql(type(mysql) host(\"${MYSQL_HOST}\") username(\"${MYSQL_USER}\") password(\"${MYSQL_PASSWORD}\") database(\"${MYSQL_DB}\") table(\"logs\") columns(\"host\", \"facility\", \"priority\", \"level\", \"tag\", \"datetime\", \"program\", \"msg\") values(\"\$HOST_FROM\", \"\$FACILITY\", \"\$PRIORITY\", \"\$LEVEL\", \"\$TAG\", \"\$YEAR-\$MONTH-\$DAY \$HOUR:\$MIN:\$SEC\", \"\$PROGRAM\", \"\$MSG\") indexes(\"host\", \"facility\", \"priority\", \"datetime\", \"program\")); }; log { source(s_src); destination(d_mysql); };" \
> '/etc/syslog-ng/syslog-ng.conf.d/mysql-backend.conf'
Redémarrez le démon:
/etc/init.d/syslog-ng restart
Création d'un utilisateur MySQL pour la consultation
Créez l'utilisateur spécialisé pour la lecture des données enregistrées par Syslog-NG :
if [ "${MYSQL_HOST}" = "localhost" ]; then MYSQL_PARAMS=$(command mysql-tools --db-prefix="syslog" --user-prefix="s_r" \
--grant="SELECT" --adduser="${DOMAIN}" "${DOMAIN}") else command echo "Saisissez le mot de passe de l'utilisateur root MySQL :" command read -s PASSWORD MYSQL_PARAMS=$(command ssh "root@${MYSQL_HOST}" "command mysql-tools \
--db-prefix='syslog' --user-prefix='s_r' --host='$(command cat '/etc/mailname')' \
--password='${PASSWORD}' --grant='SELECT' --adduser='${DOMAIN}' '${DOMAIN}'") fi
Récupérez les paramètres du nouvel utilisateur:
echo "${MYSQL_PARAMS}"
Remerciements
- Merci à la communauté Gentoo pour Syslog-ng directly to MySQL.