我刚开始使用 Java Logger 。我尝试将其entering()
和exiting()
方法与硬编码字符串一起用于类名和方法。他们都不适合我。他们没有日志条目。但是该方法中的其他日志语句已正确记录。我的记录器级别设置为CONFIG
。我试图设置为ALL
,但仍然看不到它们的日志条目。
我发现每个条目都有一行记录了类名和方法。看来这两种方法都没有必要。但我仍然想知道如何让它们为我工作。
修改
我的代码遵循:这些enter()和exiting()不会在日志文件中创建一个条目
//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()");
答案 0 :(得分:8)
在FINER级别记录输入,退出和投掷。您必须将记录器设置为FINER或更低,并将FileHandler设置为FINER或更低。
thisLogger.addHandler(logFileHandler);
thisLogger.setLevel(Level.FINER);
logFileHandler.setLevel(Level.ALL);
就样式而言,您应该尝试为类名创建静态final,因为您将其用作name of the logger并引用entering,exiting, throwing和log precise跟踪:
private static final String CLASS_NAME = MyClass.class.getName();
您总是希望使用类文字来获取名称(如上所述),因为getClass().getName()
可以返回可以伪造您的跟踪的子类名称。
对于方法名称,请勿在名称中包含()
,只需使用与参数数量匹配的输入/退出方法。
对于构造函数方法名称,使用"<init>"
,对于静态init块,使用"<clinit>"
作为方法名称,因为这将显示在堆栈跟踪中。
答案 1 :(得分:1)
正如@jmehrens所说,这些“便利”方法记录得更精细,而Logger和Handler对象可能默认配置得更高。
以下是更方便的输入和退出替换,以便在记录的方法中使用,您只需更改级别:
logger.finer("ENTRY"); // compare to .entering(MyClass.class.getName(),"MyMethodName")
...
logger.finer("RETURN"); // less typing than .exiting(CLASS_NAME,"MyMethodName")
只要您提供真实的类和方法名称,输入和退出的输出相同。很简单,可以将.finer更改为.info。
要处理参数化版本,请使用.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");