基本上,当使用log4j时,我知道我们必须使用Logger.getLogger(MyClass.class)或Logger.getLogger(“MyClass”)来启动Logger。
我有太多的课程,我不想在每个课程中添加这个陈述。相反,我喜欢做的就是这个
Logger.info(this,"My message");
其中Logger是我编写的一个类(不是log4j中的那个),它反过来启动一个Logger类型的对象(org.apache.log4j.Logger)并继续传递消息。
这是我的Logger.java
package com.mypackage;
/**
* @author Sriram Sridharan
*Custom logging implementation using log4j
*/
public class Logger {
private static org.apache.log4j.Logger logger;
/**
* Writes an INFO log
* @param oClass
* @param message
*/
public static void INFO(Object oClass, String message){
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(oClass.getClass());
logger.info(message);
}
}
现在,我有自己的类,它调用此Logger实现来记录事件。看起来像这样
public class MyClass {
public void myMethod(){
com.mypackage.Logger.INFO(this, "Hello, World");
}
}
我没有日志问题。他们很好。但是,日志中显示的类名称是相同的(Logger)。这是输出
INFO [main] (Logger.java:18) - Hello, World
我期待这个
INFO [main] (MyClass.java:18) - Hello, World
我哪里错了?
答案 0 :(得分:9)
使用%c
模式输出类别/ getLogger("myCategory")
/而不是打印来电者类的%C
。
这个想法是你有通用的方法:
public static void debug(String category, String message) {
Logger logger = org.apache.log4j.Logger.getLogger(category);
logger.debug(message);
}
并且您的log4j配置包含您的模式:
%d{ISO8601} %c %m %n
这将打印
2014-02-21 14:38:120 YourCategory Your Message
因此,您不需要为每个具有日志的类实现Logger的实例化。
答案 1 :(得分:0)
您在logger.info(message);
内使用Logger class
,因此您将始终Logger.java
进入日志文件。
您可以在要记录的类中记录消息,将记录类名。
答案 2 :(得分:0)
在获取log4j记录器时不使用class参数,因此log4j假定您的记录器类。 尝试
public static void INFO(Object oClass, String message){
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(oClass.getClass());
logger.info(message);
}
代替。