Java Logger进入()和退出()方法

时间:2014-04-16 15:38:06

标签: java logging

我刚开始使用 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()");

2 个答案:

答案 0 :(得分:8)

在FINER级别记录输入,退出和投掷。您必须将记录器设置为FINER或更低,并将FileHandler设置为FINER或更低。

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

就样式而言,您应该尝试为类名创建静态final,因为您将其用作name of the logger并引用enteringexitingthrowinglog 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");