Log4j和slf4j

大家好,我是IT修真院武汉分院第13期学员,一枚正直善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务2扩展中的Log4j和slf4j

1.背景介绍

slf4j

slf4j(全称是Simple Loging Facade For Java)是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就

好像我们经常使用的JDBC一样,只是一种规则而已。因此单独的slf4j是不能工作的,它必须搭配其他具体的日志实现方案,比如

apache的org.apache.log4j.Logger,jdk自带的java.util.logging.Logger等等。</p>

 log4j2

Apache Log4j2是对Log4j的升级,与其前身Log4j 1.x相比有了显着的改进,并提供了许多Logback等可用的改进

2.知识剖析

SLF4J,共享记录与log4j2的关系

commons-logging和slf4j一样都是日志的接口

log4j,logback等等才是日志的真正实现。当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作!

3.常见问题

1)Log4j2怎么结合SLF4J?

2)用slf4j+Log4j2的优点

4.解决方案

1.添加SLF4J的jar包 

添加log4j2的jar包 &nbsp 配置log4j2 

 2.优势
1.可以很好的与客户端解耦<

2.节省内存           

 log4j的传统日志系统里并没有占位符的概念

5.编码实战

Log4j2的配置

web.xml


jar包依赖


log4j2.xml  配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。
-->
<!--
    monitorIntervalLog4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数。
-->
<configuration status="error" monitorInterval="30">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>


    <!--然后定义logger,只有定义了logger并引入的appenderappender才会生效-->

    <loggers>
        <!--建立一个默认的rootlogger-->
        <root level="info">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>



        <!--服务器的日志输出不成功有两个原因
                1. 文件没有写入权限
                 2.路径不对     采用绝对路径-->

6.扩展思考

A.前提条件

没有调用Log4j-1.x的内部方法,比如Appenders(),LoggerRepository()

没有使用代码的方式配置Log4j

没有调用DOMConfigurator或PropertyConfigurator这两个类

B.替换jar包

把 Log4j-1.x.jar 换成 log4j-1.2-api.jar(这个jar包内有log4j-api、log4j-core两个jar包)

C.修改代码

首先要清楚,jar包前缀不一样,版本1是org.apache.log4j,版本2是org.apache.logging.log4j

a.版本1是Logger.getLogger( ),改成版本2的LoggerManager.getLogger( )

b.版本1是Logger.getRootLogger( ),改成版本2的LoggerManager.getRootLogger( )

7.参考文献

slf4j源码剖析                    https://www.cnblogs.com/xing901022/p/4149524.html
slf4j+log4j2详解              https://www.cnblogs.com/hafiz/p/6160298.html

log4j2的配置                    http://www.cnblogs.com/hafiz/p/6170702.html

师兄简书:                        https://www.jianshu.com/p/0dfd46182cce

写的不对的欢迎更正。。

视频地址: https://v.qq.com/x/page/e0663ovbumb.html

PPT:   https://it-xzy.github.io/JAVA-NEW/20180523-C-JAVA-3.html#/

问题:

1.log4j2 和slf4j的优势

可以很好的与客户端解耦

slf4j只是一种接口,它本身并不关心你底层使用的是什么日志实现方案,所以它支持各种日志实现方案。简单的说,只要我们在类库中使用slf4j打日志,那么底层使用什么日志实现方案是使用者决定的,怎么决定?依靠配置文件和jar库。

比较省内存

打日志的时候使用了{}占位符,这样就不会有字符串拼接操作,减少了无用String对象的数量,节省了内存。并且,记住,在生产最终日志信息的字符串之前,这个方法会检查一个特定的日志级别是不是打开了,这不仅降低了内存消耗而且预先降低了CPU去处理字符串连接命令的时间。这里是使用SLF4J日志方法的代码,来自于slf4j-log4j12-1.6.1.jar中的Log4j的适配器类Log4jLoggerAdapter。


2.slf4j 的工作原理

单独的slf4j是不能工作的,必须带上其他具体的日志实现方案。就以apache的log4j作为具体日志实现方案为例,如果在工程中要使用slf4j作为接口,并且要用log4j作为具体实现方案

3.log4j与 log4j2的区别

最关键的最大的不同,那就是配置文件的区别

log4j2.xml

Log的调用     

log4j2 

import org.apache.logging.log4j.Level;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;private static Logger logger = LogManager.getLogger(Test.class.getName());

猜你喜欢

转载自blog.csdn.net/qq_39691226/article/details/80428623