Bonjour,
Comme Mickaël l'a expliqué, l'intérêt de LogTools#getLog() est de
pouvoir déclarer un logger avec un simple copier-coller. Je ne
saurais dire pourquoi cette idée, a priori bonne, n'est pas plus
répandue. J'imagine que c'est lié aux inconvénients introduits
pour récupérer la classe de la méthode appelante.
Au départ, il y avait effectivement un mécanisme de lever
d'exception qui nous permettait de récupérer le bon nom de classe.
Cette façon de faire n'étant pas très performante, j'avais pris la
décision de régler le problème de performance en utilisant la
classe Sun.reflect.Reflection. La contre-partie est que la classe
n'existe que dans certaines jvm (sun et openjdk par ex.) et qu'il
est imposible de l'exécuter dans certains environnements de
sécurité restreinte (applets notamment).
OK pour revenir à une déclaration plus classique en écrivant à la
main le nom de classe. Pour ne pas avoir à changer plus d'une
ligne, vous pouvez garder le nom de variable LOG.
Adrien
Le 02/02/2013 05:10, Mickaël Tricot a écrit :
Bonsoir,
J'ai écrit l'implémentation initiale de LogTools#getLog(), qui a
apparemment évoluée depuis.
L'unique avantage est de pouvoir copier-coller cette ligne d'une
classe à l'autre sans risque d'erreur.
C'est moins performant que la méthode classique —
LoggerFactory.getLogger(HelloWorld.class) — puisqu'il s'agit de
générer une exception, d'analyser la stacktrace pour récupérer la
classe appelante et enfin de générer le logger adéquate. Générer
une exception est coûteux et généralement déconseillé, mais
j'avais jugé ce surcoût négligeable dans une telle application.
Revenir à la méthode plus conventionnelle est une bonne idée, car
plus compréhensible pour les autres développeurs. Concernant le
nom de la variable, j'ai une préférence pour le nom concis (LOG),
mais il s'agit seulement là d'une habitude ou d'une question de
goût.
Cordialement,
Mickaël
On 01/02/2013 18:13, Eric Chatellier wrote:
Actuellement nous avons:
private static final Log LOG = LogTools.getLog();
La convention slf4j est plutôt:
private static final Logger logger =
LoggerFactory.getLogger(HelloWorld.class);
Ce qui implique de renommer aussi la variable "LOG" en LOGGER
dans toute
la classe également.
La modification est plus importante que modifier une seule ligne
dans chaque classe.
Une autre question. C'est la première fois que je vois la
déclaration
des logs de façon générique:
private static final Log LOG = LogTools.getLog();
qui récupère un Log sur la classe en haut de la stack actuelle.
Je suis curieux de savoir si c'est performant et s'il y a une
source
qui explique les avantages (voire pourquoi ce n'est pas plus
répandu).
Ce mécanisme utilise, de plus, un import
"sun.reflect.Reflection"
(dans nc.ird.module.utils.GenericsTools) qui est déconseillé.
_______________________________________________
Cantharella-devel mailing list
Cantharella-devel@list.forge.codelutin.com
http://list.forge.codelutin.com/cgi-bin/mailman/listinfo/cantharella-devel
--
Adrien Cheype
Ingénieur en Systèmes d'Information
Service « Informatique Scientifique et Appui aux Partenaires du
Sud »
Direction du Système d'Information (DSI)
http://www.ird.fr/dsi/
http://www.ird.fr/informatique-scientifique/
INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT
BP A5 - 98848 Nouméa - Nouvelle Calédonie
Tél. +687 260 789