Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / Syslog / Enregistrer les journaux dans une base MySQL avec Syslog-NG

Enregistrer les journaux dans une base MySQL avec Syslog-NG

Par Pierre-Yves Landuré Dernière modification 02/03/2018 18:04

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