Log4j打印扩展类名

时间:2015-01-09 14:06:53

标签: java spring log4j

如何记录扩展类的名称?我想" FTSControl"写而不是"控制"。

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

我也指出了一些,

虽然使用了相同的logger实例,但Control和FTSControl方法中的log.info()调用会打印自己的类名。我的意思是

FTSControl 方法中的

logger.info()打印

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

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

3 个答案:

答案 0 :(得分:2)

使用

替换抽象类中的Logger logger = Logger.getLogger(getClass());
protected final Logger logger = Logger.getLogger(this.getClass());

如果您在logger.info("test")内使用FTSControl之类的内容,那么您将在日志中获取实例类名称

答案 1 :(得分:0)

我已将ConversionPattern更改为以下内容。来自C - &gt; c

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

转换字符含义

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

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

答案 2 :(得分: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);
}

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