# Framework Spring/Log4j

* Présentation de Spring
* Mise en place de l'environnement
* Création d'un projet simple
* Hello world!
* Application Context
* Fichier properties
* Bases de données
* Resources
* Configuration par annotations
* Log4j
* Les beans
* Présentation de Spring
* Mise en place de l'environnement
* Création d'un projet simple
* Hello world!
* Application Context
* Fichier properties
* Bases de données
* Resources
* Configuration par annotations
* Log4j
* Les beans
[ Modifier le sommaire ]

# Présentation

Log4j est un outil de journalisation permettant une personnalisation des logs pour chaque programme. Il peut être utile pour déboguer ou garder les traces de fonctionnement d'un programme déjà en production. On utilisera Maven pour gérer les dépendances.

# Hello world!
## pom.xml

Pour utiliser les fonctionnalités de Maven, on peut modifier le fichier pom.xml afin d'intégrer les bibliothèques de log4j :
Ici on ajoute un bloc <dependencies> avec une seule dépendance concernant log4j. La version est indiquée via une propriété, ici la 2.8.2, définie plus haut dans le fichier pom.xml. C'est une bonne pratique d'éviter d'avoir des numéros de version en dur directement dans les dépendances afin de rendre le fichier plus générique et ainsi plus facilement maintenable.
Pour inclure la bibliothèque dans le projet, il est nécessaire de mettre à jour le projet via clique droit sur le projet, puis Maven, puis Update Project, on obtient alors cette fenêtre.

## Fichier de configuration de log4j

Une fois que la librairie a été ajoutée, il faut créer un fichier de configuration afin de fournir les informations à log4j pour fonctionner. Ce fichier peut être au format xml ou au format texte, finissant par .properties. Le format xml est moins facile à lire mais offre plus de possibilités.
Il faut créer un répertoire « resources » dans le projet et placer un fichier log4j2.xml dedans :
Le fichier ci-dessous permet une écriture dans la console :
La propriété version est indispensable et indique le numéro de version de xml. L'encodage, via le paramètre encoding, est facultatif mais recommandé, utf-8 est à préconiser pour son universalité dans les années 2010. Dans la balise PatternLayout on indique le modèle de conversion, pattern. Il va permettre de spécifier le format des données dans chaque ligne. Le %d va permettre d'indiquer les dates et heures. %-5p indique le niveau de log avec toujours 5 caractères d'utilisés ce qui permet de mieux aligner les lignes. %C indique la classe et %L le numéro de ligne du log ceci est important en cas de débogage. Le nombre entre accolades est le niveau de précision, s'il n'y a pas de problème de performance, il est opportun de le mettre à un niveau élevé, 10 par exemple. %m est pour le message tandis que %n est un retour à la ligne. Plus d'informations ici.
Il est important d'indiquer la date et l'heure pour savoir quand ont eu lieu les évènements, notamment en production. Il faut garder en tête que les logs sont souvent la première source d'information quand un incident arrive en production, il faut donc qu'ils soient lisibles et explicites, y compris en situation d'urgence.
Quand la librairie et les fichiers de configuration ont été ajoutés, il faut modifier la classe principale pour faire l'affichage. On utilise le niveau de log information, via .info ici :

## Résultat

Cela donne le résultat suivant :
On peut voir que l'on a les millisecondes ici, ceci peut être utile pour avoir une idée plus précise des méthodes consommant du temps processeur.

# Fichiers de configuration multiples

Par défaut la configuration de log4j va se faire via ce répertoire appelé resources avec un fichier log4j2.xml.
On peut modifier en indiquant un autre fichier de configuration :
Dans ce fichier on peut modifier par rapport au premier en enlevant les millisecondes, on indique explicitement le format de date et heure que l'on souhaite :
Pour donner explicitement le chemin du nouveau fichier on modifie le main de la manière suivante :
Le résultat est le suivant :

# Écriture dans un fichier

Dans l'exemple précédent on écrivait directement dans la console. C'est pratique pour déboguer mais inutile en production, ceci peut être néfaste si cela écrit directement dans catalina.out. Il est donc nécessaire de configurer le fichier log4j.xml pour avoir également une écriture dans un fichier :
Ici on ajout donc un appender nommé fileOut qui écrit dans le fichier C:\\Spring\\SimpleJavaProject.log. Comme on laisse l'appender STDOUT on obtient les deux sorties pour une même ligne de log avec le fichier créé :
Le main générant le log peut être réduit au minimum :
Dans le contenu du fichier on obtient le même résultat qu'avec la console :

# Rotation des logs

La rotation de log est la gestion des fichiers de logs lorsque ceux-ci ont atteint une taille ou une ancienneté maximum.

## Rotation selon la taille

On modifie le fichier de log de la manière suivante pour obtenir une rotation avec une taille de 100 Ko maximum par fichier :
Ensuite on modifie le main pour un affichage de 100 000 fois "Hello World!" via log4j.
Cela donne les fichiers générés suivant :
On voit qu'à chaque milliseconde un nouveau fichier d'environ 100 Ko est généré.

## Rotation selon l'ancienneté

Sans changer le fichier main, on modifier ici le fichier log4j2.xml :
Cela donne le résultat suivant :
On voit que chaque seconde un nouveau fichier est généré indépendamment de la taille. On constate également qu'il y a un changement pour les millisecondes, cela est lié au temps de traitement, log4j n'est pas déterministe.