2012-03-16 87 views
0

让我们用日志的默认代码开始两个类之间:阿帕奇常用的日志记录

实现:

A类:

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import com.cc.B; 

public class A { 

    public static Log logger = LogFactory.getLog(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.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class B { 
    public static Log log = LogFactory.getLog(B.class); 

     public void doIt() { 
     log.debug("Did it"); 
     } 
} 

执行:

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类

,取代public static Log log = LogFactory.getLog(B.class);public static Log log = LogFactory.getLog(A.class);具有日志应用程序的任何影响。

我该如何登录到A类记录器?

+1

发布您的log4j。属性,顺便说一句:你是什么意思只登录到类记录器?知道你的日志消息来自哪里是有道理的 - 你想达到什么目的? – quaylar 2012-03-16 08:55:22

+0

这是我想要的: '16 mars 2012 09:31:35 com.cc.A main 信息:输入应用程序。 16 mars 2012 09:31:35 ** com.cc.A ** doIt 信息:是否 16 mars 2012 09:31:35 com.cc.A main INFO:退出应用程序.' – kaissun 2012-03-16 09:00:40

+0

因为有也是一个方法名称,我认为com.cc.B是自动发现的,并且是调用记录器的方法的一部分地址。 'getLog'的类参数是AFAIK的便利和惯例,所以你可以很容易地通过包来控制日志级别。 (在包com.example.foo中记录DEBUG,但包com.example.bar中只包含INFO) – user1252434 2012-03-16 09:39:47

回答

0

第一:我同意quaylar,你确实想知道你的日志信息来自哪里,所以我会说这是任何代码审查的不好的做法。

第二:我认为你应该总是使用slf4j,这样你就可以将你使用的所有第三方库的所有日志框架连接到你的首选日志框架。

说了: 你可以实现你想实现,如果你使用log4j的东西,而不是如果您确保是b实例相同的记录为A.

一个简单的办法是只使用静态导入

import static com.cc.A.logger; 

,然后在乙使用它::A中所定义成B中的记录器的

public void doIt() { 
    logger.debug("Did it"); 
} 
+0

它是一样的,这段代码并没有解决问题:/ – kaissun 2012-03-16 13:29:12

+0

我刚刚意识到,静态导入不会编译,因此这不是您的问题的工作解决方案。 – cb2 2012-03-17 17:15:14

0

我得到这样的输出:

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. 
+0

感谢您的帮助,但我使用的Apache通用日志记录不是log4j,他们是不一样的 – kaissun 2012-03-22 15:17:47