web-dev-qa-db-fra.com

Comment faire en sorte que la sortie de journalisation Java apparaisse sur une seule ligne?)

Pour le moment, une entrée par défaut ressemble à ceci:

Oct 12, 2008 9:45:18 AM myClassInfoHere
INFO: MyLogMessageHere

Comment puis-je l'obtenir pour faire cela?

Oct 12, 2008 9:45:18 AM myClassInfoHere - INFO: MyLogMessageHere

Clarification J'utilise Java.util.logging

117
Obediah Stane

À partir de Java 7, Java.util.logging.SimpleFormatter permet de récupérer son format à partir d'une propriété système, ce qui ajoute quelque chose comme ceci à la ligne de commande de la machine virtuelle Java entraînera l’impression sur une ligne:

-Djava.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n'

Alternativement, vous pouvez aussi ajouter ceci à votre logger.properties:

Java.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n'
78
Trevor Robinson

1) -Djava.util.logging.SimpleFormatter.format

Java 7 prend en charge une propriété avec le Java.util.Formatter syntaxe de chaîne de format.

-Djava.util.logging.SimpleFormatter.format=... 

Voir ici .

Mon favori est:

-Djava.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n

ce qui rend la sortie comme:

2014-09-02 16:44:57 SEVERE org.jboss.windup.util.ZipUtil unzip: Failed to load: foo.Zip

2) le mettre aux IDE

Les IDE vous permettent généralement de définir les propriétés système d'un projet. Par exemple. dans NetBeans, au lieu d’ajouter -D ... = ... quelque part, ajoutez la propriété dans la boîte de dialogue Actions, sous la forme de Java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-... - sans guillemets. Le IDE devrait comprendre.

3) Faire confiance à Maven - Surefire

Pour votre commodité, voici comment le signaler à Surefire:

        <!-- Surefire -->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <systemPropertyVariables>
                    <!-- Set JUL Formatting -->
                    <Java.util.logging.SimpleFormatter.format>%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n</Java.util.logging.SimpleFormatter.format>
                </systemPropertyVariables>
            </configuration>
        </plugin>

4) fait à la main

J'ai une bibliothèque avec quelques Java.util.logging classes liées . Parmi eux, c'est SingleLineFormatter. Pot téléchargeable ici .

public class SingleLineFormatter extends Formatter {

  Date dat = new Date();
  private final static String format = "{0,date} {0,time}";
  private MessageFormat formatter;
  private Object args[] = new Object[1];

  // Line separator string.  This is the value of the line.separator
  // property at the moment that the SimpleFormatter was created.
  //private String lineSeparator = (String) Java.security.AccessController.doPrivileged(
  //        new Sun.security.action.GetPropertyAction("line.separator"));
  private String lineSeparator = "\n";

  /**
   * Format the given LogRecord.
   * @param record the log record to be formatted.
   * @return a formatted log record
   */
  public synchronized String format(LogRecord record) {

    StringBuilder sb = new StringBuilder();

    // Minimize memory allocations here.
    dat.setTime(record.getMillis());    
    args[0] = dat;


    // Date and time 
    StringBuffer text = new StringBuffer();
    if (formatter == null) {
      formatter = new MessageFormat(format);
    }
    formatter.format(args, text, null);
    sb.append(text);
    sb.append(" ");


    // Class name 
    if (record.getSourceClassName() != null) {
      sb.append(record.getSourceClassName());
    } else {
      sb.append(record.getLoggerName());
    }

    // Method name 
    if (record.getSourceMethodName() != null) {
      sb.append(" ");
      sb.append(record.getSourceMethodName());
    }
    sb.append(" - "); // lineSeparator



    String message = formatMessage(record);

    // Level
    sb.append(record.getLevel().getLocalizedName());
    sb.append(": ");

    // Indent - the more serious, the more indented.
    //sb.append( String.format("% ""s") );
    int iOffset = (1000 - record.getLevel().intValue()) / 100;
    for( int i = 0; i < iOffset;  i++ ){
      sb.append(" ");
    }


    sb.append(message);
    sb.append(lineSeparator);
    if (record.getThrown() != null) {
      try {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        record.getThrown().printStackTrace(pw);
        pw.close();
        sb.append(sw.toString());
      } catch (Exception ex) {
      }
    }
    return sb.toString();
  }
}
71
Ondra Žižka

