log4j2 项目日志组件的实例代码
在项目运行过程中,常常需要进行功能调试以及用户行为的跟踪和记录,部分人习惯使用System.out,但这并不建议,它仅仅是使用方便但不便于维护也无扩展性。相比log4j的话,log4j可以控制日志信息的输送目的地、输出格式以及级别等等,使我们能够更加细致地控制日志的生成过程。
Log4j2是对Log4j1的升级,在性能和功能上有显著的改进,包括多线程中吞吐量的增强、占位符的支持、配置文件自动重新加载等
一、入门介绍
1、下载jar包
pox.xml
org.apache.logging.log4j log4j-api 2.10.0 org.apache.logging.log4j log4j-core 2.10.0
2、配置文件
Log4j包含四个配置工厂实现:JSON、YAML、properties、XML,本文介绍常用的方式XML。
Log4j具有在初始化期间自动配置自身的能力。当Log4j启动时,它将定位类路径下所有符合名称的文件,优先级顺序:log4j2-test.properties>log4j2-test.xml>log4j2.properties>log4j2.xml
3、一个简单的实例
xml配置:
java代码:
privatestaticfinalLoggerlogger=LogManager.getLogger(MyApp.class); @Test publicvoidtestLog4j(){ logger.info("helloworld!"); } }
控制台信息
22:17:47.146[main]INFOMyApp-helloworld!
二、模块介绍
属性
描述
monitorInterval
如果文件被修改了,指定时间后会重新加载配置。单位秒,最小值是5
packages
以逗号隔开的包名列表,用于搜索插件,比如自定义filter、appender等。插件仅会加载一次,所以要想修改后生效必须重启项目
status
内部日志级别,设置值为debug可以在控制台上清晰地看到整个日志事件流程,所使用的Logger是org.apache.logging.log4j.core.LOGGER
strict
允许使用严格的XML格式。不支持JSON配置
verbose
在加载插件时启用诊断信息
Log4j允许将日志请求打印到多个目的地。在log4j语言中,输出目的地称为Appender。目前,appender存在于控制台、文件、远程套接字服务器、ApacheFlume、JMS、远程UNIXSyslog守护进程和各种数据库api中。以下介绍几种比较常用的appender,如需了解更多可以到官网上进行查阅。
1、ConsoleAppender
输出到控制台,
参数名称 类型 描述 filter Filter 过滤器 layout Layout 日志输出格式 follow boolean direct boolean name String Appender的名称 ignoreExceptions boolean 默认true,忽略写入异常 target String SYSTEM_OUT或SYSTEM_ERR,默认是SYSTEM_OUT
2、FileAppender
输出到文件,
参数 类型 描述 append boolean 默认是true,新记录将追加到文件尾部 bufferedIO boolean 默认是true,使用缓冲区可以显著地提高性能 bufferSize int 当bufferedIO是true时,这个属性缓冲区大小,默认是8192字节。 createOnDemand boolean appender按需创建文件。只有当一个日志事件通过所有过滤器并被路由到这个appender时,appender才会创建这个文件。默认值为假 filter Filter 一个过滤器来确定事件是否应该由这个Appender处理。使用复合过滤器可以使用多个筛选器 fileName String 要写入的文件的名称。如果文件或它的任何父目录不存在,它们将被创建 immediateFlush boolean 默认true,每次写入后都将有一个刷新。这将保证缓冲区的数据被写入磁盘,但可能会影响性能。 layout Layout 日志格式 locking boolean 文件锁,默认false name String Appender的名称 ignoreExceptions boolean 默认true,忽略写入异常 filePermissions String 定义文件权限 例:rw-------orrw-rw-rw-etc... fileOwner String 定义文件所有者 fileGroup String 定义文件组
3、JDBCAppender
JDBCAppender使用标准JDBC将日志事件写入到关系数据库表中。它可以配置为使用JNDI数据源或自定义工厂方法获得JDBC连接。无论采用哪种方法,都必须由连接池来支持。
否则,日志记录性能将受到极大的影响。
如果已配置的JDBC驱动程序支持批处理语句,并且将缓冲区大小配置为一个正数,那么日志事件将被批处理。
(1)
参数 类型 描述 name String 必须,appender的名称 ignoreExceptions boolean 默认true,忽略日志事件异常 filter Filter 过滤器 bufferSize int 如果一个大于0的整数,这将导致appender缓冲日志事件,并在缓冲区达到该大小时刷新写入数据 connectionSource ConnectionSource 必须,可被检索到的数据库连接 tableName String 必须,插入日志事件的数据表名 columnConfigs ColumnConfig[] 必须,需要插入到数据库的字段,由多个 columnMappings ColumnMapping[] 必须,字段映射配置
(2)使用
参数
类型
描述
jndiName
String
必需的,
(3)使用
必须,表字段名称 使用PatternLayout模式插入值,注:同一个Column元素中,patter、literal、isEventTimestamp3个属性只能存在一个 该值将直接包含在SQL语句中执行,比如:rand()函数将生成随机数,类似myibats中的${} 是否时间格式java.sql.Types.TIMESTAMP 除非指定pattern,否则该属性将被忽略。如果是true,该值将插入Unicode。否则,该值将被插入非Unicode。 除非指定pattern,否则该属性将被忽略。如果是true,该值将插入CLOB,否则将插入varchar、nvarchar参数
类型
描述
name
String
pattern
String
literal
String
isEventTimestamp
boolean
isUnicode
boolean
isClob
boolean
实例:
(1)日期,%d/%date
Pattern 示例 %d{DEFAULT} 2012-11-0214:34:02,781 %d{ISO8601} 2012-11-02T14:34:02,781 %d{ISO8601_BASIC} 20121102T143402,781 %d{ABSOLUTE} 14:34:02,781 %d{DATE} 02Nov201214:34:02,781 %d{COMPACT} 20121102143402781 %d{HH:mm:ss,SSS} 14:34:02,781 %d{ddMMMyyyyHH:mm:ss,SSS} 02Nov201214:34:02,781 %d{HH:mm:ss}{GMT+0} 18:34:02 %d{UNIX} 1351866842 %d{UNIX_MILLIS} 1351866842781
当然你也可以自定义格式,比如%d{yyyy-MM-ddHH:mm:ss}
(2)记录器,%c/%logger
ConversionPattern LoggerName 结果 %c{1} org.apache.commons.Foo Foo %c{2} org.apache.commons.Foo commons.Foo %c{10} org.apache.commons.Foo org.apache.commons.Foo %c{-1} org.apache.commons.Foo apache.commons.Foo %c{-2} org.apache.commons.Foo commons.Foo %c{-10} org.apache.commons.Foo org.apache.commons.Foo %c{1.} org.apache.commons.Foo o.a.c.Foo %c{1.1.~.~} org.apache.commons.test.Foo o.a.~.~.Foo %c{.} org.apache.commons.test.Foo ....Foo
{?}-?是正整数时表示从右边开始取n个部分,负整数表示从左边开始移除n个部分,那为什么%c{-10}是完整的名称我也不清楚,欢迎留言
(3)日志信息,%m/%msg/%message
(4)日志级别,%level
log4j2自带多种filter供直接使用,也可以由我们自己来定义filter:
MyFilter.java
importorg.apache.logging.log4j.Level; importorg.apache.logging.log4j.Marker; importorg.apache.logging.log4j.ThreadContext; importorg.apache.logging.log4j.core.LogEvent; importorg.apache.logging.log4j.core.Logger; importorg.apache.logging.log4j.core.config.plugins.Plugin; importorg.apache.logging.log4j.core.config.plugins.PluginAttribute; importorg.apache.logging.log4j.core.config.plugins.PluginFactory; importorg.apache.logging.log4j.core.filter.AbstractFilter; importorg.apache.logging.log4j.message.Message; @Plugin(name="MyFilter",category="Core",elementType="filter",printObject=true) publicfinalclassMyFilterextendsAbstractFilter{ privatefinalLevellevel; privateMyFilter(Levellevel,ResultonMatch,ResultonMismatch){ super(onMatch,onMismatch); this.level=level; } publicResultfilter(Loggerlogger,Levellevel,Markermarker,Stringmsg,Object[]params){ returnfilter(level); } publicResultfilter(Loggerlogger,Levellevel,Markermarker,Objectmsg,Throwablet){ returnfilter(level); } publicResultfilter(Loggerlogger,Levellevel,Markermarker,Messagemsg,Throwablet){ returnfilter(level); } @Override publicResultfilter(LogEventevent){ returnfilter(event.getLevel()); } privateResultfilter(Levellevel){ /* *业务逻辑 **/ returnlevel.isMoreSpecificThan(this.level)?onMatch:onMismatch; } @Override publicStringtoString(){ returnlevel.toString(); } @PluginFactory publicstaticMyFiltercreateFilter(@PluginAttribute(value="level",defaultString="ERROR")Levellevel, @PluginAttribute(value="onMatch",defaultString="NEUTRAL")ResultonMatch, @PluginAttribute(value="onMismatch",defaultString="DENY")ResultonMismatch){ returnnewMyFilter(level,onMatch,onMismatch); } }
log4j2.xml
补充:
在实际应用中,有时需要对用户的访问信息进行记录,比如请求参数、用户id等等。在log4j1中我们会使用MDC和NDC来存储应用程序的上下文信息,而log4j2使用ThreadContext来实现MDC和NDC两者的功能。
(1)NDC采用类似栈的机制来存储上下文信息,线程独立。
在PatternLayout中使用%x来输出,注意x是小写。
实例:
Test.java
ThreadContext.push("helloworld!");
log4j2.xml
(2)MDC采用类似map的机制来存储信息,线程独立。
在PatternLayout中使用%X{userId}来输出,注意X是大写。
实例:
Test.java
ThreadContext.put("userId","1");
log4j2.xml
注意使用完后调用clearAll()清除上下文映射和堆栈。
api:http://logging.apache.org/log4j/2.x/javadoc.html
官网地址:https://logging.apache.org/log4j/2.x/index.html
以上这篇log4j2项目日志组件的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。