zoukankan      html  css  js  c++  java
  • springboot整合日志

    明白几个东西:

    1.logging是jdk原生日志框架(一般不用)

    2.log4j是Apache开源的日志框架,现在已经停了维护,但绝大数企业还是用的它

    3.logback是log4j的一种该进

    4.log4j2是重新完完整整被写的一个新的

    一、springboot配置log4j2日志:

    1.pom.xml文件 

    <!--排除自身依赖-->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <!--    这个就是将含有spring-boot-starter开头的依赖的默认配置全排除掉,以后就用这个就不用去web下,
        或其他那里再加这段       -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency> <!-- 引入log4j2依赖 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    2.在resource下建立 log4j2.xml

    代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="INFO" monitorInterval="1800">
    <properties>
    <property name="LOG_HOME">/home/WorkStatLog</property><!-- D://WorkStatLog-Test /home/WorkStatLog-->
    </properties>
    <appenders>
    <Console name="consolePrint" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8" />
    </Console>
    <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定(false为自动清除),这个也挺有用的,适合临时测试用-->
    <File name="log" fileName="${LOG_HOME}/workStat.log" append="false"
    filePattern="${LOG_HOME}/workStat-%d{yyyy-MM-dd}.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n" charset="UTF-8" />
    </File>

    <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
    <RollingFile name="RollingFiles" fileName="logs/workStatapp.log"
    filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/workStatapp-%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" charset="UTF-8" />
    <SizeBasedTriggeringPolicy size="20MB"/>
    </RollingFile>
    <!-- 每天产生一个日志文件 此路径最多产生20个,超过新的会覆盖旧的 -->
    <!-- <RollingRandomAccessFile > filepattern 中的日期格式精确位数决定了生成日志的日期单位,
    <TimeBasedTriggeringPolicy> interval 决定该单位下的间隔数,如果在上面例子中 interval 设置为 5,那么就是5天生成一个日志;
    <DefaultRolloverStrategy max="20"/> 用于设置符合同个filePath的日志文件的最大数量 ,默认为7 -->

    <RollingRandomAccessFile name="RollingFile" fileName="${LOG_HOME}/workStatApp.log"
    filePattern="${LOG_HOME}/workStatApp-%d{yyyy-MM-dd}.log"> 
                   
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8" />            
    <Policies>                     
    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>                
    </Policies>               
    <DefaultRolloverStrategy max="30"/>
          
    </RollingRandomAccessFile>
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
    <logger name="com.lhy.workstat.*" level="trace" additivity="false">
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFiles"/>
    <appender-ref ref="log"/>
    <appender-ref ref="consolePrint"/>
    </logger>
    <!--建立一个默认的root的logger-->
    <root level="info">
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFiles"/>
    <appender-ref ref="log"/>
    <appender-ref ref="consolePrint"/>
    </root>
    </loggers>
    </Configuration>

    启动结果:

     二、sprinboot配置log4j2框架(也是一种参考)

     1.pom.xml

    <!--排除自身依赖-->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <!--    这个就是将含有spring-boot-starter开头的依赖的默认配置全排除掉,以后就用这个就不用去web下,
        或其他那里再加这段       -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency> <!-- 引入log4j2依赖 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    2.代码:

    建立log4j2.xml:主要注意下面路径看在E:/下生产成log文件夹,包括三个文件

      <?xml version="1.0" encoding="UTF-8"?>
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
    <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <configuration status="WARN" monitorInterval="30">
        <properties>
            <!--<property name="FILE_PATH" value="更换为你的日志路径" />
            <property name="FILE_NAME" value="更换为你的项目名" /-->
            <property name="LOG_HOME">E:/</property>
        </properties>
        <!--先定义所有的appender-->
        <appenders>
            <!--这个输出控制台的配置-->
            <console name="Console" target="SYSTEM_OUT">
                <!--输出日志的格式-->
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
            </console>
            <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
            <File name="log" fileName="log/test.log" append="false">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n"/>
            </File>
            <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
            <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/logs/info.log"
                         filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
            </RollingFile>
            <RollingFile name="RollingFileWarn" fileName="${LOG_HOME}/logs/warn.log"
                         filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
                <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
            <RollingFile name="RollingFileError" fileName="${LOG_HOME}/logs/error.log"
                         filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
            </RollingFile>
        </appenders>
        <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
        <loggers>
            <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
            <logger name="org.springframework" level="INFO"></logger>
            <logger name="org.mybatis" level="INFO"></logger>
            <root level="all">
                <appender-ref ref="Console"/>
                <appender-ref ref="log"/>
                <appender-ref ref="RollingFileInfo"/>
                <appender-ref ref="RollingFileWarn"/>
                <appender-ref ref="RollingFileError"/>
            </root>
        </loggers>
    </configuration>

    在yml配置:

    logging:
      config: classpath:log4j2.xml

    结果:

    三、springboot配置logback

    springBoot集成了logBack日志框架,不需要去添加依赖,如果是被排除了,可以添加如下依赖试试。

    1.pom.xml<!--https://mvnrepository.com/artifact/log4j/log4j--><!--应该是logback的依赖--><!--<dependency>-->

        <!--<groupId>log4j</groupId>-->
    <!--<artifactId>log4j</artifactId>-->
    <!--<version>1.2.17</version>-->
    <!--</dependency>-->

    logBack包含三个模块:logback-core,logback-classic和logback-access。logback-core是核心模块,其它两个模块基础
    logback-classic是log4j的一个
    改良版本,并且完整实现了SLF4J api。logback-access是提供和web容器访问的日志功能。

    故我们在springboot中代码中直接使用slf4j的接口来进行日志打印,没有引用任何logback的代码,就完成了logback的调用,
    我们只需要使用如下形式即可。
    1、用lombok插件,只要在类上用一个@slf4j注解既可使用log变量来打印,如果log变量不能用,idea中去加入插件。导入为
    import lombok.extern.slf4j.Slf4j;
    2、自己在类中定义:private final Logger logger = LoggerFactory.getLogger(类名.class);
    导入为:
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    这样就可以用logger变量来打印。


    logback配置简单介绍
    i1、配置中重要三要素: Logger、appender、layout
    Logger:日志的记录器,通过LogContext进行管理,存放Logger对象。
    appender:日志输出目的地,控制台,文件,数据库。
    layout:日志输出的格式。
     i2、日志级别
      经常用的:error>warn>info>debug>trace

    2.logback配置需求:
    需求:分别在controller包和service包的日志,分别输出到两个日志文件下,其他输出到另一个日志文件(root下)

    明白property标签,appender标签,logger标签,root标签和其中一些属性的意思。

    3.配置代码:
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <jmxConfigurator/>

    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <!-- property都是设置参数,给后面用,如${LOG_PATH} el表达式使用} -->
    <!--保存日志的文件目录位置,这里相对在项目路径,项目发布肯定要改位置-->
    <property name="LOG_PATH" value="log"/>

    <!--打印到日志文件的日期格式-->
    <property name="FILE_LOG_PATTERN"
    value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} --- [%15.15t] %-40.40logger{39} : %m%n"
    />
    <!--打印到控制台的日期格式-->
    <property name="CONSOLE_LOG_PATTERN"
    value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) {faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"
    />

    <!-- 日志输出到文件 appender设置日志的输出目的地,有console,文件,数据库,是哪种看class -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!--日志文件输出的文件名,看到这里/就是代表每级别目录-->
    <fileNamePattern>${LOG_PATH:-}/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <!-- 每个日志文件的大小 -->
    <maxFileSize>100MB</maxFileSize>
    <!-- 保留多少天的日志 -->
    <MaxHistory>30</MaxHistory>
    <!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
    <maxFileSize>2GB</maxFileSize>
    </rollingPolicy>
    <encoder>
    <!--日志文件里的格式-->
    <pattern>${FILE_LOG_PATTERN}</pattern>
    <charset>utf8</charset>
    </encoder>
    </appender>

    <!--controller日志的位置-->
    <appender name="CONTROLLER-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>
    ${LOG_PATH:-}/%d{yyyy-MM-dd}/controller/%d{yyyy-MM-dd}-controller.%i.log
    </fileNamePattern>
    <!-- 每个日志文件的大小 -->
    <maxFileSize>100MB</maxFileSize>
    <!-- 保留多少天的日志 -->
    <MaxHistory>30</MaxHistory>
    <!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
    <maxFileSize>2GB</maxFileSize>
    </rollingPolicy>
    <encoder>
    <pattern>${FILE_LOG_PATTERN}</pattern>
    <charset>utf8</charset>
    </encoder>
    </appender>


    <!--service日志-->
    <appender name="SERVICE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>
    ${LOG_PATH:-}/%d{yyyy-MM-dd}/service/%d{yyyy-MM-dd}-service.%i.log
    </fileNamePattern>
    <!-- 每个日志文件的大小 -->
    <maxFileSize>100MB</maxFileSize>
    <!-- 保留多少天的日志 -->
    <MaxHistory>30</MaxHistory>
    <!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
    <maxFileSize>2GB</maxFileSize>
    </rollingPolicy>
    <encoder>
    <pattern>${FILE_LOG_PATTERN}</pattern>
    <charset>utf8</charset>
    </encoder>
    </appender>

    <!--控制台打印的日志配置-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </encoder>
    </appender>

    <!---->

    <!--
    logger标签和root标签
    logger标签(非必须项,看自己项目需要,要不要给某个类专门打印不一样的日志):
    作用:给不同的包,类使用不同的配置,意思是只打印该包下或者该类下的日志到指定的文件
    name:指定不同的包或者类,
    appender-ref:输出到指定的文件
    additivity: false表示不继承 不写默认为true ,继承的话就会使用根root来输出,就会重复输出。
    level :表示日志级别
    因为你自己定义了一个输出,继承了根,根也输出,就重复了。
    root标签(必须项,如果不配置,啥也不打印)
    当配置了logger时,如果运行到了该包或者该类中,则会使用logger中指定地方输出日志,而不会传递给上级root,也就是
    该类日志输出到指定地方,而不会输出到root指定的地方,因为设置了additivity为false。如果为true,则都会输出。
    需求:分别在controller包和service包的日志,分别输出到两个日志文件下,其他输出到另一个日志文件(root下)
    -->
    <!--controller包-->
    <logger level="info" name="com.yiyezhiqiu.redis_study01.controller" additivity="false">
    <appender-ref ref="CONTROLLER-APPENDER"/>
    <appender-ref ref="CONSOLE"/>
    </logger>

    <!-- service包 -->
    <logger level="info" name="com.yiyezhiqiu.redis_study01.service" additivity="false">
    <appender-ref ref="SERVICE-APPENDER"/>
    <appender-ref ref="CONSOLE"/>
    </logger>


    <!--这些可能是为mybatis定制,但感觉意义不大,删除都没关系-->
    <!--
    <logger name="druid.sql.Statement" level="INFO" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </logger>
    <logger name="java.sql.PreparedStatement" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </logger>
    <logger name="com.zjrc" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </logger>
    <logger name="org.springframework" level="INFO" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </logger>
    <logger name="org.springframework.cloud.sleuth.instrument.web.client.feign" level="INFO" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </logger>
    -->

    <!--
    这里设置级别则会打印出该包括该级别以上的日志,log.info,log,warn,log.error都可以输出
    但log.trace,log.debug不会输出。
    而且这个必须要,不然就不会在控制台打印和输出任何日志。
    -->
    <root level="info" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    </root>


    </configuration>
    结果:
















    以前单个文件的代码:(可以废掉)

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="d:/logback" />
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Prudent>true</Prudent>//这行后面加的
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

    <!--日志文件输出的文件名-->
    <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
    <!--日志文件保留天数-->
    <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
    <!--日志文件最大的大小-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <MaxFileSize>100MB</MaxFileSize>
    </triggeringPolicy>
    </appender>
    <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!-- 日志输出级别 -->
    <root level="INFO">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
    </root>
    <!--日志异步到数据库 -->
    <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">-->
    <!--&lt;!&ndash;日志异步到数据库 &ndash;&gt;-->
    <!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
    <!--&lt;!&ndash;连接池 &ndash;&gt;-->
    <!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
    <!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
    <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->
    <!--<user>root</user>-->
    <!--<password>root</password>-->
    <!--</dataSource>-->
    <!--</connectionSource>-->
    <!--</appender>-->
    </configuration>
    结果:


  • 相关阅读:
    UIKit框架-高级控件Swift版本: 5.UITextView方法/属性详解
    UIKit框架-高级控件Swift版本: 3.UITableViewCell方法/属性详解
    UIKit框架-高级控件Swift版本: 2.UITableView方法/属性详解
    UIKit框架-高级控件Swift版本: 4.UICollectionView方法/属性详解
    UIKit框架-高级控件Swift版本: 1.UIScrollView方法/属性详解
    UIKit框架-基础控件Swift版本: 6.UITextField方法/属性详解
    UIKit框架-基础控件Swift版本: 5.UIImage方法/属性详解
    UIKit框架-基础控件Swift版本: 4.UIImageView方法/属性详解
    UIKit框架-基础控件Swift版本: 3.UILabel方法/属性详解
    UIKit框架-基础控件Swift版本: 2.UIButton方法/属性详解
  • 原文地址:https://www.cnblogs.com/yiyezhiqiuwuchen/p/12177166.html
Copyright © 2011-2022 走看看