Semblable à Tervor, mais j'aime bien changer la propriété au moment de l'exécution.

Notez que cela doit être défini avant la création du premier SimpleFormatter - comme cela a été écrit dans les commentaires.

    System.setProperty("Java.util.logging.SimpleFormatter.format", 
            "%1$tF %1$tT %4$s %2$s %5$s%6$s%n");
46
Guy L

Comme le dit Obediah Stane, il est nécessaire de créer votre propre méthode format. Mais je changerais quelques petites choses:

  • Créez une sous-classe directement dérivée de Formatter, pas de SimpleFormatter. Le SimpleFormatter n'a plus rien à ajouter.

  • Soyez prudent avec la création d'un nouvel objet Date! Vous devez vous assurer de représenter la date du LogRecord. Lors de la création d'un nouveau Date avec le constructeur par défaut, il représentera la date et l'heure auxquelles le Formatter traite le LogRecord, pas la date à laquelle le LogRecord établi.

La classe suivante peut être tilisée comme formateur dans un Handler, qui à son tour peut être ajoutée à la Logger. Notez qu'il ignore toutes les informations de classe et de méthode disponibles dans LogRecord.

import Java.io.PrintWriter;
import Java.io.StringWriter;
import Java.util.Date;
import Java.util.logging.Formatter;
import Java.util.logging.LogRecord;

public final class LogFormatter extends Formatter {

    private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    @Override
    public String format(LogRecord record) {
        StringBuilder sb = new StringBuilder();

        sb.append(new Date(record.getMillis()))
            .append(" ")
            .append(record.getLevel().getLocalizedName())
            .append(": ")
            .append(formatMessage(record))
            .append(LINE_SEPARATOR);

        if (record.getThrown() != null) {
            try {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                record.getThrown().printStackTrace(pw);
                pw.close();
                sb.append(sw.toString());
            } catch (Exception ex) {
                // ignore
            }
        }

        return sb.toString();
    }
}
35
Benno Richters

C'est ce que j'utilise.

public class VerySimpleFormatter extends Formatter {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

    @Override
    public String format(final LogRecord record) {
        return String.format(
                "%1$s %2$-7s %3$s\n",
                new SimpleDateFormat(PATTERN).format(
                        new Date(record.getMillis())),
                record.getLevel().getName(), formatMessage(record));
    }
}

Vous obtiendrez quelque chose comme ...

2016-08-19T17:43:14.295+09:00 INFO    Hey~
2016-08-19T17:43:16.068+09:00 SEVERE  Seriously?
2016-08-19T17:43:16.068+09:00 WARNING I'm warning you!!!
10
Jin Kwon

Eclipse config

Pour chaque capture d'écran, dans Eclipse, sélectionnez "Exécuter en tant que" puis "Exécuter les configurations ..." et ajoutez la réponse de Trevor Robinson avec des guillemets doubles au lieu de guillemets. Si vous manquez les guillemets doubles, vous obtiendrez des erreurs du type "impossible de trouver ou de charger la classe principale".

7
rupweb

J'ai trouvé un moyen qui fonctionne. Vous pouvez sous-classer SimpleFormatter et remplacer la méthode de formatage

    public String format(LogRecord record) {
        return new Java.util.Date() + " " + record.getLevel() + " " + record.getMessage() + "\r\n";
    }

Un peu surpris par cette API, j'aurais pensé que plus de fonctionnalités/flexibilité auraient été fournies immédiatement

4
Obediah Stane