Java Apache通用日志
让我们从两个类之间日志记录的默认代码开始: 实施:Java Apache通用日志,java,apache-commons-logging,Java,Apache Commons Logging,让我们从两个类之间日志记录的默认代码开始: 实施: 16 mars 2012 09:31:35 com.cc.A main INFO: Entering application. 16 mars 2012 09:31:35 com.cc.B doIt INFO: Did it 16 mars 2012 09:31:35 com.cc.A main INFO: Exiting application. A类: B类: 执行: 16 mars 2012 09:31:35 com.cc.A main
16 mars 2012 09:31:35 com.cc.A main
INFO: Entering application.
16 mars 2012 09:31:35 com.cc.B doIt
INFO: Did it
16 mars 2012 09:31:35 com.cc.A main
INFO: Exiting application.
A类:
B类:
执行:
16 mars 2012 09:31:35 com.cc.A main
INFO: Entering application.
16 mars 2012 09:31:35 com.cc.B doIt
INFO: Did it
16 mars 2012 09:31:35 com.cc.A main
INFO: Exiting application.
在B类中,替换公共静态日志Log=LogFactory.getLog(B.class)
topublicstaticloglog=LogFactory.getLog(A.class)代码>对应用程序的日志没有影响
如何仅登录到A类记录器 首先:我同意quaylar的观点,您确实想知道日志消息的来源,所以我认为这在任何代码审查中都是不好的做法
第二:我认为您应该始终使用slf4j,以便能够将您使用的所有第三方库的所有日志框架连接到您首选的日志框架
尽管如此:
如果使用log4j而不是确保B实例化与A相同的记录器,则可以实现您想要实现的目标
一个更简单的解决方案是将A中定义的记录器静态导入到B中:
import static com.cc.A.logger;
然后在B中使用它:
public void doIt() {
logger.debug("Did it");
}
我得到这个输出:
2012-03-17 18:13:37,859 INFO main cc.A Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.A Did it
2012-03-17 18:13:37,861 INFO main cc.A Exiting application.
将此代码用于:
package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cc.B;
public class A {
static final Logger logger = LoggerFactory.getLogger(A.class);
public static void main(String[] args) {
logger.info("Entering application.");
B b = new B();
b.doIt();
logger.info("Exiting application.");
}
}
B的代码是:
package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class B {
private static final Logger logger = LoggerFactory.getLogger(A.class);
public void doIt() {
logger.debug("Did it");
}
}
log4j的配置如下:
log4j.rootCategory = DEBUG, A1
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d %-5p %t %c{2} %m%n
但我不禁想知道,您是否真的在每个日志行中都有标识应用程序的内容?在这种情况下,只需将应用程序名称添加到日志模式:
log4j.appender.A1.layout.ConversionPattern = %d %-5p %t %c{2} MyApplicationName %m%n
如果随后将B改回初始记录器,如下所示:
private static final Logger logger = LoggerFactory.getLogger(B.class);
您将获得以下输出:
2012-03-17 18:13:37,859 INFO main cc.A MyApplicationName Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.B MyApplicationName Did it
2012-03-17 18:13:37,861 INFO main cc.A MyApplicationName Exiting application.
发布你的log4j.properties,顺便说一句:你说只登录到A类记录器是什么意思?了解日志消息的来源是有意义的-您想要实现什么?这是我想要的:16 mars 2012 09:31:35 com.cc。主要信息:进入应用程序。16 mars 2012 09:31:35**com.cc.A**doIt INFO:doIt 16 mars 2012 09:31:35 com.cc.A主要信息:退出应用程序。
由于还有一个方法名,我认为com.cc.B是自动发现的,并且是调用记录器的方法地址的一部分。getLog
的类参数非常方便和常规,因此您可以通过包轻松控制日志记录级别。(在包com.example.foo中记录调试,但仅在包com.example.bar中记录信息)@quaylar我没有使用log4j我使用了公共日志我刚刚意识到静态导入不会编译,因此这不是解决问题的有效方法。感谢您的帮助,但我使用的是Apache公共日志,而不是log4j,它们不一样
2012-03-17 18:13:37,859 INFO main cc.A MyApplicationName Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.B MyApplicationName Did it
2012-03-17 18:13:37,861 INFO main cc.A MyApplicationName Exiting application.