使用slf4j + Log4j2构建日志
2015-12-21 14:10
429 查看
一、背景
Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上),这里分享slf4j + Log4j2的使用方法。二、步骤
1、pom.xml
删除以往依赖Log4j1.x的依赖项,比如slf4j-log4j12、log4j等包。可以到项目的根目录,执行:mvn dependency:tree > tree.log ,查看之后 cat tree.log | grep log4j查找。
<exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions>
然后在工程的pom.xml新增以下log4j2的依赖关系:
<!-- Logging use log4j2--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.13</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.13</version> <scope>runtime</scope> </dependency> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.4.1</version> </dependency> <!--用于与slf4j保持桥接--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.4.1</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.4.1</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.2.0</version> </dependency>
2、web.xml
web工程的web.xml文件中添加(Servlet3.0不需要):<!--log4j2--> <!--对于log4j2,Servlet2.5以前的版本需要--> <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> </filter-mapping>
3、log4j2.xml
log4j2不再支持properties文件了,只支持xml,json或是yaml。默认不指定位置,可以放在src/main/resources下。如果需要自定义位置,需要在上面的web.xml中添加
<context-param> <param-name>log4jConfiguration</param-name> <param-value>/WEB-INF/classes/log4j2.xml</param-value> </context-param>
下面是一个log4j2.xml的demo
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="off" monitorInterval="1800"> <properties> <property name="LOG_HOME">/opt/logs/gct/shoppromo/logs</property> <property name="ERROR_LOG_FILE_NAME">error</property> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d %-5p (%F:%L) - %m%n" /> </Console> <RollingRandomAccessFile name="ErrorLog" fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log" filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz"> <PatternLayout pattern="%d %-5p (%F:%L) - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingRandomAccessFile> </Appenders> <Loggers> <!-- 3rdparty Loggers --> <logger name="org.springframework.core" level="info"> </logger> <logger name="org.springframework.beans" level="info"> </logger> <logger name="org.springframework.context" level="info"> </logger> <logger name="org.springframework.web" level="info"> </logger> <logger name="com.meituan.gct.shop.promo" level="error" includeLocation="true" additivity="false"> <appender-ref ref="ErrorLog"/> <appender-ref ref="Console"/> </logger> <root level="info" includeLocation="true"> <appender-ref ref="Console"/> </root> </Loggers> </Configuration>
4、代码示例
import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @Controller @RequestMapping("/api/") public class TestController { private static Logger log = LogManager.getLogger(TestController.class.getName()); @RequestMapping(value = "/test") public String test( HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) { log.info("你好啊"); log.debug("我是debug"); log.error("错了"); log.trace("这是什么"); modelMap.put("s", "ok"); return "string"; } }
注意:在JVM启动参数中增加 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 开启异步日志
相关文章推荐
- you must restart adb and eclipse的相关解决办法
- <swift学习之路> UIAlertController的简单使用
- u3d 学习1
- <LeetCode OJ> 50. Pow(x, n)
- c++多态之继承3-派生类的构造次序
- 先执行javascript在执行ios原生函数
- Redis学习手册(List数据类型)
- 第一个用eclipse打包APK时出现的问题
- 学习笔记(5)——树
- FLV合并开源代码flvmerge分析
- mysql高可用集群——MHA架构
- iOS 用CocoaPods做iOS程序的依赖管理
- ViewState的用法
- UVA 10935
- SQL-AdventureWorks样例数据库
- VS2012行人检测setSVMDetector报错,解决方案
- 《unix环境高级编程》书中源代码编译 详细流程
- msm8937 porting iic device
- RxJava 详解
- linux-->结合windows系统分区理解linux系统分区以及挂载点