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