日志---slf4j和log4j2

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>
        <!--注意这个 查看你的sql语句日志 将你的dao的位置写入这里  ->
        <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(这个在配置上的解释更详细)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值