Java Logger ввод() и выход () методы

Я только начал использовать Java Logger. Я пытался использовать его entering() и exiting() методы с жестко закодированные строки для имени класса и метода. Они оба не работали на меня. Просто нет записи в журнале для них. Но другие операторы log внутри этих методов были зарегистрированы правильно. Мой уровень регистратора установлен в CONFIG. Я попытался установить ALL но все равно не видите запись из них.

я нашел для каждой записи, там уже есть строка с именем класса и метода отяжелевший. Кажется, эти два метода не стоит. Но я все еще хочу знать, как заставить их работать на меня.

EDIT:

мой код следовал: эти ввод() и выход() не создают запись в файле журнала

//class variables
private final static Logger logger = Logger.getLogger(MyClass.class.getName());
private static FileHandler logFileHandler = null;

//within the main() method
Logger thisLogger = Logger.getLogger("");
logFileHandler =  new FileHandler(logFileNameStr, false);
logFileHandler.setFormatter(new SimpleFormatter());
thisLogger.addHandler(logFileHandler);
thisLogger.setLevel(Level.CONFIG);
logger.log(Level.INFO, "Logfile Directory = " + logFileNameStr);


//within a constructor of MyClass
logger.entering("MyClass", "MyClass()");
....
logger.info(initMsg);
....
logger.exiting(this.getClass().getSimpleName(), "MyClass()");

2 ответов


вход, выход и бросание регистрируются на уровне тоньше. Вам нужно будет установить регистратор на тоньше или ниже и установить FileHandler на тоньше или ниже.

thisLogger.addHandler(logFileHandler);
thisLogger.setLevel(Level.FINER);
logFileHandler.setLevel(Level.ALL);

что касается стиля, вы должны попробовать создать статический финал для имени класса, потому что вы будете использовать его как имя файла и ссылка на него для задание, выход, бросать и log precise трассировка:

private static final String CLASS_NAME = MyClass.class.getName();

вы всегда хотите использовать литерал класса для извлечения имени (как указано выше), потому что getClass().getName() может возвращать имя подкласса, которое может фальсифицировать вашу трассировку.

для имен методов не включают () в имени просто используйте метод ввода/вывода, который соответствует количеству аргументов.

для имен методов конструктора используйте "<init>" и для статических блоков инициализации использовать "<clinit>" как имя метода, так это то, что будет отображаться в трассировка стека.


как сказал @jmehrens, эти методы "удобства" регистрируются на более тонком уровне, и ваши объекты регистратора и обработчика, вероятно, настроены на гораздо более высоком уровне по умолчанию.

вот более удобный ввод и выход замены для использования в рамках зарегистрированного метода, и который вы можете просто изменить уровень на:

logger.finer("ENTRY"); // compare to .entering(MyClass.class.getName(),"MyMethodName")
...
logger.finer("RETURN"); // less typing than .exiting(CLASS_NAME,"MyMethodName")

тот же вывод, что и ввод и выход, пока вы предоставляете реальное имя класса и метода. Достаточно просто изменить .тоньше .информация.

для обработки параметризованных версий .log:

logger.log(Level.FINER,"ENTRY {0}", param1);
...
logger.log(Level.FINER,"RETURN {0}", result);

Я думаю, что единственное место входа / выхода имеет смысл, когда вы входите со стороны вызывающего абонента:

logger.entering(thing.getClass().getName(),"DoStuff");
thing.DoStuff();
logger.exiting(thing.getClass().getName(),"DoStuff");

вы можете сделать то же самое с logp контролировать, на каком уровне он регистрируется, но это более подробно:

logger.logp(Level.FINER,thing.getClass().getName(),"DoStuff","ENTRY");
thing.DoStuff();
logger.logp(Level.FINER,thing.getClass().getName(),"DoStuff","RETURN");