2014-10-29 9 views
6

In meinen Projektklassen habe ich java.util.logging.Logger verwendet und verschiedene Protokollausgaben in meinem Code hinzugefügt, mit verschiedenen Log-Ebenen, dh.Gradle Logging Output Levels

src/main/java/Run.java

import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Run{ 


    public static void main(String args[]){ 
     System.out.println("Hello World"); 

     logger.log(Level.CONFIG, "Just some config info"); 
     Logger logger = Logger.getLogger(Run.class.getName()); 
     logger.log(Level.INFO, "Just logging some info"); 
     logger.log(Level.FINE, "Fine logging"); 
     logger.log(Level.FINER, "Finer logging"); 
     logger.log(Level.WARNING, "This is a warning log!"); 

    } 
} 

Zur Zeit, als ich gradle -i test alle Log-Meldungen mit dem Level.INFO definiert sind, gezeigt, aber keiner der Config laufen, zu warnen oder feine Meldungen ausgegeben.

Ich habe versucht, meine build.gradle Datei zu aktualisieren, so dass:

apply plugin: 'java' 
apply plugin:'application' 
mainClassName = "Run" 

repositories { 
    mavenCentral() 
} 

dependencies { 
    testCompile "junit:junit:4.11" 
} 

run{ 
    systemProperties = ['java.util.logging.config.file' : 'logging.properties'] 
} 

ich aufgenommen haben:

systemProperties = ['java.util.logging.config.file' : 'logging.properties'] 

Dann erstellt /src/main/resource/Protokollierung. Eigenschaften

handlers= java.util.logging.ConsoleHandler 
.level= CONFIG 
java.util.logging.ConsoleHandler.level = FINER 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

Running:

gradle run 

ich:

:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:run 
Hello World 

BUILD SUCCESSFUL 

Und wenn gradle -i-läufer laufen ich: erfolgreich gestartet Prozess 'Befehl' /Library/Java/JavaVirtualMachines/jdk1.8.0_20 .jdk/Contents/Home/bin/java '' Hallo Welt : run (Thread [main, 5, main]) abgeschlossen. Dauerte 0,202 Sekunden.

BUILD SUCCESSFUL 

dh. keine Protokollierungsinformationen. Doch die system.properties Kommentierung aus innerhalb der Lauf Aufgabe und wieder laufen gradle -i laufen ich:

Successfully started process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/bin/java'' 
Hello World 
Nov 05, 2014 12:07:42 PM Run main 
INFO: Just logging some info 
Nov 05, 2014 12:07:42 PM Run main 
WARNING: This is a warning log! 
:run (Thread[main,5,main]) completed. Took 0.229 secs. 

BUILD SUCCESSFUL 

Eintrag Warnstufe Protokolle, aber nicht die feinen oder feineren.

tldr;

Wie bekomme ich die Config, feine & feinere Level-Protokolle auf die Konsole in einem generischen Gradle Java-Projekt zu protokollieren?

Antwort

8

Mehrere Optionen (Ich persönlich bevorzuge Option 2.2):

1) Individuelle logging.properties Datei:

Die Java Logging API eine Standard-Protokollkonfigurationsdatei auf <JRE_HOME>/lib/logging.properties hat. Sie können Ihre eigene Konfigurationsdatei verwenden, indem Sie die JVM-Eigenschaft java.util.logging.config.file festlegen.

handlers = java.util.logging.ConsoleHandler 

Run.handlers = java.util.logging.ConsoleHandler 
Run.level = FINER 
Run.useParentHandlers = false 

java.util.logging.ConsoleHandler.level = ALL 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

Sie haben useParentHandlers = false gesetzt von den Eltern Handler bekommen doppelte Ausdrucke zu vermeiden.

1.1) Stellen Sie oben Eigenschaft mit absoluter Pfad

nicht einmal ;-) versuchen Hat

1,2) laden benutzerdefinierte Datei folgt, wie in Run.java

Laden sie wie folgt in Run.java:

InputStream inputStream = Run.class.getResourceAsStream("mylogging.properties"); 
    try { 
     LogManager.getLogManager().readConfiguration(inputStream); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

2) Benutzerdefinierte Systemeigenschaft (dh: logLevel)

definieren ein systemProperty in Ihrem build.gradle:

run { 
    systemProperty 'logLevel', System.getProperty('logLevel') 
} 

hinzufügen defaultLogLevel in Run.java:

public static Level defaultLevel = Level.INFO; 

den Wert von logLevel Eigentum:

String logLevel = System.getProperty("logLevel"); 

und die definierten Ebene in Logger gesetzt: Erstellen

Logger logger = Logger.getLogger(Run.class.getName()); 
logger.setLevel(logLevel.isEmpty() ? defaultLevel : Level.parse(logLevel)); 

2,1) ein neues ConsoleHandler und Ausschaltzeiten Druck von den Eltern Handler

System.out.println(Run.class.getName()); 
    Logger logger = Logger.getLogger(Run.class.getName()); 
    logger.setLevel(logLevel.isEmpty() ? defaultLevel : Level.parse(logLevel)); 

    Handler consoleHandler = new ConsoleHandler(); 
    consoleHandler.setLevel(logLevel.isEmpty() ? defaultLevel : Level.parse(logLevel)); 
    logger.addHandler(consoleHandler); 

    logger.setUseParentHandlers(false); 

2,2) Finden Eltern ConsoleHandler und Satz definierte Ebene

Logger topLogger = Logger.getLogger(""); 

    Handler consoleHandler = null; 
    for (Handler handler : topLogger.getHandlers()) { 
     if (handler instanceof ConsoleHandler) { 
      //found the console handler 
      consoleHandler = handler; 
      break; 
     } 
    } 

    if (consoleHandler == null) { 
     // not found, create a new one 
     consoleHandler = new ConsoleHandler(); 
     topLogger.addHandler(consoleHandler); 
    } 
    //set the console handler level 
    consoleHandler.setLevel(logLevel.isEmpty() ? defaultLevel : Level.parse(logLevel)); 

Mit diesem, gradle run liefert Nachrichten oberhalb der Standardstufe (INFO). Mit

gradle run -DlogLevel=FINE 

können Sie steuern, welche Nachrichten angezeigt werden.

+0

Wenn Sie SLF4J mit Logback verwenden, beachten Sie, dass die Schnittstelle 'org.slf4j.Logger' nicht über die Methode' setLevel' verfügt. Aber 'ch.qos.logback.classic.Logger' implementiert diese Schnittstelle und verfügt über diese Methode. Um den 'Logger' zu erstellen, müssen Sie daher die letztere Klasse importieren und dann wie folgt umwandeln: 'Logger LOGGER = (Logger) LoggerFactory.getLogger (MyClass.class)' –