zoukankan      html  css  js  c++  java
  • SpringBoot与日志

    一、日志框架

    ​ 1、市面上的日志框架:JULJCL(Apache 基金会的)、Jboss-logginglogbacklog4jlog4j2slf4j....

    日志门面(日志抽象层) 日志实现
    JCLJakarta Commons Logging-属于Apache基金会) jboss-logging JULjava.util.logging-Java JDK自带的)
    SLF4jSimple Logging Facade for Java Log4jLog4j2Logback

    ​ 2、其中 SLF4jLog4jLogback 出自同一人之手,LogbackLog4j 的升级版;而 Log4j2 只是借用了 Log4j 的名号而已

    ​ 3、SpringBoot 底层是 Spring 框架,而 Spring 框架默认是用 JCL,但是 SpringBoot 选用的是 SLF4jlogback,所以SpringBoot 的日志框架重点是学习使用 SLF4jlogback

    ​ 4、所以为了开发日志系统扩展性更好的应用,就得从上表中左右两边各选择一个进行日志接口和实现进行开发,而且编码的时候应该调用左边的接口,而不是右边的实现,这样利于将来扩展。

    二、SLF4J的使用

    1.使用log4作为实现的demo

    <!--日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    
    <!--log4j需要slf4j-log4j12进行适配,slf4j-log4j12同时依赖了log4j,导入slf4j-log4j12即可-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    

    log4j.properties

    #指定输出信息的级别--以及输出的位置
    log4j.rootLogger=DEBUG,console,logFile
    #表示Logger不会在父Logger的appender里输出,默认为true
    log4j.additivity.org.apache=true
    
    #控制台
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.ImmediateFlush=true
    log4j.appender.console.Target=System.err
    log4j.appender.console.layout.ConversionPattern=%5p [%t] (%c:%L) %d{yyyy-MM-dd HH:mm:ss,SSS} ---- %m%n
    
    #日志文件
    log4j.appender.logFile=org.apache.log4j.FileAppender
    log4j.appender.logFile.Threshold=DEBUG
    log4j.appender.logFile.ImmediateFlush=true
    log4j.appender.logFile.Append=true
    log4j.appender.logFile.File=D:/logs/log.txt
    log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    
    package com.hucheng.log.log4j;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author HuCheng
     */
    public class Test {
        public static void main(String[] args) {
            Logger logger = LoggerFactory.getLogger(Test.class);
            logger.info("Hello Slf4j/Log4j");
            logger.error("error print");
        }
    }
    

    开发时,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层的方法。每一个日志的实现框架都有自己的配置文件,使用slf4j时,需要使用日志实现框架的配置文件。

    2.slf4j与实现框架图总览

    图中,可以看出:

    ​ 如果只导入了slf4j-api.jar日志门面,则调用日志记录的方法无效。

    ​ 如果导入slf4j-api.jar和日志实现logback-classic.jar,则调用slf4j之后底层会以logback进行记录。

    ​ 如果导入slf4j-api.jar和日志实现log4j.jar,中间还需要导入一个适配包slf4j-log412.jar,所以当应用中调用SLF4J记录日志的时候,会先经过适配包,最后调用实现包。

    ​ 第4个是jullog4j相似,同样需要适配包......

    3.统一日志记录

    如何将系统中的所有日志都统一到slf4j?

    1、将系统中其他日志框架先排除出去;

    2、用中间包来替换原有的日志框架;

    3、我们导入slf4j其他的实现;

    三、SpringBoot日志关系

    ​ 通过分析spring-boot-starter的底层依赖关系,可以看出springboot通过依赖spring-boot-starter-logging来做日志。SpringBoot底层是通过slf4j+logback的方式进行日志记录,同时将其他的日志都替换成了slf4j

    ​ 如何替换呢?

    创建的LogFactory实际上是用SLF4JLogFactory的实例

    @SuppressWarnings("rawtypes")
    public abstract class LogFactory {
    
        static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
    
        static LogFactory logFactory = new SLF4JLogFactory();
    

    SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。

    ​ 比如Spring框架使用的是commons-loggingspringboot底层使用spring框架需要排除掉commons-logging

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    四、SpringBoot中日志的使用

    1.默认配置

    ​ SpringBoot默认配置好了日志

        //日志记录器
        Logger logger = LoggerFactory.getLogger(getClass());
    
        @Test
        public void contextLoads() {
            //日志的级别;
            //由低到高   trace<debug<info<warn<error
            //可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
            logger.trace("这是trace日志...");
            logger.debug("这是debug日志...");
            //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别
            logger.info("这是info日志...");
            logger.warn("这是warn日志...");
            logger.error("这是error日志...");
        }
    

    输出:

    2019-11-04 16:35:43.636  INFO 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是info日志...
    2019-11-04 16:35:43.636  WARN 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是warn日志...
    2019-11-04 16:35:43.637 ERROR 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是error日志...
    

    日志输出格式:

    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
    
    注:
    	%d表示日期时间,
        %thread表示线程名,
        %-5level:级别从左显示5个字符宽度
        %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
        %msg:日志消息,
        %n是换行符
    

    springboot修改日志的默认配置

    # 修改日志的级别,默认级别为info
    logging.level.com.atguigu=trace
    
    # 指定完整的路径
    #logging.file=G:/springboot.log
    
    # 仅指定路径,使用 spring.log 作为默认文件
    logging.path=/spring/log
    
    # 在控制台输出的日志的格式
    logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
    # 指定文件中日志输出的格式
    logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
    

    ​ 当配置文件中logging.filelogging.path存在或不存在时(推荐仅使用logging.path):

    logging.file logging.path Description
    只在控制台输出
    输出日志到指定文件中
    输出到指定目录的 spring.log 文件中
    相当于logging.file仅存的情况

    2.指定配置

    ​ 给类路径下放上每个日志框架自己的配置文件即可,就会替代SpringBoot的默认配置,以下是各日志实现的配置文件默认文件名:

    日志实现 文件名
    Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
    Log4j2 log4j2-spring.xml or log4j2.xml
    JUL logging.properties

    SpringBoot官方建议使用logback-spring.xml,具体的配置参考logback-spring.xml文件

    ​ 当使用logback.xml,应用启动时会被日志框架logback识别而使用,不经过SpringBoot,如果需要使用SpringBootProfile高级功能即文档块功能则就需要使用logback-spring.xml

    profile需新增配置:

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>
    

    五、切换日志框架

    ​ 使用slf4j+log4j的方式

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    	<exclusions>
    		<exclusion>
    			<artifactId>logback-classic</artifactId>
    			<groupId>ch.qos.logback</groupId>
    		</exclusion>
    		<exclusion>
    			<artifactId>log4j-over-slf4j</artifactId>
    			<groupId>org.slf4j</groupId>
    		</exclusion>
    	</exclusions>
    </dependency>
    
    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-log4j12</artifactId>
    </dependency>
    

    ​ 使用slf4j+log4j2的方式

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>spring-boot-starter-logging</artifactId>
                <groupId>org.springframework.boot</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    
  • 相关阅读:
    Asp.net2.0 中自定义过滤器对Response内容进行处理 dodo
    自动化测试工具 dodo
    TestDriven.NET 2.0——单元测试的好助手(转) dodo
    JS弹出窗口的运用与技巧 dodo
    ElasticSearch 简介 规格严格
    修改PostgreSQL字段长度导致cached plan must not change result type错误 规格严格
    Linux系统更改时区(转) 规格严格
    mvn编译“Cannot find matching toolchain definitions for the following toolchain types“报错解决方法 规格严格
    ElasticSearch 集群 & 数据备份 & 优化 规格严格
    Elasticsearch黑鸟教程22:索引模板的详细介绍 规格严格
  • 原文地址:https://www.cnblogs.com/hucheng1997/p/11792333.html
Copyright © 2011-2022 走看看