2017-01-11 2 views
2

Я пытаюсь добавить регистратор в одну из моих программ, в основном для замены System.out.println(), и это, похоже, дает мне некоторые проблемы. Это мой первый раз, когда я использую регистратор, поэтому я на нем.SLF4J: SimpleLogger не регистрирует трассировку и отладки, а также не регистрирует исключения

Я просмотрел множество ссылок за последние дни, но до сих пор не удалось заставить мой регистратор поймать исключение; вот некоторые ссылки я смотрел на (некоторые из них 5 лет и нужно, возможно, обновления):

Я использую:

  • SLF4J-апи-1.7.22.jar
  • SLF4J-простой 1.7.22.jar
  • jdk1.8.0_71
  • IntelliJ 2016,3. 2

simpleLogger.properties размещается непосредственно в пакете resources, этот файл загружается перед регистрацией ger создается, файл загружается правильно, так как я могу изменить дату-время, поскольку мне это нужно (и другие настройки также работают).

Часть Main класса:

... 
private Logger LOG; //field 
... 

public static void main(String[] args) { 
    launch(args); 
} 

... 

@Override 
public void start(Stage primaryStage) { 
    /*Create logger*/ 
    createLogger(); 
    LOG.info("Stage start."); 
    ... 
} 

... 

private void createLogger() { 
    try { 
     Properties properties = new Properties(); 
     properties.load(LOGGER_PROPERTIES); //path to prop file 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    LOG = LoggerFactory.getLogger(Main.class); 
    LOG.info("Logger initialised."); 

    LOG.trace("test trace"); //not working 
    LOG.debug("test debug"); //not working 
    LOG.info("test info"); 
    LOG.warn("test warning"); 
    LOG.error("test error"); 
} 

simpleLogger.properties Файл:

org.slf4j.simpleLogger.logFile=System.out 
# org.slf4j.simpleLogger.defaultLogLevel= 
# org.slf4j.simpleLogger.log.a.b.c= 
org.slf4j.simpleLogger.showDateTime=true 
org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss:SSS 
org.slf4j.simpleLogger.showThreadName=false 
org.slf4j.simpleLogger.showLogName=false 
org.slf4j.simpleLogger.showShortLogName=true 
org.slf4j.simpleLogger.levelInBrackets=true 
# org.slf4j.simpleLogger.warnLevelString= 

# THE FORMAT TRIED 
#org.slf4j.simpleLogger.SimpleFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n 
#java.util.logging.SimpleFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n 
#java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n" 
#org.slf4j.simpleLogger.format=[%1$tc] %4$s: %2$s - %5$s %6$s%n %7$s 
#org.slf4j.helpers.MessageFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n %7$s 
#java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n" 

Часть класса, где я пытаюсь создать исключение:

LOG.info("Creating window - More info: loading.. .fxml"); 
try { 
    BP_INFO = FXMLLoader.load(getClass().getResource("/fxml/ImageInf_.fxml")); //HERE change back to ImageInfo.fxml 
    LOG.info("Creating window - More info: loaded .fxml successfully."); 
} catch (IOException e) { 
    // HERE not showing anything below 
    System.out.println("CATCH - From Sys out"); 
    LOG.error("CATCH - EXCEPTION", (Throwable) e); 
    LOG.error("Creating window - More info: Exception"); 
    LOG.error("Creating window - More info: Exception", e);   
    LOG.error("Creating window - More info: Exception {}", e); 
    LOG.error("Creating window - More info: Exception {} {} {}", Level.INFO, e.getMessage(), e); 
    // e.printStackTrace(); 
} 

выход консоли :

12:17:08:995 [INFO] Main - Logger initialised. 
12:17:08:996 [INFO] Main - test info 
12:17:08:997 [WARN] Main - test warning 
12:17:08:997 [ERROR] Main - test error 
12:17:08:997 [INFO] Main - Stage start. 
... 
12:17:27:140 [INFO] View - Creating window - More info: loading.. .fxml 
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
... 

Задача 1:

Как вы можете видеть trace и debug не работают. Я пробовал все свойства в опоре. файл и еще несколько, но пока не удалось поймать какое-либо исключение или применить конкретный формат.

Задача 2:

Как вы можете видеть, исключение также не регистрируется вообще.

Дополнительная информация: Я сбросил настройки IntelliJ, я очищал папку% temp% win раз в разы, я очищал тайники и перезапускал Intellij разное время; все это в попытке, если опора. файл не был правильно прочитан или хранился где-то в кеше.

Любая помощь очень ценится. Пожалуйста, ответьте упрощенным способом.

ответ

1

Проблема # 1 (уровень следа и отладки не регистрируется)

Из документа SimpleLogger:

org.slf4j.simpleLogger.defaultLogLevel - По умолчанию уровень журнала для всех экземпляров SimpleLogger. Должен быть один из («trace», «debug», «info», «warn», «error» или «off»). Если не указано, значение по умолчанию «info».

Поскольку уровень defult инфо и трассировки и отладки уровни «под» информацией, они будут отфильтрованы и регистратор не достигнет Appender.

Так что, если вы добавите следующую строку в файле свойств:

org.slf4j.simpleLogger.defaultLogLevel = trace 

вы должны увидеть также сообщения с дорожкой и уровнем отладки.

Проблема № 2 (след ошибка не регистрируется должным образом)

Вы ловли IOException с, но InvocationTargetException фактически выброшены (который один не поймают), поэтому исполнение никогда не будет вводить свой улов блок. То, что вы видите на консоли, является необработанным исключением.

+0

Я пробовал это, и вы правы, эта часть решения проблемы, я не знал об этом. –

+0

Обновлен ответ о вашей проблеме с исключением. – DVarga

+0

Ум .. Мне не известно об 'InvocationTargetException', я вижу, что проблема здесь совсем другая; как я могу поймать это исключение? –

3

Мы можем использовать SLF4J в рамках проекта JavaFX с использованием только этих зависимостей:

  • SLF4J-апи-1.7.22.jar
  • SLF4J-простой 1.7.22.jar

Вот пример Application класс:

... 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class Todo extends Application { 

    private static final Logger log = LoggerFactory.getLogger(Todo.class); 

    ... 

    public static void main(String[] args) { 

     log.info("launching..."); 
     log.warn("launching..."); 
     log.error("launching..."); 
     log.debug("launching..."); 
     log.trace("launching..."); 

     launch(args); 
    } 
} 

SLF4J просто уже га которые могут быть хорошими для разных сценариев. Это не так, регистратор может быть настроен путем добавления simplelogger.properties к пути к классам, который будет автоматически выбран Slf4j при запуске приложения. javadoc для класса SimpleLogger прекрасно привлекает все свойства, которые могут быть настроены.

Содержимое simplelogger.properties файла, который изменяет уровень журнала только:

org.slf4j.simpleLogger.defaultLogLevel=trace 

А вот выход при работе с уровнем лог установлен в trace:

[main] INFO todo.Todo - launching... 
[main] WARN todo.Todo - launching... 
[main] ERROR todo.Todo - launching... 
[main] DEBUG todo.Todo - launching... 
[main] TRACE todo.Todo - launching... 
+0

Спасибо за усилие, с финалистом журнала, в этот момент вы загружаете файл 'simplelogger.properties'? –

+1

Это обычный файл свойств java. Всякий раз, когда он присутствует в classpath, slf4j автоматически загружает его, чтобы настроить себя при запуске приложения. Это описано в простых документах slf4j. – rbento

Смежные вопросы