web-dev-qa-db-fra.com

Journalisation avec plusieurs paramètres

Je travaille actuellement sur un programme dans lequel, je dois écrire toutes les sorties dans un fichier journal.

J'ai besoin d'écrire une méthode de journal, qui devrait donner une sortie avec un niveau, un message, une valeur d'objet, un autre message, une valeur entière, un autre message et une autre valeur entière, dans le même ordre que je l'ai spécifié. Je n'arrive pas à trouver une méthode de journal qui fait cela. J'utilise Java.util.logging. Est-ce possible?

14
Gash87

Je suppose que vous avez besoin du format de journal dans le format ci-dessous FINE, Message1, object.GetValue (), Message2,1, Message3,2

Vous devez créer un format de message de sortie

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2});

Vous devez maintenant créer un formateur personnalisé qui, en étendant la classe Formatter

public class DataFormatter extends Formatter {

@Override
public synchronized String format(LogRecord record) {
    String formattedMessage = formatMessage(record);
    String throwable = "";
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions
    if (record.getThrown() != null) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        pw.println();
        record.getThrown().printStackTrace(pw);
        pw.close();
        throwable = sw.toString();
    }
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable);
}
}

Maintenant, définissez le formateur nouvellement créé

    for(int i=0;i<logger.getHandlers().length;i++)
        logger.getHandlers()[i].setFormatter(new DataFormatter());
22
Rohit

C'est un sujet assez ancien, de toute façon, mes deux cents, car je préfère également utiliser Java.util.logging.Logger` dans mes projets lorsque cela est suffisant.

Lambdas rend cette extension de Formatter passe-partout pour plusieurs paramètres personnalisés plus ou moins obsolète, sauf si vous bénéficiez de sa réutilisation à l'échelle de l'application. Dans (mes) scénarios simples, les messages de journal sont adaptés à la partie de code où ils sont insérés, donc String.format() est généralement beaucoup plus facile et plus flexible.

Avant Java 8 et lambdas, le Formatter était la seule possibilité de reporter la construction du message. Le seul alternative était de construire le message pour se connecter à l'avance avant que la vérification loggable basée sur le niveau n'ait lieu.
Avec Java 8 lambdas, le formatage de la chaîne peut être reporté après la vérification de loggable, mais toujours avec accès à l'original contexte de la méthode. Le seul petit inconvénient est que tous les champs accessibles doivent être finaux, en raison des restrictions lambda.

Voici un extrait assez simple:

final String val1 = "lambda expression log message";
final Level level = Level.INFO;
Logger.getGlobal().log(level, () -> 
        String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level)
);
Logger.getGlobal().log(level, new RuntimeException(), () -> 
        String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level)
);

J'espère que cela aide certains d'entre vous qui souhaitent également utiliser la journalisation intégrée :-)

Bravo Ben

10
Ben Steinert

Nous avons utilisé le code ci-dessous lors de l'utilisation de l'enregistreur slf4j -

logger.error("Error while finding A from DB. a : {} and b : {}", a,b);
logger.info("Nothing found in db for A with a : {} and b : {}",a,b);
8
Sanchi Girotra