2010-11-29 2 views
13

J'ai vu le code qui utilise log4j, qui acquiert logger pour une donnée Logger utilisantEn utilisant getSimpleName() vs getName() pour l'acquisition d'enregistreur

static public Logger getLogger(String name) 

et

static public Logger getLogger(Class clazz) 

avec l'ancien api passé explicitement avec getSimpleName(), tandis que le dernier utilise getName() sur le passé Class. Y a-t-il une différence entre ces deux-là? Est-ce que cela affecterait si je configure différents paquets pour se connecter au niveau différent dans le fichier log4j.properties?

+0

Déjà couvert dans l'article mentionné http://stackoverflow.com/q/15202997 – mhasan

Répondre

2

Vous pourriez être confus si vous avez plusieurs classes avec le même simpleName dans différents paquets. Avoir de nombreux enregistreurs avec le même nom ne devrait pas être un problème autrement - juste pourrait être déroutant.

20

Oui, il y a une énorme différence.

Je n'utilise jamais simpleName pour Logger par exemple car il supprime le nom du paquet. En plus d'avoir des problèmes lorsque le même nom de classe existe dans deux packages différents (conduisant à l'obtention par les deux classes de la même instance de logger), vous perdez la possibilité de contrôler l'héritage de l'enregistreur.

par exemple. pour deux enregistreurs:

com.foo.A 
com.foo.B 

dans les propriétés, je peux avoir:

log4j.logger.com.foo=DEBUG,CONSOLE 
4

Je préfère utiliser le nom complet (Class.getName()). Lorsque les paquets sont organisés correctement, cela permet d'ajuster log4j pour gérer différemment les messages provenant de différentes parties de l'arborescence des paquets java. Par exemple, vous pouvez facilement configurer toutes les classes dans des packages en commençant par "com.mycompany.infra" pour utiliser un appender spécifique, et ne consigner que les messages de niveau WARN ou supérieur.

10

E.g. Ma classe ShapeDemo.java réside dans le paquet com.test, et j'ai écrit du code comme ci-dessous.

System.out.println("Name-->"+ShapeDemo.class.getName()); 
System.out.println("SimpleName-->"+ShapeDemo.class.getSimpleName()); 

Affichera suivante

Name-->com.test.ShapeDemo 
SimpleName-->ShapeDemo 
3

L'utilisation de this.getClass() getName().

Retours:. Alin.iwin.flickrbrowser.GetRawData

Pendant ce temps

getSimpleName() private String = LOG_TAG this.getClass()

;

Renvoie uniquement: GetRawData.

Questions connexes