精华内容
下载资源
问答
  • 2022-02-15 13:50:22

            作为一名Java程序员,可以开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug;在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统。本文要来分享一些Java程序员最常用的Java日志框架组件。

    1、log4j – 最受欢迎的Java日志组件

            Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台、文件、用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程。更值得一提的是,Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位地掌控日志信息。

    下面是使用Log4j的一个简单例子:

    package com.mai.test;
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    public class Log4jTest {
    
    public static void main(String[] args) {
    
    Logger log = Logger.getLogger(Log4jTest.class);
    PropertyConfigurator.configure("src/log4j.properties");
    log.debug("yes,debug");
    log.info("yes,info");
    log.error("yes,error");
    log.warn("yes,warn");
    }
    
    }

    2、gclogviewer – Java日志查看工具

            gclogviewer是一个支持jdk 6的gc log可视化工具,和gcviewer相比,gclogviewer支持根据gc log生成GC的趋势图,也支持生成调优建议所需的数据趋势图。

    3、SLF4J – 基于API的Java日志框架

            SLF4J提供了一个简单统一的日志记录接口,开发者在配置和部署时只需要实现这个接口即可实现日志功能。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。

    4、Flume – Apache日志服务器

            之前介绍的都是一些日志记录工具,Flume则是一个日志分析系统,Flume是分布式的,它有一个非常灵活的架构,用来收集、聚合以及移动大量日志数据,并且提供可靠、容错的系统架构。

    5、zLogFabric – 日志存储系统

            zLogFabric 是一个集成的跨平台日志解决方案,通过消息系统收集各个应用的日志信息存储到一个集中式的系统中。模块化的设计使得服务器可对日志进行存储、转发、警报以及生成日志统计信息。

            zLogFabric 可收集来自文件、syslog、log4j、log4net 以及 Windows 事件的数据。

    6、logstash – Java日志管理工具

            logstash是一款功能非常强大的日志管理工具,利用logstash,你可以对日志进行传输、处理、管理和检索,并且提供Web接口以便开发者统计和查询日志信息。

    7、Commons Logging

            Commons Logging的实现不依赖于具体的日志实现工具,仅仅提供一些日志操作的抽象接口,它对其他的日志工具做了封装,比如Log4J, Avalon LogKit, 和JDK 1.4等。

    8、Darks Logs

            Darks Logs和log4j类似,也适用于Java、Android等项目,但是Darks Logs使用更加简单,而且对Android端做了非常大的改善。Darks Logs对Sqlite的日志保存增加了Appender。其旨在解决Android日志无法灵活控制日志等级、格式、保存或显示目标等常用操作等的问题。

    Java学习视频

    Java基础:

    Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

    Java项目:

    【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

    【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

     

    更多相关内容
  • Java开发常用日志记录框架有JDKLog、Log4J、LogBack、SLF4J、SLF4J。这些日志记录框架各有各的特点,各有各的应用场景。了解这些框架的特点及应用场景,有利于我们做技术选型的时候做出正确的判断。 JDKLog...

    在Java开发中,常用的日志记录框架有JDKLog、Log4J、LogBack、SLF4J、SLF4J。这些日志记录框架各有各的特点,各有各的应用场景。了解这些框架的特点及应用场景,有利于我们做技术选型的时候做出正确的判断。

    JDKLog:日志小刀

    JDKLog是JDK官方提供的一个记录日志的方式,直接在JDK中就可以使用。

    import java.util.logging.Logger;
    
    /****
     ** JDKLog Demo
     **/
    public class JDKLog {
    	public static void main(String[] args) {
    		Logger logger = Logger.getLogger("JDKLog");
    		logger.info("Hello World.");
    	}
    }

    JDKLog 的有点是使用非常简单,直接在 JDK 中就可以使用。但 JDKLog 功能比较太过于简单,不支持占位符显示,拓展性比较差,所以现在用的人也很少。

    Log4J:日志大炮

    Log4J 是 Apache 的一个日志开源框架,有多个分级(DEBUG/INFO/WARN/ERROR)记录级别,可以很好地将不同日志级别的日志分开记录,极大地方便了日志的查看。

    Log4J 有 1.X 版本和 2.X 版本,现在官方推荐使用 2.X 版本,2.X 版本在架构上进行了一些升级,配置文件也发生了一些变化。但好在官方的配置说明文档非常清楚,通过查阅文档能解决大部分的问题。

    备注:log4J1.x 版本已经停止维护(2015年8月)

    使用Log4J2.x 步骤总结:

    第一:使用 Log4J2.x 框架首先需要引入依赖的包:

    <!-- Log4J -->  
    <dependency>  
        <groupId>org.apache.logging.log4j</groupId>  
        <artifactId>log4j-api</artifactId>  
        <version>2.6.2</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.logging.log4j</groupId>  
        <artifactId>log4j-core</artifactId>  
        <version>2.6.2</version>  
    </dependency>  

    第二:增加配置文件 log4j2.xml 放在 resource 目录下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>

    注意:节点的 level 属性表示输出的最低级别。

    第三:编写测试类

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    /****
     ** Log4J Demo
     **/
    public class Log4jLog {
    	public static void main(String args[]) {
    		Logger logger = LogManager.getLogger(Log4jLog.class);
    		logger.debug("Debug Level");
    		logger.info("Info Level");
    		logger.warn("Warn Level");
    		logger.error("Error Level");
    	}
    }

    运行测试类输出结果:

    10:16:08.279 [main] INFO com.chanshuyi.Log4jLog - Info Level
    10:16:08.280 [main] WARN com.chanshuyi.Log4jLog - Warn Level
    10:16:08.280 [main] ERROR com.chanshuyi.Log4jLog - Error Level

    注意:如果没有配置 log4j2.xml 配置文件,那么LOG4J将自动启用类似于下面的的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="error">
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>

    使用log4J2 默认配置文件,测试类输出结果

    ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
    11:40:07.377 [main] ERROR com.chanshuyi.Log4jLog - Error Level

    Log4J2.x  缺点补充

    Log4J2.x本身也存在一些缺点,比如不支持使用占位符,不利于代码阅读等缺点。但是相比起 JDKLog,Log4J 1.x可以说是非常好的日志记录框架了.

     

    LogBack:日志火箭

    LogBack 其实可以说是 Log4J 的进化版,因为它们两个都是同一个人(Ceki Gülcü)设计的开源日志组件。LogBack 除了具备 Log4j 的所有优点之外,还解决了 Log4J 不能使用占位符的问题。

    使用LogBack步骤总结:

    第一:使用LogBack框架首先需要引入依赖的包:

    <!-- LogBack -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
    </dependency>

    第二:配置 logback.xml 配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
            </layout>
        </appender>
        <logger name="com.chanshuyi" level="TRACE"/>
        <root level="debug">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>

    备注:LogBack 的日志级别区分可以细分到类或者包,这样就可以使日志记录变得更加灵活。在之后的类文件中引入Logger类,并进行日志记录。

    第三:编写测试类

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /****
     ** LogBack Demo
     **/
    public class LogBack {
    	static final Logger logger = LoggerFactory.getLogger(LogBack.class);
    
    	public static void main(String[] args) {
    		logger.trace("Trace Level.");
    		logger.debug("Debug Level.");
    		logger.info("Info Level.");
    		logger.warn("Warn Level.");
    		logger.error("Error Level.");
    	}
    }

    运行测试类输出结果:

    14:34:45.747 [main] TRACE com.chanshuyi.LogBack - Trace Level.
    14:34:45.749 [main] DEBUG com.chanshuyi.LogBack - Debug Level.
    14:34:45.749 [main] INFO com.chanshuyi.LogBack - Info Level.
    14:34:45.749 [main] WARN com.chanshuyi.LogBack - Warn Level.
    14:34:45.749 [main] ERROR com.chanshuyi.LogBack - Error Level.

    LogBack 优缺点补充

    LogBack 解决了 Log4J 不能使用占位符的问题,这使得阅读日志代码非常方便。除此之外,LogBack 比 Log4J 有更快的运行速度,更好的内部实现。并且 LogBack 内部集成了 SLF4J 可以更原生地实现一些日志记录的实现。

    SLF4J:适配器

    上面说了 JDKLog、Log4J、LogBack 这几个常用的日志记录框架,它们都有各自的优缺点,适合在不同的场景下使用。但项目的实际情况是:简单的项目直接用 JDKLog 就可以了,而复杂的项目需要用上 Log4J。很多时候我们做项目都是从简单到复杂,也就是我们很可能一开始使用的是 JDKLog,之后业务复杂了需要使用 Log4J,这时候我们如何将原来写好的日志用新的日志框架输出呢?

    解决方案一:

    一个最死板的方法就是一行行代码修改,把之前用 JDKLog 的日志代码全部修改成 Log4J 的日志接口。但是这种方式不仅效率低下,而且做的工作都是重复性的工作,这怎么能忍呢。

    解决方案二:

    因为在实际的项目应用中,有时候可能会从一个日志框架切换到另外一个日志框架的需求,这时候往往需要在代码上进行很大的改动。为了避免切换日志组件时要改动代码,这时候一个叫做 SLF4J(Simple Logging Facade for Java,即Java简单日志记录接口集)的东西出现了。

    SLF4J(Simple Logging Facade for Java,即Java简单日志记录接口集)是一个日志的接口规范,它对用户提供了统一的日志接口,屏蔽了不同日志组件的差异。这样我们在编写代码的时候只需要看 SLF4J 这个接口文档即可,不需要去理会不同日之框架的区别。而当我们需要更换日志组件的时候,我们只需要更换一个具体的日志组件Jar包就可以了。

    SLF4J 和日志框架(JDKLog、LOG4J、LogBack)整合总结

    SLF4J+JDKLog

    第一:Maven 中导入以下依赖包

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.7.21</version>
    </dependency>

    第二:编写测试类

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /****
     ** SLF4J + JDKLog
     **/
    public class Slf4jJDKLog {
    	final static Logger logger = LoggerFactory.getLogger(Slf4jJDKLog.class);
    
    	public static void main(String[] args) {
    		logger.trace("Trace Level.");
    		logger.info("Info Level.");
    		logger.warn("Warn Level.");
    		logger.error("Error Level.");
    	}
    }

    第三:测试类结果输出

    七月 15, 2021 3:30:02 下午 com.chanshuyi.slf4j.Slf4jJDKLog main
    信息: Info Level.
    七月 15, 2021 3:30:02 下午 com.chanshuyi.slf4j.Slf4jJDKLog main
    警告: Warn Level.
    七月 15, 2021 3:30:02 下午 com.chanshuyi.slf4j.Slf4jJDKLog main
    严重: Error Level.

    SLF4J+LOG4J

    第一:Maven 中添加如下依赖Jar包(slf4j-api.jar、slf4j-412.jar、log4j.jar)

    <!-- 2.SLF4J + Log4J -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    第二:配置log4j 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
        <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern"
                    value="[%d{dd HH:mm:ss,SSS} %-5p] [%t] %c{2} - %m%n" />
            </layout>
            <!--过滤器设置输出的级别-->
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="levelMin" value="debug" />
                <param name="levelMax" value="error" />
                <param name="AcceptOnMatch" value="true" />
            </filter>
        </appender>
        <!-- 根logger的设置-->
        <root>
            <priority value ="debug"/>
            <appender-ref ref="myConsole"/>
        </root>
    </log4j:configuration>

    还是使用上面的测试类,无需修改。输出控制台测试结果

    [15 16:04:06,371 DEBUG] [main] slf4j.SLF4JLog - Debug Level.
    [15 16:04:06,371 INFO ] [main] slf4j.SLF4JLog - Info Level.
    [15 16:04:06,371 WARN ] [main] slf4j.SLF4JLog - Warn Level.
    [15 16:04:06,371 ERROR] [main] slf4j.SLF4JLog - Error Level.

    SLF4J+LogBack

    第一:Maven 中导入以下依赖包

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.7</version>
    </dependency>

    第二:配置 logback.xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
            </layout>
        </appender>
        <logger name="com.chanshuyi" level="TRACE"/>
        <root level="warn">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>

    还是使用上面的测试类,无需修改。输出控制台测试结果

    16:08:01.040 [main] TRACE com.chanshuyi.slf4j.SLF4JLog - Trace Level.
    16:08:01.042 [main] DEBUG com.chanshuyi.slf4j.SLF4JLog - Debug Level.
    16:08:01.043 [main] INFO com.chanshuyi.slf4j.SLF4JLog - Info Level.
    16:08:01.043 [main] WARN com.chanshuyi.slf4j.SLF4JLog - Warn Level.
    16:08:01.043 [main] ERROR com.chanshuyi.slf4j.SLF4JLog - Error Level.

    LogBack日志框架

    现在最流的日志框架解决方案莫过于SLF4J + LogBack。原因有下面几点:

    LogBack 自身实现了 SLF4J 的日志接口,不需要 SLF4J 去做进一步的适配。

    LogBack 自身是在 Log4J 的基础上优化而成的,其运行速度和效率都比 LOG4J 高。

    SLF4J + LogBack 支持占位符,方便日志代码的阅读,而 LOG4J 则不支持。

    LogBack日志框架组件说明

    LogBack 被分为3个组件:logback-core、logback-classic 和 logback-access。

    logback-core 提供了 LogBack 的核心功能,是另外两个组件的基础。

    logback-classic 则实现了 SLF4J 的API,所以当想配合 SLF4J 使用时,需要将 logback-classic 引入依赖中。

    logback-access 是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。

    LogBack的日志记录数据流是从 Class(Package)到 Logger,再从Logger到Appender,最后从Appender到具体的输出终端。

    LogBack日志框架配置文件说明

    LogBack配置文件可以分为几个节点,其中 Configuration 是根节点,Appender、Logger、Root是Configuration的子节点。

    appender节点:是的子节点,是负责写日志的组件。appender有两个必要属性name、class 。name指定appender的名称,class指定appender的全限定名class,主要包括:
    ch.qos.logback.core.ConsoleAppender 控制台输出
    ch.qos.logback.core.FileAppender 文件输出
    ch.qos.logback.core.RollingFileAppender 文件滚动输出

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration debug="true" scan="true" scanPeriod="2">
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        </appender>
        <!-- conf file out -->
        <appender name="file_out" class="ch.qos.logback.core.FileAppender">
        </appender>
        <!-- conf file out -->
        <appender name="file_out" class="ch.qos.logback.core.RollingFileAppender">
        </appender>
        <root></root>
        <logger></logger>
    </configuration>

    ConsoleAppender:把日志添加到控制台,有如下节点:

    <encoder> : 对日志进行格式化。

    <target> : 字符串System.out 或者 System.err, 默认 System.out;

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%date [%thread] %-5level %logger - %message%newline</pattern>
            </encoder>
        </appender>
    
        <root level="INFO">
            <appender-ref ref="console_out" />
        </root>
    </configuration>

    FileAppender:把日志添加到文件,有如下节点:

    <file>:被写入的文件名,可以是相对目录 , 也可以是绝对目录 , 如果目录不存在则会自动创建。

    <append>:如果是true , 日志被追加到文件结尾 , 如果是false,清空现存文件 , 默认是true。

    <encoder>:对日志进行格式化 [具体的转换符说明请参见官网.]

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <appender name="file_out" class="ch.qos.logback.core.FileAppender">
            <file>logs/debug.log</file>
            <encoder>
                <pattern>%date [%thread] %-5level %logger - %message%newline</pattern>
            </encoder>
        </appender>
    </configuration>

    rollingFileAppender

    滚动纪录文件,先将日志记录到指定文件,当符合某种条件时,将日志记录到其他文件,有如下节点:
    <file>:被写入的文件名,可以是相对目录,也可以解决目录,如果目录不存在则自动创建。
    <append>:如果是true,日志被追加到文件结尾,如果是false,清空现存文件,默认是true。
    <encoder>:对日志进行格式化。
    <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
    rollingPolicy
    TimeBaseRollingPolicy :最常用的滚动策略,根据时间来制定滚动策略,即负责滚动也负责触发滚动。有如下节点;
    <fileNamePattern>:必要节点,包含文件及“%d” 转换符,“%d”可以包含一个java.text.SimpleDateFormat 制定的时间格式,如:%d{yyyy-MM},如果直接使用%d ,默认格式是 yyyy-MM-dd。
    <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且 是 6,则只保存最近6个月的文件,删除之前的旧文件,注意:删除旧文件是哪些为了归档而创建的目录也会被删除。
    <filenamePattern>:必须包含“%i” 例如:设置最小值,和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log,还可以指定文件压缩选项,例如:log%i.log.gz 或者 log%i.log.zip
    triggeringPolicy:告知RollingFileAppender,激活RollingFileAppender滚动。

    示例:

    <!-- 03:conf errorAppender out -->
    <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/error.log</file>
        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置日志命名模式-->
            <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 超过150MB时,触发滚动策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>

    logger节点
    logger是的子节点,来设置某一个包或者具体的某一个类的日志打印级别,以及指定。logger仅有一个name属性,两个可选属性 level/addtivity。
    name:用来指定受此loger约束的某一个包或者具体的某一个类。
    level:用来设置打印级别,大小写无关。可选值有TRACE、DEBUG、INFO、WARN、ERROR、ALL和OFF。还有一个特俗值INHERITED 或者 同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。
    addtivity:是否向上级logger传递打印信息,默认为true;
    可以包含零个或多个元素,表示这个appender将会添加到logger。

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤掉非INFO级别 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
            </filter>
    </appender>
    
    <!-- conf infoAppender out -->
    <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/info.log</file>
        <!-- 设置滚动策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置日志命名模式-->
            <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
        <!-- 超过150MB时,触发滚动策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
    
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>
    
    <!-- 添加两个appender节点 -->
    <logger name="logback.olf.log" level="info">
        <appender-ref ref = "console_out"/>
        <appender-ref ref = "infoAppender"/>
    </logger>
    </configuration>

    root节点
    元素配置根logger。该元素有一个level属性,没有name属性,因为已经被命名 为root。Level属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。如果 root 元素没 有引用任何 appender,就会失去所有 appender。

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤掉非INFO级别 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 01:conf infoAppender out -->
    <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/info.log</file>
        <!-- 设置滚动策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置日志命名模式-->
            <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
    
        <!-- 超过150MB时,触发滚动策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
    
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>
    
    <!-- 02:conf debugAppender out -->
    <appender name="debugAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/debug.log</file>
        <!-- 设置滚动策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置日志命名模式-->
            <fileNamePattern>debugFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
    
        <!-- 超过150MB时,触发滚动策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
    
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>
    
    <!-- 03:conf errorAppender out -->
    <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/error.log</file>
        <!-- 设置滚动策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置日志命名模式-->
            <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
    
        <!-- 超过150MB时,触发滚动策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
    
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>
    
    <root level="ALL">
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="errorAppender"/>
    </root>
    </configuration>

    filter过滤节点
    级别过滤器(LevelFilter)
    LevelFilter 根据记录级别对记录事件进行过滤。如果事件的级别等于配置的级别,过滤 器会根据 onMatch 和 onMismatch 属性接受或拒绝事件。

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 过滤掉非INFO级别 -->
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
    
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="console_out" />
        </root>
    </configuration>

    临界值过滤器(ThresholdFilter)
    ThresholdFilter过滤掉低于指定临界值的事件。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <!-- 过滤掉TRACE和DEBUG级别的日志 -->
                <level>INFO</level>
            </filter>
    
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
             </encoder>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="console_out" />
        </root>
    </configuration>

    求值过滤器(EvaluatorFilter)
    评估是否符合指定的条件

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
                <evaluator>
                    <!--过滤掉所有日志中不包含hello字符的日志-->
                    <expression>
                        message.contains("hello")
                    </expression>
                    <onMatch>NEUTRAL</onMatch>
                    <onMismatch>DENY</onMismatch>
                </evaluator>
            </filter>
    
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="console_out" />
        </root>
    </configuration>

    匹配器(Matchers)

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- conf consoel out -->
        <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
                <evaluator>
                    <matcher>
                        <Name>odd</Name>
                        <!-- 过滤掉序号为奇数的语句-->
                        <regex>statement [13579]</regex>
                    </matcher>
                    <expression>odd.matches(formattedMessage)</expression>
                    <onMatch>NEUTRAL</onMatch>
                    <onMismatch>DENY</onMismatch>
                </evaluator>
            </filter>
    
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="console_out" />
        </root>
    </configuration>

    下面是一个我常用的logback.xml配置文件,供大家参考:

    <?xml version="1.0" encoding="UTF-8"?> 
      
    <!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->  
    <!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->  
    <!-- 以下  每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->  
      
      
    <!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,
    默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。   
        debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->  
    <configuration>  
        <!-- 定义日志文件 输入位置 -->  
        <property name="log_dir" value="/logs/ucas" />  
        <!-- 日志最大的历史 30天 -->  
        <property name="maxHistory" value="30"/>  
      
      
        <!-- ConsoleAppender 控制台输出日志 -->  
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
            <!-- 对日志进行格式化 -->  
            <encoder>  
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>  
            </encoder>  
        </appender>  
          
          
        <!-- ERROR级别日志 -->  
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->  
        <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">  
            <!-- 过滤器,只记录WARN级别的日志 -->  
            <filter class="ch.qos.logback.classic.filter.LevelFilter">  
                <level>ERROR</level>  
                <onMatch>ACCEPT</onMatch>  
                <onMismatch>DENY</onMismatch>  
            </filter>  
            <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->  
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
                <!--日志输出位置  可相对、和绝对路径 -->  
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/biz-error-log.log</fileNamePattern>  
                <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,  
                则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->  
                <maxHistory>${maxHistory}</maxHistory>  
            </rollingPolicy>  
                      
            <encoder>  
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
            </encoder>  
        </appender>  
          
          
        <!-- WARN级别日志 appender -->  
        <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">  
            <!-- 过滤器,只记录WARN级别的日志 -->  
            <filter class="ch.qos.logback.classic.filter.LevelFilter">  
                <level>WARN</level>  
                <onMatch>ACCEPT</onMatch>  
                <onMismatch>DENY</onMismatch>  
            </filter>  
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/biz-warn-log.log  
                </fileNamePattern>  
                <maxHistory>${maxHistory}</maxHistory>  
            </rollingPolicy>  
            <encoder>  
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
            </encoder>  
        </appender>  
          
          
        <!-- INFO级别日志 appender -->  
        <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">  
            <!-- 过滤器,只记录INFO级别的日志 -->  
            <filter class="ch.qos.logback.classic.filter.LevelFilter">  
                <level>INFO</level>  
                <onMatch>ACCEPT</onMatch>  
                <onMismatch>DENY</onMismatch>  
            </filter>  
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/biz-info-log.log  
                </fileNamePattern>  
                <maxHistory>${maxHistory}</maxHistory>  
            </rollingPolicy>  
            <encoder>  
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
            </encoder>  
        </appender>  
          
          
        <!-- DEBUG级别日志 appender -->  
        <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">  
            <filter class="ch.qos.logback.classic.filter.LevelFilter">  
                <level>DEBUG</level>  
                <onMatch>ACCEPT</onMatch>  
                <onMismatch>DENY</onMismatch>  
            </filter>  
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/biz-debug-log.log  
                </fileNamePattern>  
                <maxHistory>${maxHistory}</maxHistory>  
            </rollingPolicy>  
            <encoder>  
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
            </encoder>  
        </appender>  
        
        <logger name="org.springframework.web" value="DEBUG"/>
        <logger name="com.digipower" value="DEBUG"/>
        <logger name="org.apache.commons.digester" value="DEBUG" />
    		
          
        <!-- root级别   潜在错误日志级别 -->  
        <root level="WARN">  
            <!-- 控制台输出 -->  
            <appender-ref ref="STDOUT" />  
            <!-- 文件输出 -->  
            <appender-ref ref="ERROR" />  
            <appender-ref ref="INFO" />  
            <appender-ref ref="WARN" />  
            <appender-ref ref="DEBUG" />  
        </root>  
    </configuration>

    如何进行日志系统转换?

    在实际的日志转换过程中,SLF4J其实是充当了一个中介的角色。例如当我们一个项目原来是使用LOG4J进行日志记录,但是我们要换成LogBack进行日志记录。
    此时我们需要先将LOG4J转换成SLF4J日志系统,再从SLF4J日志系统转成LogBack日志系统。

    从日志框架转向SLF4J
    jul-to-slf4j:jdk-logging到slf4j的桥梁
    log4j-over-slf4j:log4j1到slf4j的桥梁
    jcl-over-slf4j:commons-logging到slf4j的桥梁
    从SLF4J转向具体的日志框架
    slf4j-jdk14:slf4j到jdk-logging的桥梁
    slf4j-log4j12:slf4j到log4j1的桥梁
    log4j-slf4j-impl:slf4j到log4j2的桥梁
    logback-classic:slf4j到logback的桥梁
    slf4j-jcl:slf4j到commons-logging的桥梁

    项目实例:我们一开始使用的是 Log4J 日志框架,现在我们希望转成 LogBack 框架,那么我们首先需要加入 log4j-over-slf4j.jar 将 Log4J 转成 SLF4J,之后再加入 logback-classic.jar 将 SLF4J 转成 LogBack。

    日志技术框架一览
    JUL:JDK中的日志记录工具,也常称为JDKLog、jdk-logging。
    LOG4J1:一个具体的日志实现框架。
    LOG4J2:一个具体的日志实现框架,是LOG4J1的下一个版本。
    LOGBACK:一个具体的日志实现框架,但其性能更好。
    JCL:一个日志门面,提供统一的日志记录接口,也常称为commons-logging。
    SLF4J:一个日志门面,与JCL一样提供统一的日志记录接口,可以方便地切换看具体的实现框架。
    JUL、LOG4J1、LOG4J2、LOGBACK是日志实现框架,而JCL、SLF4J是日志实现门面

    展开全文
  • Java系统中常用日志框架日志技术的概述日志技术体系结构Logback概述Logback快速入门Logback配置详解-输出位置、格式设置Logback配置详解-日志级别设置 日志技术的概述 日志: 生活的日志: 生活的日志就好比日记...

    日志技术的概述

    日志

    生活中的日志: 生活中的日志就好比日记,可以记录你生活的点点滴滴。
    程序中的日志: 程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。
    

    日志技术具备的优势

    可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。
    可以随时以开关的形式控制是否记录日志,无需修改源代码。
    

    日志技术的具体优势?
    在这里插入图片描述

    日志技术体系结构

    体系结构日志规范:一些接口,提供给日志的实现框架设计的标准。
    日志框架:牛人或者第三方公司已经做好的日志记录实现代码,后来者直接可以拿去使用。因为对Commons Logging的接口不满意,有人就搞了SLF4J。因为对Log4j的性能不满意,有人就搞了Logback。

    问题1:日志的规范是什么,常见的有几种形式。

    日志规范大多是一些接口,提供给实现框架去设计的。
    

    问题2:常见的规范是:

    Commons Logging
    Simple Logging Facade for Java
    

    问题3:日志的实现框架有哪些常见的?

    Log4J
    Logback(我们重点学习的,其他的都大同小异)
    

    Logback概述

    Logback日志框架

    Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好;
    官方网站:https://logback.qos.ch/index.html
    Logback是基于slf4j的日志规范实现的框架。
    

    Logback主要分为三个技术模块:
    1、logback-core: logback-core 模块为其他两个模块奠定了基础,必须有
    2、logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
    3、logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能

    Logback快速入门

    需求:导入Logback日志技术到项目中,用于纪录系统的日志信息
    注:logback_classic-1.2.3.jar, logback-core-1.2.3.jar, slf4j-api-1.7.26.jar以及logback.xml获得地址为:链接:https://pan.baidu.com/s/1ocdaY06b2uOiQvo3_BH_lw ,提取码:y8qm, 也可以自己在网上寻找
    ①:在项目下新建文件夹lib,导入Logback的相关jar包到该文件夹下,并添加到项目依赖库中去
    在这里插入图片描述在这里插入图片描述在这里插入图片描述②:将Logback的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)
    在这里插入图片描述③:在代码中获取日志的对象
    public static final Logger LOGGER = LoggerFactory.getLogger("类对象");这里使用的是常量的方式进行获取
    在这里插入图片描述④:使用日志对象LOGGER调用其方法输出不能的日志信息
    在这里插入图片描述在这里插入图片描述

    Logback配置详解-输出位置、格式设置

    Logback日志系统的特性都是通过核心配置文件logback.xml控制的
    Logback日志输出位置、格式设置

    通过logback.xml 中的<append>标签可以设置输出位置和日志信息的详细格式。
    通常可以设置2个日志输出位置:一个是控制台、一个是系统文件中
    

    输出到控制台的配置标志
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

    输出到系统文件的配置标志
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

    logback.xml详解:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--
            CONSOLE(console控制台) :表示当前的日志信息是可以输出到控制台的。
        -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--输出流对象 默认 System.out 改为 System.err(打印红色)-->
            <target>System.out</target>
            <encoder>
                <!--格式化输出:
                    %d%d{yyyy-MM-dd HH:mm:ss.SSS}:表示日期(2022-04-15 13:37:38.600)
                    %-5level:级别从左显示5个字符宽度([INFO ], [TRACE])
                    %c: 类名(Test.class%thread:表示线程名([main])
                    %msg:日志消息;
                    %n: 是换行符
                 -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>
            </encoder>
        </appender>
    
        <!--
            appender中的name命名设置打印在那里(name = "FILE"是打印在文件中, name = "CONSOLE"是打印在控制台中)
            File(文件):是输出的方向通向文件的
        -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
                <charset>utf-8</charset>
            </encoder>
            <!--日志输出路径-->
            <file>E:/code/itheima-data.log</file>
            <!--指定日志文件拆分和压缩规则-->
            <rollingPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--通过指定压缩文件名称,来确定分割文件方式-->
                <fileNamePattern>E:/code/itheima-data2-%d{yyyy-MM-dd}.log%i.rar</fileNamePattern>
                <!--文件拆分大小-->
                <maxFileSize>1MB</maxFileSize>
            </rollingPolicy>
        </appender>
    
        <!--
        level:用来设置打印级别,大小写无关:TRACE < DEBUG < INFO < WARN < ERROR  |    ALL(打印所有的日志)OFF(关闭,不打印日志)
       , 默认debug
        <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
        -->
        <root level="all">
            <appender-ref ref="CONSOLE"/>  <!-- 关联:可以在控制台进行输出,如果没有这一项,不会在控制台输出-->
            <appender-ref ref="FILE"/>
        </root>
    </configuration>
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    Logback配置详解-日志级别设置

    日志级别

    级别程度依次是:TRACE< DEBUG< INFO<WARN<ERROR  ; 
    默认级别是debug(忽略大小写),对应其方法。
    作用:用于控制系统中哪些日志级别是可以输出的,只输出级别不低于设定级别的日志信息。
    ALL  和  OFF分别是打开全部日志信息,及关闭全部日志信息。
    

    具体在<root level=“INFO”>标签的level属性中设置日志级别

    <root level=“INFO">   
    	 <appender-ref ref="CONSOLE"/>   
    	  <appender-ref ref="FILE" />
    </root>
    

    在这里插入图片描述问题1、设置日志输出级别的作用是什么?

    用于控制系统中哪些日志级别是可以输出的。
    

    问题2、Logback的日志级别是什么样的?

    级别程度依次是:TRACE< DEBUG< INFO<WARN<ERROR
    默认级别是debug(忽略大小写),只输出不低于当前级别的日志
    ALL  和 OFF分别是打开全部日志和关闭全部日志
    
    展开全文
  • java常用日志框架及日志实现

    JAVA日志

    在这里插入图片描述
    1、常见的日志框架
    无具体实现的抽象门面框架:
    JCL(Comons logging,Spring框架默认-抽象层)
    slf4j(主流java日志抽象层)
    Jboss-logging(Hibernate框架默认-抽象层)

    具体实现的框架:
    JUL(JVM Runtime,java中util包内置日志框架)
    log4j(Mybatis框架默认)
    log4j2(log4j的修订版)
    logback(轻量日志实现)

    日志框架及实现介绍抽象or实现
    JCLjcl是apache公司jakarta小组开发的日志框架,不再更新(止步2014),版本较老抽象
    Jboss-logging功能过于高大上,不适合普通程序员使用(平时开发很少用到)抽象
    slf4j(Simple Logging Facade For Java)是专门为java打造的一个日志框架(日志抽象层)抽象
    JUL(java.util.logging)是java中util包内置的一个日志,是基于log4j的竞争而产生(用着也不赖)具体实现
    Log4jlog4j很强,但是存在一定的性能问题,为了与slf4j整合实现,要大改整个实现功能,但是这样的话还不如重新再写一个具体实现
    Log4j2后者对其加强修改,升级了log4j,功能太过强大,与现有的日志抽象层框架不易整合具体实现
    Logback正由于log4j存在性能问题,开发者再次开发一个轻量日志实现-logback
    slf4j和log4j和Logback都是由Ceki Gülcü编写,所以在选择日志抽象层和日志实现时,可以优先考虑

    常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。

    JDK自带了logging,log4j1、log4j2、logback ,这些框架都自己定制了日志 API ,并且有相应的实现;目前用于实现日志统一的框架 Apache commons-logging、slf4j ,遵循面向接口编程的原则,这两大框架可以让用户在程序运行期间去选择具体的日志实现系统(log4j1\log4j2\logback等)来记录日志,是统一抽象出来的一些接口

    日志门面框架
    日志门面:是门面模式的一个典型的应用,门面模式,也称外观模式,请参照我的博文设计模式之外观模式,日志门面框架就使一套提供了日志相关功能的接口而无具体实现的框架,其调用具体的实现框架来进行日志记录。也就是说日志门面天然的兼容日志实现框架。典型的日志门面就是Commons Logging、SLF4J。

    日志门面的优点:

    日志门面是介于具体的日志框架与系统之间的桥梁,通过日志门面框架的应用实现了系统与具体实现日志框架的解耦。无论具体实现的日志框架如何变化,都不会影响系统日志的记录功能,更无须更改系统代码,符合“开放-闭合原则”。

    现今,Java日志领域被划分为两大阵营:Commons Logging阵营和Slf4j阵营。

    Commons Logging:Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型。它通过其他一些工具提供API,日志实现和包装器实现。

    SLF4J:Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现。可以在软件部署的时候决定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 授权方式发布。SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü.

    SpringBoot:底层是Spring框架,Spring框架默认是用JCL;
    而SpringBoot是选用 SLF4框架j,由logback来实现。

    开发过程中,想调用日志记录方法,不应该直接调用实现类(logback)中的方法,而是应该调用日志抽象层(slf4j)的方法。
    首先导入slf4j和logback的jar包依赖;

                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.30</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.2.5</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.5</version>
            </dependency>
    

    使用案例:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloWorld {
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
      }
    }
    

    参考:
    https://baijiahao.baidu.com/s?id=1715746137882792664&wfr=spider&for=pc
    https://blog.csdn.net/qq_52596258/article/details/119539867

    展开全文
  • Java最详细常用日志框架介绍

    千次阅读 2020-07-09 23:32:44
    java领域存在多种日志框架,目前常用日志框架包括Log4j1,Log4j2,Commons Logging,Slf4j,Logback,Jul。 Java常用日志框架类别 Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,...
  • 本文来自于csdn,主要讲解了常用日志框架,统一日志模块,各个日志的功能演示等等。 作为一名资深的开发人员,对于日志记录框架一定不会很陌生。而且几乎在所有应用里面,一定会用到各种各样的 日志框架用来记录...
  • 关注微信号:javalearns 随时随地学Java或扫一扫 随时随地学Java应用系统日志是不可缺少的重要组成部分,所有的应用的出错信息等都应该能在日志文件查找到,有的应用系统日志可能数量很小,有的庞大的应用系统...
  • Java是老牌编程语言,人才需求大、应用市场广,吸引了很多人的入行。为了快速学好Java,越来越多的人选择参加专业学习,一来有系统专业...在Java开发常用日志记录框架有JDKLog、Log4J、LogBack、SLF4J。 JDKLog:
  • Java常用日志框架总结

    千次阅读 2021-01-28 20:33:18
    作为java程序员,在工作开发遇到最多的一个问题就是打日志(log),好的日志方式可以帮助你事半功倍的监控线上程序运行的链路,出现bug时可以快速定位,但是,面对现如今众多的日志框架中,如何去选择哪个日志框架,...
  • 日志记录是应用程序运行必不可少的一部分。这篇文章主要介绍了浅谈Java日志框架slf4j作用及其实现原理,SLF4J是一个日志框架抽象层,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java日志框架探秘

    2021-02-24 17:17:06
    目前市面上已经存在的日志框架有log4j,log4j2,logback,java.util.logging。然而,现在主流的这几个日志框架基本都是基于实现类编程,而非接口编程,暴露了一些无关紧要的信息给用户,这种耦合没有必要,还有当应用...
  • Java日志框架

    2021-02-24 17:16:32
    眼下java应用日志收集都是採用日志框架(slf4j、apachecommonslogging)+日志系统(log4j、log4j2、LogBack、JUL等)的方式。日志框架:提供日志调用的接口,实际的日志输出托付给日志系统实现。JCL...
  • Java常用日志框架介绍

    2021-08-25 02:35:09
    Java常用日志框架介绍 文章目录Java常用日志框架介绍日志接口和日志框架的区别各个框架出现的时间线桥接包Log4j2常用搭配单独的log4j使用JCL(commons-logging)接口的JUL使用JCL(commons-logging)接口的log4j使用slf4...
  • 文章目录前言一、关于日志的理解1、什么是日志2、为什么需要日志二、日志门面1、什么是日志门面2、为什么需要日志门面3、常见的日志门面三、Java日志框架1、为什么要用日志框架2、常见的日志实现框架四、SpringBoot...
  • 主要介绍了Java日志框架之logback使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟...本文要来分享一些Java程序员最常用Java日志框架组件。1、Log4j – 最受欢迎的Java日志组件Log4j...
  • Java常用日志框架介绍(转载)

    千次阅读 2018-08-07 18:17:34
    原文地址 总结的比较详细转载一下 (侵删 请告知) ...java领域存在多种日志框架,目前常用日志框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul。 java常用日志框架类别介绍 Log4j Apache Lo...
  • java领域存在多种日志框架,目前常用日志框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul。 常用日志框架类别介绍 Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创...
  • 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结一下,logback大约有以下的一些优点:内核...
  • java日志框架

    2015-12-06 21:30:57
    log4j和logback的helloworld以及与spring等的整合使用
  • Java 日志框架详解

    千次阅读 2021-12-23 21:29:22
    Java 日志框架详解,JUL,jcl、log4j、slf4j、logback、log4j2
  • Java常用日志框架及实现

    千次阅读 2015-12-16 09:32:53
    Java常用日志框架及实现 作者:雨水,日期:2015-12-16,CSDN博客: http://blog.csdn.net/gobitan 概述 本文简单介绍了一下Java日志框架,包括接口库和实现库,并在具体使用选择上给出了一些建议。 日志...
  • java常用日志框架介绍

    2018-06-13 11:46:27
    转载自:java常用日志框架介绍 java日志概述 对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析等都离不日志。java领域存在多种日志框架,目前常用日志框架包括Log4...
  • 绍一种Java日志系统框架的设计与实现
  • Java日志框架详解.ppt

    2022-06-08 11:42:55
    Java日志框架详解.ppt

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,124
精华内容 111,249
关键字:

java常用的日志框架

java 订阅