web-dev-qa-db-fra.com

Pourquoi logger.getLogger () de log4j doit passer un type de classe?

J'ai lu quelques articles sur l'utilisation de log4j . La plupart d'entre eux donnent le code ci-dessous au début:

 Logger logger = Logger.getLogger("com.foo.Bar");

ou

 Logger logger = Logger.getLogger(XXX.class);

Cela initialisera l'objet enregistreur.Mais ma question est de savoir pourquoi il faut envoyer le type de classe en tant que paramètre. Il semble que lorsque j'utilise l'enregistreur, je ne me soucie pas de la classe dans laquelle je l'utilise.Alors le type de classe ne semble pas avoir d'effet sur l'enregistreur . Si je déclare un enregistreur comme statique et public, je peux l'appeler à un autre class, Alors quelle est l'intention de l'auteur de le concevoir comme ceci? Le type de classe liera-t-il quelque chose lorsque j'utilise l'enregistreur? Ou je peux envoyer n’importe quel type de classe à la fonction getLogger.

53
roast_soul
  1. Vous pouvez toujours utiliser n'importe quelle chaîne en tant que nom de journal autre que le type de classe. C'est définitivement ok.

  2. La raison pour laquelle beaucoup de gens utilisent le type de classe, je suppose:

    • Facile à utiliser. Vous n'avez pas à vous soucier de la duplication du nom du consignateur dans une application Java EE complexe. Si d'autres personnes utilisent également votre nom de logger, vous pouvez avoir un fichier journal ne comprenant pas uniquement la sortie de votre classe;

    • Il est facile de vérifier la classe de journalisation, car le nom du consignateur apparaîtra dans le fichier journal. Vous pouvez naviguer rapidement vers la classe spécifique.

    • Lorsque vous distribuez votre classe, les utilisateurs peuvent vouloir rediriger la journalisation de votre classe vers un fichier spécifique ou ailleurs. Dans ce cas, si vous utilisez un nom d’enregistreur spécial, il se peut que nous devions vérifier le code source ou qu’il soit impossible de le faire si aucune source n’est disponible.

55
Jintian DENG

De javadoc : Logger.getLogger(Class) est un raccourci pour getLogger(clazz.getName()). Une convention utilisée avec log4j et d'autres infrastructures de journalisation consiste à définir un enregistreur statique par classe. Par exemple,

public class SomeClass {
    private static final Logger LOG = Logger.getLogger(SomeClass.class);
    ...
}

J'ai trouvé que cette convention fonctionne bien pour l'organisation de la sortie de journalisation. Ce n'est certainement pas obligatoire, mais c'est une pratique utile.

8
John McCarthy

1: vous pouvez utiliser "nom de classe" ou "nom de chaîne" lorsque vous définissez dans log4j.properties avant, .__, tel que 

log4j.logger.anything=INFO,anything

alors, vous pouvez enregistrer votre journal comme 

 Logger logger = Logger.getLogger("anything");

2: Si vous définissez un nom de journal, vous pouvez le vérifier facilement, car ils sont séparés.

6
Liubey

Cela peut dépendre d'une bibliothèque de journalisation spécifique, mais il s'agit généralement de plus qu'un nom. Cela signifie la hiérarchie de l'enregistreur . Lorsque vous configurez votre enregistreur, vous transmettez généralement le niveau d'enregistrement et le nom de l'enregistreur, comme suit:

<logger name="org.hibernate" level="ALL"/>

Cet attribut n’est pas simplement un nom, il signifie une hiérarchie. Et si au lieu de cela vous écriviez quelque chose comme:

<logger name="org" level="ALL"/>

non seulement en hibernation, mais tout ce qui est dans le paquet org sera impacté ... Par contre, si vous écrivez quelque chose comme:

<logger name="org.hibernate.validator" level="ALL"/>

cela ne concernera que le paquet de validation d'Hibernate, et pas le reste d'Hibernate.

À propos, si vous ne voulez pas spécifier une classe concrète pour chaque usine, vous pouvez utiliser quelque chose comme (Kotlin):

val logger: Logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
0
yuranos87

XXX.class est de nommer votre enregistreur, c'est-à-dire d'indiquer les instructions de journal suivantes . Pour vous donner une idée de la classe à laquelle certaines instructions de journal appartiennent/sont originaires.

0
TheWhiteRabbit

L'enregistreur avec nom de classe n'est pas obligatoire, vous pouvez utiliser votre propre message. Il est d'usage d'utiliser: 

Logger logger = Logger.getLogger(XXX.class) 

et est utile pour déboguer. Il enregistrera quelle ligne de code est exécutée.

0
Farhad