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