Log4j笔记 第十章 Log4j日志现场的秘密
log4j日志现场背后的秘密
1、什么是日志现场
调用Logger打印日志的地方,称为日志现场。日志现场的属性有:类名、方法名、java文件名、和行数。
下面是一个例子。
LoggerTest.java
import org.apache.log4j.Logger;public class LoggerTest {private static final Logger logger = Logger.getLogger(LoggerTest.class);public static void main(String[] args) {new LoggerTest().test();}private void test() {// 下面一行就是日志现场 LoggerTest类,test方法,LoggerTest.java文件,第12行。logger.debug("Hello, log4j!");}}<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" ><appender name="SYSTEM_OUT" value="%l: %m%n"/></layout></appender><root><!-- root 引用SYSTEM_OUT appender--><appender-ref ref="SYSTEM_OUT"/></root></log4j:configuration>
LoggerTest.test(LoggerTest.java:12): Hello, log4j!
logger.debug(MessageFormat.format(“Hello, {0}!”, “log4j”));if(logger.isDebugEnabled()){logger.debug(MessageFormat.format(“Hello, {0}!”, “log4j”));}public class CLogger {public static void debug(Logger logger, String pattern, Object[] arguments) {if (logger.isDebugEnabled()) {logger.debug(MessageFormat.format(pattern, arguments));}}}import java.text.MessageFormat;import org.apache.log4j.Logger;public class DLogger {public static DLogger getLogger(Class<?> clazz) {return new DLogger(clazz);}private final Logger logger;private DLogger(Class<?> clazz) {logger = Logger.getLogger(clazz);}public void debug(String pattern, Object... arguments) {if (logger.isDebugEnabled()) {logger.debug(MessageFormat.format(pattern, arguments));}}}public class LoggerTestThree {private static final DLogger logger = DLogger.getLogger(LoggerTestThree.class);public static void main(String[] args) {LoggerTestThree loggerTestTwo = new LoggerTestThree();loggerTestTwo.test();}private void test() {logger.debug("Hello,{0}!", "log4j"); //我们想将日志现场定在这里。}}DLogger.debug(DLogger.java:19): Hello,log4j!
public class LoggerTestTwo {private static final MyLogger logger = new MyLogger();public static void main(String[] args) {LoggerTestTwo loggerTestTwo = new LoggerTestTwo();loggerTestTwo.test();}private void test() {logger.debug();}}public class MyLogger {public void debug() {Throwable throwable = new Throwable();StackTraceElement[] stackTraceElements = throwable.getStackTrace();for (StackTraceElement element : stackTraceElements) {System.out.println(element);}}}MyLogger.debug(MyLogger.java:3)LoggerTestTwo.test(LoggerTestTwo.java:10)LoggerTestTwo.main(LoggerTestTwo.java:6)
new LocationInfo(new Throwable(), fqnOfCategoryClass);