日志---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(这个在配置上的解释更详细)

原创粉丝点击