Java日志-Log4J2
2015年11月9日
1 目标:日志信息指定输出格式、位置,并可在运行时控制开关,可能输出滚动文件。
2 原理:通过XML读取配置文件。根据配置生成不同的对象,每个对象都有不同的输出方式和输出格式。
3 流程:安装库,配置日志,输出日志。
3.1 安装库:下载log4j2,解压后将log4j-api-2.4.1.jar和log4j-core-2.4.1.jar复制到工程目录并添加到classpath。
3.2 配置日志:忽略。
默认可以获取root日志对象,只能输出error级别日志输出到控制台。
3.3 输出日志:使用LoggerMagager获取默认日志对象。
packagelee;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
publicclass Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Logger logger =LogManager.getLogger();
logger.error("this iserror.");
}
}
4 方法:配置、使用。
目标:配置输出方式,输出格式,内容等。
原理:配置输出方式及格式占位符。
方法:
log4j2是对log4j的升级(log4j1.x于2012停止更新),多线程下性能提高是1.x的10倍,单线程也有轻微提高。
参考:http://blog.csdn.net/lrenjun/article/details/8178875
http://blog.csdn.net/memray/article/details/17488433
4.1 文件加载:指定位置,指定文件名
默认的加载顺序为:
classpath下名为log4j-test.json 或者log4j-test.jsn文件
classpath下名为 log4j2-test.xml
classpath下名为log4j.json 或者log4j.jsn文件
classpath下名为 log4j2.xml
4.2 组织方式:Configuration-》Appenders、Loggers
4.2.1根节点Configuration。
4.2.2输出目标节点Appenders:定义输出目标,可以定义多个输出目标。
控制台:Console。
文件:File。
循环文件:RollingFile。
4.2.3日志对象节点Loggers。
示例:
<?xmlversion="1.0" encoding="UTF-8"?>
<configuration>
<appenders></appenders>
<loggers></loggers>
</configuration>
4.3 日志格式:输出方式appenders
目标:控制输出的位置、文件格式等。
参考:http://logging.apache.org/log4j/2.x/manual/appenders.html
4.3.1输出目标:包含控制台Console,文件File,滚动文件RollingFile等。
4.3.1.1 控制台Console:属性name,target,layout。
名称name:用于logger指定。
目标target:指定输出的控制台流,SYSTEM_OUT或SYSTEM_ERR(默认)。
输出格式layout:可以指定patternlayout等。
<?xmlversion="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console"target="SYSTEM_OUT">
<PatternLayoutpattern="msg=%m~File=%F~Line=%L~Method=%M~Console~%d{yyyy MMM dd HH:mm:ss,SSS}%n"/>
</Console>
</Appenders>
<Loggers>
<root>
<appender-refref="console"></appender-ref>
</root>
</Loggers>
</Configuration>
4.3.1.2 卷动文件RollingFile:按大小自动生成一系统文件,并循环生成。
文件名:fileName;
文件名模式:占位符。
追加性:append。
大小控制:使用polices控制,可以按时间(TimeBasedTriggeringPolicy)或大小(SizeBasedTriggeringPolicy)分割。
数量控制策略:使用Strategy控制,可以指定最小,大数量min,max。
文件压缩:如果文件超过指定时间或大小,则进行压缩后存储,存储于filePattern中。数量受数据控制策略影响。
filePattern格式:$${ 格式:占位符},patternlayout格式和%i(表示第几个)。
示例:
<?xmlversion="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console"target="SYSTEM_OUT">
<PatternLayout
pattern="msg=%m~File=%F~Line=%L~Method=%M~Console~%d{yyyyMMM dd HH:mm:ss,SSS}%n" />
</Console>
<RollingFile name="rolling" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.}[%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicysize="20 KB" />
</Policies>
<DefaultRolloverStrategy max="4"/>
</RollingFile>
</Appenders>
<Loggers>
<root>
<appender-refref="rolling"></appender-ref>
</root>
</Loggers>
</Configuration>
4.3.1.3 按日滚动文件DaylyRollingFile:按大小自动生成一系统文件,并循环生成。
时间间隔:<TimeBasedTriggeringPolicy/>中设置interval,单位为天,默认为1。
示例:按天,按大小自动滚动
<?xmlversion="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console"target="SYSTEM_OUT">
<PatternLayout
pattern="msg=%m~File=%F~Line=%L~Method=%M~Console~%d{yyyyMMM dd HH:mm:ss,SSS}%n" />
</Console>
<RollingFile name="rolling"fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.}[%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicysize="20 KB" />
</Policies>
<DefaultRolloverStrategymax="4"/>
</RollingFile>
</Appenders>
<Loggers>
<root>
<appender-refref="rolling"></appender-ref>
</root>
</Loggers>
</Configuration>
4.3.1.4 异步输出:单独的线程输出日志。
使用AppenderRef引用其它的输出目标。
<Async name="asynclog">
<AppenderRefref="dailyrolling" />
</Async>
4.4 日志格式:日志对象loggers。默认为root(level=error)。
4.4.1目标:控制输出的日志字符串格式及指定输出方式。
4.4.2方法:
4.4.2.1 名称name:指定日志对象的名称,用于继承控制和程序获取对象。名称具有继承性,按照.进行分级。如:com.lee的子节点是com.lee.a。
4.4.2.2 输出级别level:过滤日志,只有高于或等于此级别的日志才能输出。all<trace<debug<info<warn<error(默认)<fatal<off。
4.4.2.3 叠加性additivity:如果为true,则沿继承树向父级传递;如果为false,则停止传播。
4.4.2.4 输出方式:Appender-ref指定输出输出方式的name。
示例:
<loggername="com.relin.HelloLog4j" level="error"additivity="false">
<appender-refref="Console"/>
</logger>
4.4.3输出格式:PatternLayout,输出日志信息的内容和格式配置。
原理:使用%占位符控制格式。
占位符:类C,方法M,级别level,logger名称(c),日期时间d,文件F,行号L,线程t,信息m,换行n。
日期时间:%d{yyyy MMM dd HH:mm:ss,SSS}输出2015 Nov 10 11:34:34,872
参考:https://logging.apache.org/log4j/2.x/manual/layouts.html
示例:
<File name="log"fileName="target/test.log" append="false">
<PatternLayoutpattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -%msg%xEx%n"/>
</File>
4.5 输出日志:使用程序输出日志
4.5.1日志管理对象:LogManager,管理日志对象组织和其它选项。
4.5.2日志对象:Logger,控制日志的输出等。
示例:
LoggermyLogger=LogManager.getLogger("com.test.loggerxx");
myLogger.info(“this is info log.”);
5 示例:按天、固定大小20MB,越过则自动压缩存储,最多10个压缩文件,异步多线程日志
//log4j2.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console"target="SYSTEM_OUT">
<PatternLayout
pattern="msg=%m~File=%F~Line=%L~Method=%M~Console~%d{yyyyMMM dd HH:mm:ss,SSS}%n" />
</Console>
<RollingFilename="dailyrolling" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>msg=%m~File=%F~Line=%L~Method=%M~Console~%d{yyyyMMM dd HH:mm:ss,SSS}%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicysize="20 MB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
<Async name="asynclog">
<AppenderRefref="dailyrolling" />
</Async>
</Appenders>
<Loggers>
<root>
<appender-refref="console"></appender-ref>
</root>
<logger name="lee.log"additivity="false" level="all">
<appender-refref="asynclog"></appender-ref>
</logger>
</Loggers>
</Configuration>
//Main.java
packagelee;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
publicclass Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Logger logger =LogManager.getLogger("lee.log");
logger.trace("this istrace.");
logger.debug("this isdebug.");
logger.info("this isinfo.");
logger.warn("this iswarn.");
logger.error("this iserror.");
logger.fatal("this isfatal.");
System.out.println("finished.");
}
}