2015-01-09 106 views
0

我如何记录扩展类的名称?我想要写“FTSControl”而不是“Control”。Log4j打印扩展类名

public abstract class Control { 
    Logger logger = Logger.getLogger(getClass()); 
} 

@Component 
public class FTSControl extends Control { 

} 

<layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5p - %C{1}:%m%n" /> 
</layout> 

输出:

09.01.2015 15:58:00.006 WARN - Control: No files found! Hash:-844390824 

我还指出sometinh是,

尽管使用相同的记录器实例,log.info()调用在控制和FTSControl的方法打印自己的班级名称。我的意思是在FTSControl打印

09.01.2015 15:58:00.006 WARN - FTSControl : No files found! Hash:-844390824 

logger.info()的方法

logger.info()在控制的方法打印

09.01.2015 15:58:00.006 WARN - Control: No files found! Hash:-844390824 

//更新完成示例

package com.log; 

import org.apache.log4j.Logger; 
import org.apache.log4j.xml.DOMConfigurator; 

import com.log.abstracttest.ControlAbs; 
import com.log.abstracttest.ImosControl; 


public class LogMainTest { 

    private Logger logger = Logger.getLogger("console"); 

    public LogMainTest(){ 
     DOMConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.xml")); 
     logger.info("Initializing..."); 

     ImosControl control = new ImosControl(); 
     control.print(); 
     control.printAll(); 

    } 

    public static void main(String[] args) { 
     new LogMainTest(); 

    } 


} 


package com.log.abstracttest; 

import org.apache.log4j.Logger; 

public abstract class ControlAbs { 
    Logger logger = Logger.getLogger(this.getClass()); 

    public void print(){ 
     logger.info(" print"); 
    } 

} 


package com.log.abstracttest; 

public class ImosControl extends ControlAbs { 

    public void printAll(){ 
     logger.info("printAll"); 
    } 

} 

输出:

10.01.2015 05:38:43.497 INFO - LogMainTest:Initializing... 
10.01.2015 05:38:43.502 INFO - ControlAbs: print 
10.01.2015 05:38:43.503 INFO - ImosControl:printAll 

回答

0

我改变了我的ConversionPattern,如下所示。选自C - >Ç

<param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5p - [%c{1}]:%m%n" /> 

转换字符含义

Ç用于输出记录事件的类别。例如,对于类别名称“a.b.c”,模式%c {2}将输出“b.c”。

C用于输出发出日志记录请求的调用方的全限定类名。例如,对于类名“org.apache.xyz.SomeClass”,模式%C {1}将输出“SomeClass”。

2

只是

protected final Logger logger = Logger.getLogger(this.getClass()); 

这样,你会在日志中获得实例化的类名,如果您使用更换Logger logger = Logger.getLogger(getClass());在抽象类像logger.info("test")里面FTSControl

+0

我改变了它,因为你说过,BT不起作用 –

+0

检查编辑的答案 –

+0

我已经更新了这个问题,请看问题的结尾。 –

0

我反而会建议在每个类中为Logger设置一个'private static final'实例,并将其与'C'一起使用。这样记录器可以用于静态方法,并且记录的类可以更加自信地识别。

public class FTSControl extends Control { 
    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FTSControl.class); 
} 

更改模式以打印类别而不是调用类是“全局”更改,可能会导致意外。

+0

在这种情况下,父类(Control)中的方法使用自己的记录器实例并导致将Control作为Class名称而不是FTControl进行打印。请参阅下面的答案。它更灵活,适合OOD。 –

+0

我的注意力集中在涉及静态方法的情况下,与日志记录模式中的类别结合使用,在这种情况下,从类中调用类会更简单。但我想这种情况可能永远不会发生。 (例如:具有相同静态方法的基类和子类)。 –