Qu'est-ce que "logger" en Java?


J'ai une classe dans laquelle je vois les choses suivantes:

this.logger.severe("");
this.logger.warning("");
this.logger.info("");

Je ne comprends pas plusieurs choses:

  1. Comment pouvons-nous utiliser une méthode qui n'a pas été définie plus tôt? Je veux dire, il n'y a pas de méthodes "logger" définies dans la classe. Je pensais que ces méthodes pouvaient être définies car la classe considérée est une extension d'une autre classe dans laquelle le "logger" est défini. Mais dans la définition de la classe, il n'y a pas d'instruction "extends" (seulement "mettre").

  2. Je peux comprendre des choses comme ça: "ObjectName.methodName". Mais quelle est donc cette "objectName.something1.something2"? "something1.something2" est le nom d'une méthode? Les noms de méthode peuvent-ils contenir des points?

  3. Qu'est-Ce exactement ces "logger.*" faire? Je pense qu'ils enregistrent des informations sur l'exécution du code. Ils écrivent en quelque sorte un rapport sur ce qui s'est passé pendant l'exécution. Mais où je peux trouver ça de l'information?

AJOUTÉ:

Dans le début du fichier, j'ai: import java.util.logging.Logger;
Et puis dans la classe que j'ai: private Logger logger = Logger.getLogger("a.b.c.d");
Donc, logger est un objet de la classe Logger (mais je ne comprends pas pourquoi ils n'ont pas pu instancier la classe de manière habituelle en utilisant "new Logger()). Je ne comprends pas non plus quel enregistreur exactement.sévère ( "" ) faire.

Author: Roman, 2010-03-09

5 answers

L'enregistreur ne fait rien de spécial. C'est tout simplement le code Java.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething() {
        this.logger.debug("foo");
    }
}

Le this.logger pointe simplement vers la variable d'instance nommée logger de l'instance courante (this). Le préfixe this. est d'ailleurs superflu dans cet exemple. On pourrait aussi juste faire logger.debug("foo") ici.

S'il n'est pas déclaré dans le SomeClass lui-même, il a probablement été déclaré dans la classe d'extension. Vérifiez la classe déclarée dans extends.

Votre objectName.something1.something2 doute, avez-vous déjà regardé comment fonctionne System.out.println()? L'System.out retourne un PrintStream objet qui a un println() la méthode. Ainsi, si objectName.something renvoie un fullworthy Object avec des méthodes, vous pouvez simplement continuer à enchaîner les appels de méthodes.

Fondamentalement,

objectName.something1.something2;

Peut être traduit par

SomeObject someObject = objectName.something1;
someObject.something2;

Mais si vous n'avez pas besoin de someObject ailleurs dans le code, il peut simplement être raccourci comme dans votre exemple.

Mise à Jour: selon votre mise à jour:

Donc, enregistreur est un objet de la classe Logger (mais je ne comprends pas pourquoi ils n'ont pas pu instancier la classe de manière habituelle en utilisant "new Logger ()). Je ne comprends pas non plus quel enregistreur exactement.sévère ( "" ) faire.

Il suffit de lire le javadoc de la classe en question ce que tout cela fait. Quant à savoir pourquoi il ne peut pas être instancié, c'est à cause du modèle d'usine.

Mise à Jour 2: comme par l'autre confusion:

Je ne comprends pas pourquoi ils utilisent "ce". Je veux dire, si j'utilise juste le nom du champ, ne serait-il pas, par défaut, le champ de cet objet? J'ai il y a une différence entre "ce.x" et "x"?

De cette façon, vous pouvez être plus explicite sur celui auquel vous souhaitez accéder. Si la méthode contient par exemple un argument ou une variable locale avec le nom logger, alors this.logger ferait toujours référence à la variable d'instance.

public class SomeClass {
    private Logger logger = LogFactory.getLogger(SomeClass.class);

    public void doSomething(Logger logger) {
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method argument.
    }

    public void doSomethingElse() {
        Logger logger = LogFactory.getLogger(SomeClass.class);
        this.logger.debug("foo"); // Refers to the instance variable.
        logger.debug("foo"); // Refers to the method local variable.
    }
}
 10
Author: BalusC, 2010-03-09 18:27:55
  1. Le 'logger' sera un autre objet, pas une méthode. Cet enregistreur de classe aura méthodes définies comme public void severe(String message)

  2. 'something1" sera un objet contenu par "nomobjet". Par exemple, Car.Engine.Cylinder.Fire(), il est considéré comme une mauvaise pratique d'utiliser une méthode à l'incendie d'une voiture cylindres comme ceci, et vous devriez faire quelque chose de plus comme Car.StartEngine() (voir , la loi de déméter pour plus d'infos)

  3. L'enregistreur gardera un enregistrement de ce qui s'est passé dans votre programme, donc si il y a un crash ou un bug plus tard, vous pouvez voir ce qui s'est passé. Que cela soit enregistré dans un fichier texte ou dans une base de données quelque part, cela dépendra de l'implémentation de votre enregistreur.

 2
Author: Kirschstein, 2010-03-09 17:34:27
  1. , L'enregistreur de données se réfère généralement à l'utilisation d'une classe dans log4j.
  2. L'enregistreur est un objet membre dont la fonction par exemple severe est appelée.
  3. L'enregistreur se connecte généralement dans un fichier (cela peut être configuré via log4j.xml ou un autre fichier de configuration ou pendant le démarrage du programme).

Edit: A changé le lien log4j.

 1
Author: amit_grepclub, 2010-03-09 17:31:52

Enregistreur n'est pas une méthode mais une variable de classe qui semble être un objet qui expose les méthodes de "grave", "avertissement" et "info".

Vérifiez votre classe pour quelque chose comme "someClass logger = new someClass ();"

 0
Author: Morfildur, 2010-03-09 17:28:47

Le java.util.La classe Logger est le point d'accès principal à l'API de journalisation Java. Voici comment créer un enregistreur:

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

La chaîne passée en paramètre à la méthode d'usine getLogger() est le nom de l'enregistreur à créer. Vous pouvez choisir le nom librement, mais le nom indique où se trouve l'enregistreur dans la hiérarchie de l'enregistreur. Chacun . (point) dans le nom est interprété comme une branche dans la hiérarchie.

 0
Author: , 2015-12-08 08:57:17