一,所需jar包或依赖: slf4j-api
log4j-apilog4j-corelog4j-slf4j-impl(集成包) log4j-web(web项目需要) 注意:最新的log4j2所需要的jdk版本比较高,由于这里采用的jdk1.6,所以版本最高只能使用2.3的,这里使用的具体版本如下: slf4j-api-1.7.25.jar
log4j-api-2.3.jarlog4j-core-2.3.jarlog4j-slf4j-impl-2.3.jarlog4j-web-2.3.jar
二,log4j的配置文件: 之前log4j的1.x版本支持properties配置文件的方式,但是在log4j2这里,只支持xml配置文件的方式,或者json,jsn后缀的文件。 系统选择配置文件的优先级(从先到后)如下: (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件. (2).classpath下的名为log4j2-test.xml的文件. (3).classpath下名为log4j2.json 或者log4j2.jsn的文件. (4).classpath下名为log4j2.xml的文件. 我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。 log4j2.xml配置文件默认配置为:
下面是一个比较详细的配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <Configuration status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_OUT">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Root level="error">
- <AppenderRef ref="Console"/>
- </Root>
- </Loggers>
- </Configuration>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="10">
<Properties>
<!-- 配置日志文件输出目录 -->
<Property name="LOG_DIR">/export/data/logs/myProject_web</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
</Console>
<RollingFile name="debug_logger_appender" fileName="${LOG_DIR}/web_debug.log"
filePattern="${LOG_DIR}/web_debug.log.%d{yyyy-MM-dd}">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<RollingFile name="info_logger_appender" fileName="${LOG_DIR}/web_info.log"
filePattern="${LOG_DIR}/web_info.log.%d{yyyy-MM-dd}">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<RollingFile name="error_logger_appender" fileName="${LOG_DIR}/web_error.log"
filePattern="${LOG_DIR}/web_error.log.%d{yyyy-MM-dd}">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<!--<AppenderRef ref="debug_logger_appender"/>-->
<AppenderRef ref="info_logger_appender"/>
<AppenderRef ref="error_logger_appender"/>
</Root>
<!--过滤掉spring的一些无用的DEBUG信息-->
<Logger name="org.springframework" level="ERROR"/>
</Loggers>
</Configuration>
三,java代码中如何使用log4j2
这里要说明的一点是,使用.class为参数生成的logger,在配置文件中,与用全路径的包名或者类名,配置Logger标签相对应,例如:<Logger name="org.springframework" level="ERROR"/>。 如果参数是字符串,例如org.slf4j.LoggerFactory.getLogger("test"),对应的Logger标签配置为<Logger name="test" level="ERROR"/>。// log4j2方式
private static final org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Test.class);
// slf4j方式
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Test.class);
四,web项目使用log4j2注意事项参考官网和各种资料显示,web项目需要使用 log4j-web的依赖,并且servlet3.0和servlet2.5的处理方式还有不同,不支持servlet2.4及以下版本。而servlet的版本使用,也是受到tomcat版本的约束。 下面是每个版本所支持的servlet和jsp版本对应表。
Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Apache Tomcat version | Actual release revision | Support Java Versions |
---|---|---|---|---|---|---|
4.0 | TBD (2.4?) | TBD (3.1?) | TBD (1.2?) | 9.0.x | None | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 8.0.x | 8.0.15 | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | 7.0.x | 7.0.57 | 6 and later (WebSocket 1.1 requires 7 or later) |
2.5 | 2.1 | 2.1 | N/A | 6.0.x | 6.0.43 | 5 and later |
2.4 | 2.0 | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
这里使用的tomcat6.0.33版本,支持的servlet版本2.5。(找到tomcat下lib的jsp-api.jar和servlet-api.jar两个jar包,分别用winrar这类的解压软件打开,里面的META-INF文件夹下的MANIFEST.MF文件,里面有相应的版本号) 官网给出,如果是servlet2.5,那么在添加log4j-web的依赖之后,需要在web.xml中进行如下配置,并且需要注意,都要放在其它的定义之前:
但是这里测试,没有进行上面的配置,也没有添加log4j-web依赖,也能正常使用,打印日志,难道性能上面,文件资源的打开关闭上面有影响? 这里参考的文章: https://logging.apache.org/log4j/2.x/manual/webapp.html http://blog.csdn.net/sushengmiyan/article/details/52390211 http://www.cnblogs.com/yoyotl/p/4920073.html 另外,不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息可以参考文章: http://blog.csdn.net/z69183787/article/details/36008097
- <listener>
- <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
- </listener>
- <filter>
- <filter-name>log4jServletFilter</filter-name>
- <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>log4jServletFilter</filter-name>
- <url-pattern>/*</url-pattern>
- <dispatcher>REQUEST</dispatcher>
- <dispatcher>FORWARD</dispatcher>
- <dispatcher>INCLUDE</dispatcher>
- <dispatcher>ERROR</dispatcher>
- <dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
- </filter-mapping>