Log4j 打印扩展 Class 名称
Log4j Print Extended Class Name
如何记录扩展名class?我想写 "FTSControl" 而不是 "Control".
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
我也指出了一点,
虽然使用了相同的记录器实例,但在 Control 和 FTSControl 的方法中调用 log.info() 会打印其自己的 class 名称。我是说
logger.info() 在 FTSControl 的方法中打印
09.01.2015 15:58:00.006 WARN - FTSControl : No files found! Hash:-844390824
logger.info() 在 Control 的方法中打印
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
只需将摘要class中的Logger logger = Logger.getLogger(getClass());
替换为
protected final Logger logger = Logger.getLogger(this.getClass());
如果您在 FTSControl
中使用类似 logger.info("test")
的内容,那么您将在日志中获得实例化的 class 名称
我已将我的 ConversionPattern 更改如下。从 C ->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 用于输出发出日志请求的调用者的完全限定 class 名称。例如,对于 class 名称 "org.apache.xyz.SomeClass",模式 %C{1} 将输出 "SomeClass".
我建议在每个 class 中为 Logger 设置一个 'private static final' 实例,并将其与 'C' 一起使用。这样,记录器也可用于静态方法,并且可以更自信地识别 class 记录的内容。
public class FTSControl extends Control {
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FTSControl.class);
}
更改模式以打印类别而不是调用 class 是一个 'global' 更改,可能会导致意外。
如何记录扩展名class?我想写 "FTSControl" 而不是 "Control".
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
我也指出了一点,
虽然使用了相同的记录器实例,但在 Control 和 FTSControl 的方法中调用 log.info() 会打印其自己的 class 名称。我是说
logger.info() 在 FTSControl 的方法中打印
09.01.2015 15:58:00.006 WARN - FTSControl : No files found! Hash:-844390824
logger.info() 在 Control 的方法中打印
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
只需将摘要class中的Logger logger = Logger.getLogger(getClass());
替换为
protected final Logger logger = Logger.getLogger(this.getClass());
如果您在 FTSControl
logger.info("test")
的内容,那么您将在日志中获得实例化的 class 名称
我已将我的 ConversionPattern 更改如下。从 C ->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 用于输出发出日志请求的调用者的完全限定 class 名称。例如,对于 class 名称 "org.apache.xyz.SomeClass",模式 %C{1} 将输出 "SomeClass".
我建议在每个 class 中为 Logger 设置一个 'private static final' 实例,并将其与 'C' 一起使用。这样,记录器也可用于静态方法,并且可以更自信地识别 class 记录的内容。
public class FTSControl extends Control {
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FTSControl.class);
}
更改模式以打印类别而不是调用 class 是一个 'global' 更改,可能会导致意外。