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