public class log4jL { public static void main(String[] args) { //1 初始化 用于没有配置文件 BasicConfigurator.configure(); //2 生成logger对象 Logger logger = Logger.getLogger(log4jL.class); //3 日志信息输出 logger.info("test"); } }
初始化 读取配置文件
生成 Logger 对象
输出日志信息
接下来由这三个步骤开始讲述
2. 配置信息 2.1 配置文件类型
首先进入Logger类 找到getLogger()
public Logger getLogger(Class clazz) { return LogManager.getLogger(clazz.getName()); }
可以看到有一个LoggerManager的对象,点进这个loggerManager类中可以看到Log4j的配置信息以及加载管理方式。
static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties"; static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml"; static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration"; static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass"; public static final String DEFAULT_INIT_OVERRIDE_KEY = "log4j.defaultInitOverride";
可以看到 Log4j的配置文件支持上面几种
log4j.properties (过时
log4j.xml
log4j.configuration (过时
log4j.configuratorClass(过时
log4j.defaultInitOverride(过时
但是我还是用properties 比较方便
在这个类的108行可以看到这些配置文件都是由Loader.getResource的方式加载的,所以只需要将配置文件放在resource的文件夹中即可以被识别到。
2.2 配置文件内容// If we have a non-null url, then delegate the rest of the // configuration to the OptionConverter.selectAndConfigure // method. if(url != null) { LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); try { OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository()); } catch (NoClassDefFoundError e) { LogLog.warn("Error during default initialization", e); } } else { LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); }
还是在LogManager类的下方可以看到如果在类加载过程中找到配置文件,则执行OptionConverter.selectAndConfigure()这个函数,进入这个函数
static public void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) { Configurator configurator = null; String filename = url.getFile(); if(clazz == null && filename != null && filename.endsWith(".xml")) { clazz = "org.apache.log4j.xml.DOMConfigurator"; } if(clazz != null) { LogLog.debug("Preferred configurator class: " + clazz); configurator = (Configurator) instantiateByClassName(clazz, Configurator.class, null); if(configurator == null) { LogLog.error("Could not instantiate configurator ["+clazz+"]."); return; } } else { configurator = new PropertyConfigurator(); } configurator.doConfigure(url, hierarchy); } }
在这个函数中,可以看到程序执行的步骤是 识别配置文件的类型 新建一个configurator对象 执行
configurator.doConfigure(url, hierarchy);方法,所以进入这个方法就可以看到配置信息的写法了。由于这个方法是一个抽象的方法,我们需要查看PropertyConfigurator类的具体实现。
进入这个类之后,如果是下载代码源的话,就可以看到非常详细的注释 包括每个参数的作用 配置的方法 还有样例提供,基本上通过阅读这个源码注释就可以完成对配置文件的学习。
2.2.1 RootLogger
定义每个appender的跟输出级别,这里就需要先登记一下日志的输出级别,从上到下递减
fatal 严重错误 影响系统运行
error 错误信息 不影响系统运行
warn 警告信息 可能会发生问题
info 运行信息 数据连接等信息
debug 调试信息 开发中使用
trace 追踪信息 记录查询程序运行
在rootLogger配置中可以配置每一个appender对应的最低日志输出级别 比如在console中输出bebug以上,在文件中输出error以上的日志级别
# 表示在console输出tarce级别以上的日志信息 # 格式为 级别,名称 # 例子 log4j.rootLogger=trace,console
2.2.1.1 自定义logger
设定根logger是遵照所有logger对象的默认配置 自定义logger可以配置某一个logger的个性设置
protected String encoding; protected QuietWriter qw;
2.2.2.2 FileAppender
FileAppender 可以设置的变量为下图。
protected String fileName = null; protected boolean bufferedIO = false; protected int bufferSize = 8*1024;
以下是例子
log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%15.15t] %-5p %l %x - %m%n # 设置文件的路径 这个文件会在你该程序的根目录下作为基路径 算是一种绝对路径的格式 log4j.appender.file.file=/Doc/logs/log4j.log log4j.appender.file.encoding=UTF-8
同时 FileAppender还发展出了RollingFileAppender、DailyRollingFileAppender 日常使用的话一般使用这两个,这样可以将日志文件分批管理。
RollingFileAppender有两个参数设置的文件的大小和备份数量,同样也可以在配置文件中配置。
protected long maxFileSize = 10*1024*1024; protected int maxBackupIndex = 1; public void setMaxFileSize(String value) { maxFileSize = OptionConverter.toFileSize(value, maxFileSize + 1); }
在设置文件大小的时候有着这样一个函数,可以自动帮我们把文件大小转化为系统可以识别的大小,比如你写10MB,它可以自动转化为10 * 1024 * 1024,方便用户 *** 作,具体的转换类型就是在toFileSize这文件里面。
2.2.3 Appender.Layout
配置完Appender之后,还需要配置对应的输出格式
EnhancedPatternLayout
HTMLLayout
PatternLayout
SimpleLayout
TTCCLayout
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
2.2.3.1 PatternLayout
在PropertyConfigrator类中 在介绍这个PatternLayout的时候,提供了一个ConversionPattern参数,表示我们可以通过配置信息,自己配置pattern的格式
public final static String DEFAULT_CONVERSION_PATTERN ="%m%n";
PatternLayout 默认的格式 记录
其中 该类提供了一个方法给我们设置 Pattern的格式
public void setConversionPattern(String conversionPattern) { pattern = conversionPattern; head = createPatternParser(conversionPattern).parse(); }
于是,要想设置自己的Pattern 格式,也只需要在配置文件里面配置,以下是源码给的样例。
在PatternLayout源码上方也提供了很多格式可供参考,既提供了各个参数的含义,也提供了几个常用格式。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %c{2} %M.%L %x - %mn2.3 内置日志记录
找到这个功能的原因是在阅读LogManager源码的时候发现,在LogManager找到的识别url之后要输出的识别记录 ,但是实际运行过程中并没有看到这些信息的输出,于是进入LogLog类查看原因,发现了这个内置日志记录的功能。
LogManager 使用到LogLog的代码
// If we have a non-null url, then delegate the rest of the // configuration to the OptionConverter.selectAndConfigure // method. if(url != null) { LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); try { OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository()); } catch (NoClassDefFoundError e) { LogLog.warn("Error during default initialization", e); } } else { LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); } } else { LogLog.debug("Default initialization of overridden by " + DEFAULT_INIT_OVERRIDE_KEY + "property."); }
发现LogLog类是用于记录Log状态的代码
LogManager使用的段落为
public static void debug(String msg) { if(debugEnabled && !quietMode) { System.out.println(PREFIX+msg); } }
默认情况下的这两个参数都为false
protected static boolean debugEnabled = false; private static boolean quietMode = false
只需要将debugEnabled设置为true即可.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)