2014-10-29 28 views
6

W moich zajęciach z projektów użyłem java.util.logging.Logger i dodałem różne wyniki logów w całym moim kodzie, używając różnych poziomów logów, tj.Poziomy wyjściowe rejestrowania Gradle

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!"); 

    } 
} 

Obecnie gdy uruchomię gradle -i test wszystkie komunikaty dziennika z Level.INFO zdefiniowanej są pokazane, ale żaden z config, ostrzec lub drobne komunikaty są wyprowadzane.

Próbowałem zaktualizowaniu build.gradle plik taki, że:

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'] 
} 

podaję:

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

Następnie tworzone /src/main/zasobów/rejestrowanie. właściwości

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

Bieg:

gradle run 

uzyskać:

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

BUILD SUCCESSFUL 

A kiedy uruchomiony Gradle -i bieg uzyskać: udało się uruchomić komendę '' proces /Library/Java/JavaVirtualMachines/jdk1.8.0_20 .jdk/Contents/Home/bin/java '' Hello World : uruchom (Wątek [główny, 5, główny]) zakończony. Zajęło 0,02 sekundy.

BUILD SUCCESSFUL 

tj. brak informacji rejestracyjnych. Jednak zakomentowanie system.properties od wewnątrz Uruchom zadanie i ponownie uruchomiony Gradle -i bieg uzyskać:

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 

informacji i poziom ostrzegawczy dzienniki, lecz nie te drobne lub drobniejsze.

tldr;

Jak uzyskać konfigurację, dokładne & logów na poziomie dokładniejszym, aby zalogować się do konsoli w ogólnym projekcie gradle java?

Odpowiedz

8

kilka opcji (ja osobiście wolę opcję 2.2):

1) Custom logging.properties plików:

rejestrowanie Java API ma domyślny plik konfiguracyjny rejestrowania w <JRE_HOME>/lib/logging.properties. Możesz użyć własnego pliku konfiguracyjnego, ustawiając właściwość JVM java.util.logging.config.file.

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 

Musisz ustawić useParentHandlers = false aby uniknąć duplikatów wydruki z obsługą macierzystych.

1.1) Ustaw powyżej działce z bezwzględną ścieżką

nawet nie próbował ;-)

1,2) Załaduj niestandardowy plik w następujący Run.java

załadowaniem go w następujący Run.java:

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

2) Własna właściwość systemu (np. logLevel)

Definiowanie systemProperty w swojej build.gradle:

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

Dodaj defaultLogLevel w Run.java:

public static Level defaultLevel = Level.INFO; 

Get wartość logLevel własności:

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

oraz ustawić określony poziom w rejestratorze:

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

2.1) Utwórz nowy ConsoleHandler i wyłączanie druk z obsługą dominujących

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) Znajdź nadrzędnego ConsoleHandler i ustawić zdefiniowany poziom

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)); 

Z tym, gradle run generuje komunikaty powyżej domyślnego poziomu (INFO). Za pomocą tego ustawienia można kontrolować, które komunikaty są wyświetlane.

+0

Jeśli używasz SLF4J z funkcją logback, pamiętaj, że interfejs 'org.slf4j.Logger' nie ma metody" setLevel ". Ale 'ch.qos.logback.classic.Logger' implementuje ten interfejs i ma tę metodę. Aby utworzyć 'Logger', musisz zaimportować tę drugą klasę, a następnie rzutować następująco:' Logger LOGGER = (Logger) LoggerFactory.getLogger (MyClass.class) ' –

Powiązane problemy