日志---slf4j和log4j2
来源:互联网 发布:索尼手机拍照软件 编辑:程序博客网 时间:2024/04/29 23:05
log4j2是什么?
Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
是 Log4j 1.x改进,解决了 一些固有问题:高并发情况下出现死锁导致cpu使用率异常飙升等。
特点:API Separation(API分离),Improved Performance(改善性能),Support for multiple APIs,Avoid lock-in(避免死锁)等。
具体看log4j2官网
slf4j是什么?
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. Note that SLF4J-enabling your library/application implies the addition of only a single mandatory dependency, namely slf4j-api-1.8.0-alpha2.jar.
简单的来说是为java提供的简单日志Facade(门面,更底层的来说是接口)。它不是一个真正的日志实现,而是一个抽象层( abstraction layer)。允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端嵌入程序,另一端链接日志系统,从而实现将程序中的信息导入到日志系统并记录。
log4j2性能高于Log4j 1.x和logback,slf4j可以接入不同的日志系统。所以这两者可以结合起来。
用法:
一:引入包
<!-- 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>
二:配置
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>
有人会在web.xml添加log4j的监听器Log4jServletContextListener。
<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>
这个在servlet2.5之前支持,之后就不支持了。
在src/main/resources下写log4j2.xml。
官方的一个配置案例:
<?xml version="1.0" encoding="UTF-8"?><Configuration status="debug"> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </Console> <File name="TEMP" fileName="temp"> <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </File> <Async name="ASYNC"> <AppenderRef ref="TEMP"/> <AppenderRef ref="CONSOLE"/> </Async></Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="ASYNC"/> </Root> </Loggers></Configuration>
Configuration为根节点,有一个status属性,这个属性表示log4j2本身的日志信息打印级别。把status改为TRACE再执行测试代码,可以看到控制台中打印了一些log4j加载插件、组装logger等调试信息。
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。
下面是Appender配置,Appender可以理解为日志的输出目的地,这里配置了一个类型为Console的Appender,也就是输出到控制台。Console节点中的PatternLayout定义了输出日志时的格式:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
最后是Logger的配置,这里只配置了一个Root Logger。
我一般用到的配置
<?xml version="1.0" encoding="UTF-8"?><Configuration status="off"> <properties> <!--日志文件相对路径--> <property name="LOG_HOME">logs</property> <!--日志文件名--> <property name="FILE_NAME">lyl</property> <property name="TEMP_FILE_NAME">lyl_Temp</property> </properties> <Appenders> <!-- 控制台 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!-- 打出所有日志,临时log,程序运行会自动覆盖 --> <File name="Log" fileName="${web:rootDir}/${LOG_HOME}/${TEMP_FILE_NAME}.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- <File name="ERROR" fileName="logs/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> --> <!-- 打出所有日志 ${web:rootDir}/--> <RollingRandomAccessFile name="RollingFile" fileName="${web:rootDir}/${LOG_HOME}/${FILE_NAME}.log" filePattern="${web:rootDir}/${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}_%d{yyyy-MM-dd}_%i.log.gz"> <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy /> <!-- 当单个日志文件超过10MB时,自动新建另一个文件记录日志 --> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> <!-- 最多保存多少个日志文件 --> <DefaultRolloverStrategy max="200" /> </RollingRandomAccessFile> </Appenders> <Loggers> <Logger name="com.nis.dao" level="trace" /> <!-- <Logger name="com.nis.common.frame.dao" level="trace" /> --> <Root level="info"> <!-- 将日志输出至文件(部署状态下开启) --> <AppenderRef ref="RollingFile" /> <!-- 将日志输出至控制台(调试状态下开启) --> <AppenderRef ref="Console"/> <!-- 临时日志 可注释掉 --> <AppenderRef ref="Log"/> </Root> </Loggers></Configuration>
三:代码示例
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("Test")public class TestController { private static final Logger logger = LoggerFactory.getLogger(TestController.class); @RequestMapping("index") public ModelAndView index(HttpServletRequest request,HttpServletResponse reponse) { ModelAndView modelAndView = new ModelAndView("test"); System.out.println("index"); logger.debug("This is log of level of debug"); logger.trace("log4j2 Demo"); logger.error("error"); return modelAndView; }}
参考网址:
http://blog.csdn.net/heyutao007/article/details/50371668
http://blog.csdn.net/tengdazhang770960436/article/details/18006127(这个偏向两者之间关系)
http://blog.csdn.net/autfish/article/details/51203709(这个在配置上的解释更详细)
- 日志---slf4j和log4j2
- 日志学习:SLF4J & Log4J2
- slf4j +log4j2 日志 配置
- 使用slf4j + Log4j2构建日志
- Log4j,Log4j2,logback,slf4j日志学习
- Log4j,Log4j2,logback,slf4j日志学习
- SpringMVC使用maven配置SLF4J和Log4J2
- 项目中实际使用的日志配置log4j2 + slf4j
- slf4j绑定log4j2日志系统的过程(源码分析)
- slf4j+log4j2在tomcat8 下无日志输出
- Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback总结
- 使用Slf4j集成Log4j2构建项目日志系统解决方案
- slf4j+log4j2 maven
- log4j2+slf4j使用案例
- Log4j2+Slf4j快速入门
- Log4j2+Slf4j快速入门
- log4j2配合slf4j使用
- SLF4J和Logback日志框架
- button CSS
- Linux下Redis的安装和部署
- Recyclerview或Listview实时刷新,item点击事件失效的解决方法
- 淘客未来新趋势:自媒体淘客!
- spring boot项目打包成war并在tomcat上运行的步骤
- 日志---slf4j和log4j2
- jstl判段对象是否为空
- 微服务生态系统的4层模型
- 如何上架一款iOS应用到AppStore
- 在一台服务器上(centOS)配置Redis主从
- 4.2 自定义控件 之 自定义属性与引入布局
- 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
- SQL Group By和Update表别名 查找数据冲突
- Apache在windows下多站点配置