springBoot日志篇

使用logback.xml进行配置(位置在项目resource下):

1、xml文件整体架构:

<?xml version="1.0" encoding="UTF-8"?>
<configuration >
<contextName></contextName>
<property name="" value="" />
<appender ></appender>
<root > </root>
<logger />
</configuration>

2、详解:

<configuration >:参数

1、scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true                           2、 canPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫                       秒。当scan为true时,此属性生效。默认的时间间隔为1分钟

3、debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默                   认值为false

<configuration  scan="true" scanPeriod="60 seconds" debug="false">

  <contextName>:每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。

<contextName>spring-boot-logging</contextName>

  <property name="" value="" /> :用来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量

<property name="log.path" value="d:/log" />

 <appender ></appender>:appender:用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

                    append属性:

name:该append的名字,在后面使用ref来匹配。(一般使用console或file,简单明了)

class: 用来指定哪种输出策略。一般有3种

1、控制台:class="ch.qos.logback.core.ConsoleAppender"

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <!-- 级别过滤 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>               

filter是一个过滤器,表示对输出到控制台的日记进行过滤。有两种过滤器,分别为LevelFilter 和ThresholdFilter。执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再                   经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。

LevelFilter 为级别过滤器,根据日志级别进行过滤。其下有三个子节点,level表示过滤的级别,用于配置符合过滤条件的操作,ACCEPT符合级别的输出到控制台,用于配置不符合过滤条件的操作,DENY不符合的拒绝输出到控制台。
             ThresholdFilter为临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
           表示对日志进行格式化
            %d{HH:mm:ss.SSS} :日志的输出时间
            %contextName : 上下文名称
            %thread : 输出日志的进程名字,这在Web应用以及异步任务处理中很有用
           %-5level : 日志级别,并且使用5个字符靠左对齐
           %logger{36} : 日志输出者的名字(一般为类名),名字最长36个字符,否则按照句点分割
          %msg : 具体的日志消息
          %n :换行符

  

2、文件:class="ch.qos.logback.core.FileAppender"

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${log.path}/spring-boot-logging.log</file>
    <append>true</append>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
</configuration>

3、按照固定切分比如每天生成一个日志文件class="ch.qos.logback.core.rolling.RollingFileAppender"

<!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/spring-boot-logging.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/spring-boot-logging.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <!-- 日志保存周期 -->
            <maxHistory>30</maxHistory>
            <!-- 总大小 -->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志。
其中file属性定义文件的带全路径的文件名,重要的是rollingPolicy的定义。
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"是最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动
<fileNamePattern>${log.path}/spring-boot-logging.%d{yyyy-MMdd}.log.zip</fileNamePattern>定义了日志的切分方式——把每一天的日志归档到一个文件中,同理,可以使用%d{yyyy-MM-dd HH-mm}来定义精确到分的日志切分方式。
<maxHistory>30</maxHistory>表示只保留最近30天的日志
<totalSizeCap>1GB</totalSizeCap>用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志

子节点loger
<loger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
name:用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。
<loger> 的实际使用有两种情况
第一种是不指定level,不指定appender
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<logger name="com.baiding.logging.SpringBootLoggingApplicationTests"/>
这时候的处理流程是:当SpringBootLoggingApplicationTests执行日志方法时,首先交给
<logger name="com.baiding.logging.SpringBootLoggingApplicationTests"/>
处理(继承上级的level–info),将级别大于等于info的日志交给root,本身没有打印任何日志

第二种是指定了level,指定了appender
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- java中的包 -->
<logger name="com.baiding" level="warn" addtivity="false">
<appender-ref ref="console" />
</logger>
此logger指定了level为warn,addtivity为false,不在向上级传递打印信息,若设置了<appender-ref>属性,但没有设置addtivity为false,则com.baiding包下的日志会先在名为console的appender记录一次,之后传递给上级,root又会在名为console和file的appender记录一次,这样就打印了两次了。

SpringBoot在使用logback记录日志时,推荐使用logback-spring.xml的格式,这样的话,日志框架就不直接加载日志的配置项,而是由SpringBoot解析日志配置,就可以使用SpringBoot 的高级Profile功能

如下logback-spring.xml

<springProfile name="dev">
<logger name="com.baiding" level="info"/>
</springProfile>

<springProfile name="prod">
<logger name="com.baiding" level="warn"/>
</springProfile>

可以在不同的节点中使用springProfile功能,用于指定某段配置只在某个环境下生效 。当然使用前,要激活profile。
三、切换Log4j2框架
Spring Boot虽然默认使用Logback日志框架,但其内部也集成了Log4j2框架。要知道的是,在Java中,Log4j2框架的性能是最强的,所以我们一般在程序中使用Log4j2框架。下面介绍一下Log4j2的使用及其内部属性的含义。
首先,要在Spring Boot使用Log4j2的话,那么第一件事就是去除Logback的jar包,并引入Log4j2的jar。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
上面就是在依赖Web模块的时候去除引用spring-boot-starter-logging.jar,之后依赖spring-boot-starter-log4j2.jar包。

之后在类路径下新建一个log4j2.xml,其具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">

<Properties>
<Property name="log.path">log</Property>
</Properties>

<!--先定义所有的appender-->
<appenders>

<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>

<File name="log" fileName="${log.path}/test.log" append="false">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</File>

<RollingFile name="RollingFileInfo" fileName="${log.path}/info.log"

filePattern="${log.path}/logs/${date:yyyy-MM}/info-%d{yyyy-MM-dd}.log.zip">

<!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>

</RollingFile>
</appenders>

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

<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<logger name="com.baiding" level="INFO"/>

<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>

</loggers>

</configuration>

1. 根节点属性
根节点Configuration有两个属性,status和monitorinterval

status : status用来指定log4j2本身的日志的级别
monitorinterval : monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
####2. Properties 标签

在xml文件中,可以使用Properties 标签来自定义变量,方便其他地方的引用。

<Properties>
<Property name="log.path">log</Property>
</Properties>

这里的log.path是定义日志存放的地方,此处是存放于项目根路径下的log文件夹中
3.Appenders 节点
和logback一样,Appender是用来定义日志输出点的,一般常用有三个子节点,分别为Console、RollingFile、File。下面介绍一下各个子节点的用处及常用的属性
Console节点用来定义输出到控制台的Appender:
name : 指定Appender的名字,用于Logger节点引用
target : SYSTEM_OUT 或 SYSTEM_ERR,一般设置为:SYSTEM_OUT
PatternLayout : 指定日志输出格式,默认为%m%n
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>

File节点用来定义输出到指定位置的文件的Appender:
name : 指定Appender的名字,用于Logger节点引用
fileName : 指定输出日志的目的文件带全路径的文件名
append : 是否追加,默认为ture。ture是将新日志追加到原日志文件尾部,false则是删除已有文件,重建新文件
PatternLayout : 指定日志输出格式,默认为%m%n
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</File>

RollingFile节点用来定义输出到指定位置的文件的Appender,但其记录的内容可拆分:
File对文件的约束很简单,而RollingFile则比较灵活,其可根据文件大小来分拆,还可以根据时间来分拆
name : 指定Appender的名字,用于Logger节点引用
fileName : 指定输出日志的目的文件带全路径的文件名
filePattern:指定拆分出去的日志文件的全路径的文件名以及格式
PatternLayout : 指定日志输出格式,默认为%m%n
Policies : 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy : 基于时间进行日志的滚动
SizeBasedTriggeringPolicy : 基于文件大小进行日志的滚动
ThresholdFilter : 日志过滤器
<RollingFile name="RollingFileInfo" fileName="${log.path}/info.log"
filePattern="${log.path}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.zip">

<!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>

</RollingFile>

这里说一下TimeBasedTriggeringPolicy这个滚动策略的属性interval,它是指日志进行滚动的间隔,那么它的单位具体是什么呢?关键点在于filePattern的日志文件名所含有的日期格式%d{yyyy-MM-dd},这里日期格式具体到了天,那么以天为单位,若是日期具体到%d{yyyy-MM-dd-HH-mm}分钟的话,那么就是以分钟为单位。

这里还提到了日志过滤器,Log4j提供了许多的日志过滤器,具体可以看下文档 Filters。但我们一般采用ThresholdFilter,这个过滤器一般用来过滤掉所有级别低于它定义的级别的日志。

4.Loggers节点
Loggers节点下一般有root和logger节点.

root节点用来指定项目的根日志,如果没有单独指定logger,那么就会默认使用该root日志输出。

level :日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
appender-ref :root的子节点,用来指定该日志输出到哪个Appender
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>

Logger节点用来单独指定日志的形式,比如要为某个包下所有的class或者某个具体的class指定不同的日志级别等。

level : 日志输出级别
name : 用来指定该Logger所适用的类或者包.
AppenderRef :Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root
additivity :是否向上级传递日志 true(默认)或false
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<logger name="com.baiding" level="INFO"/>

若我们为logger指定了AppenderRef ,别忘了将logger的additivity 属性设置为false,要不然日志可能会在指定的Appender中输出两遍
四、Log4j2异步输出日志
Log4j2有个突出的功能就是支持高效低延迟的异步化写日志。日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响。
日志的异步输出使用了disruptor这个开源的并发框架,所以首先得导入disruptor.jar包
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>

异步输出分为两种情况,一种为全异步模式,一种为异步和非异步混合输出模式。通过官方的性能对比,一般线程数在2-16之间的话,混合使用同步和异步的logger来打印日志,性能是最好的。

异步和非异步混合模式
这种模式的启用,主要在于两个节点的使用,分别为AsyncRoot和AsyncLogger,这两个节点可以和Root 或 Logger节点混合使用。
在这里修改一下上述的log4j2.xml文件中Loggers节点就可以了。
<loggers>
<AsyncRoot level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</AsyncRoot>
<AsyncLogger name="com.baiding" level="INFO" />
<AsyncLogger name="org.mybatis" level="INFO" />
<AsyncLogger name="org.springframework" level="INFO" />
</loggers>

下面是文正的xml代码及注释说明:

?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_NAME" value="/home"></property>
    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>1-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
            <charset>GBK</charset>
        </encoder>
    </appender>
    <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
    <contextName>RestAPI</contextName>
    <property name="LOG_PATH" value=".logs"/>
    <!--设置系统日志目录-->
    <property name="APPDIR" value="app"/>
    <!--
          说明:
          1、日志级别及文件
              日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中
              例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,
              日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名
              例如log-level-2013-12-21.0.log
              其它级别的日志也是如此。
          2、文件路径
              若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。
              若部署到Tomcat下,则在Tomcat下的logs文件中
          3、Appender
              FILEERROR对应error级别,文件名以log-error-xxx.log形式命名
              FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名
              FILEINFO对应info级别,文件名以log-info-xxx.log形式命名
              FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名
              CONSOLE将日志信息输出到控制上,为方便开发测试使用
       -->
    <!-- 日志记录器,日期滚动记录 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--压缩日志文件 -->
            <!--<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.log.zip</fileNamePattern>-->
            <!--日志文件保留天数30天 -->
            <maxHistory>30</maxHistory>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日志记录器,日期滚动记录 -->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日志记录器,日期滚动记录 -->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--日志异步到数据库  -->
    <!--<appender name="DBAPPENDER" class="ch.qos.logback.classic.db.DBAppender">-->
    <!--<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">-->
    <!--<dataSource class="com.zaxxer.hikari.HikariDataSource">-->
    <!--<driverClassName>com.mysql.jdbc.Driver</driverClassName>-->
    <!--<jdbcUrl>jdbc:mysql://localhost:3306/albedo-new?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</jdbcUrl>-->
    <!--<username>root</username>-->
    <!--<password>123456</password>-->
    <!--<poolName>HikariPool-logback</poolName>-->
    <!--</dataSource>-->
    <!--</connectionSource>-->
    <!--&lt;!&ndash; 此日志文件只记录info级别的 &ndash;&gt;-->
    <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
    <!--<level>warn</level>-->
    <!--<onMatch>ACCEPT</onMatch>-->
    <!--<onMismatch>DENY</onMismatch>-->
    <!--</filter>-->
    <!--&lt;!&ndash; 此日志文件只记录info级别的 &ndash;&gt;-->
    <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
    <!--<level>error</level>-->
    <!--<onMatch>ACCEPT</onMatch>-->
    <!--<onMismatch>DENY</onMismatch>-->
    <!--</filter>-->
    <!--</appender>-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <!--<charset>GBK</charset>-->
        </encoder>
    </appender>
    <logger name="com.minlia" level="DEBUG"/>
    <logger name="org.springframework.data.mybatis" level="DEBUG"/>
    <logger name="org.springframework.aop.aspectj" level="ERROR"/>

    <logger name="javax.activation" level="WARN"/>
    <logger name="javax.mail" level="WARN"/>
    <logger name="javax.xml.bind" level="WARN"/>
    <logger name="ch.qos.logback" level="INFO"/>
    <logger name="com.codahale.metrics" level="WARN"/>
    <logger name="com.ryantenney" level="WARN"/>
    <logger name="com.sun" level="WARN"/>
    <logger name="com.zaxxer" level="WARN"/>
    <logger name="io.undertow" level="WARN"/>
    <logger name="net.sf.ehcache" level="WARN"/>
    <logger name="org.apache" level="WARN"/>
    <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
    <logger name="org.bson" level="WARN"/>
    <logger name="org.hibernate.validator" level="WARN"/>
    <logger name="org.hibernate" level="WARN"/>
    <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
    <logger name="org.springframework.web" level="INFO"/>
    <logger name="org.springframework.security" level="WARN"/>
    <logger name="org.springframework.cache" level="WARN"/>
    <logger name="org.thymeleaf" level="WARN"/>
    <logger name="org.xnio" level="WARN"/>
    <logger name="springfox" level="WARN"/>
    <logger name="sun.rmi" level="WARN"/>
    <logger name="liquibase" level="WARN"/>
    <logger name="sun.rmi.transport" level="WARN"/>

    <logger name="jdbc.connection" level="ERROR"/>
    <logger name="jdbc.resultset" level="ERROR"/>
    <logger name="jdbc.resultsettable" level="INFO"/>
    <logger name="jdbc.audit" level="ERROR"/>
    <logger name="jdbc.sqltiming" level="ERROR"/>
    <logger name="jdbc.sqlonly" level="INFO"/>

    <!--<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">-->
    <!--<resetJUL>true</resetJUL>-->
    <!--</contextListener>-->

    <springProfile name="production">
        <root level="DEBUG">
            <!--<appender-ref ref="FILEERROR"/>-->
            <!--<appender-ref ref="FILEWARN"/>-->
            <!--<appender-ref ref="FILEINFO"/>-->
            <!--<appender-ref ref="DBAPPENDER"/>-->
            <appender-ref ref="STDOUT"/>

        </root>
    </springProfile>

    <springProfile name="dev">
        <root level="DEBUG">
            <!--<appender-ref ref="FILEERROR"/>-->
            <!--<appender-ref ref="FILEWARN"/>-->
            <!--<appender-ref ref="FILEINFO"/>-->
            <!--<appender-ref ref="DBAPPENDER"/>-->
            <appender-ref ref="CONSOLE"/>

        </root>
    </springProfile>

</configuration>
                                                              


原文地址:https://www.cnblogs.com/swfzzz/p/11721029.html

时间: 2024-10-01 12:46:18

springBoot日志篇的相关文章

JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

Spring Boot 日志篇 1.日志框架(故事引入) 小张:开发一个大型系统: ? 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? ? 2.框架来记录系统的一些运行时信息:日志框架 : zhanglogging.jar: ? 3.高大上的几个功能?异步模式?自动归档?xxxx? zhanglogging-good.jar? ? 4.将以前框架卸下来?换上新的框架,重新修改之前相关的API:zhanglogging-prefect.ja

springboot 日志2

SpringBoot关于日志的官方文档 1.简述 SpringBoot官方文档关于日志的整体说明 本博客基于SpringBoot_1.3.6大家请先简单看下这篇英文的官方文档,文中有说 SpringBoot 内部日志系统使用的是 Commons Logging 并且 SpringBoot 给 JDKLogging , Log4j2(Log4j也是支持的) , Logback 都提供了默认配置,并且如果使用了 Starters ,那么默认使用 Logback .那么什么是这个这个 Starters

(二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf模板引擎,可以使用模板引擎进行渲染处理,默认版本为2.1,可以重新定义Thymeleaf的版本号,在maven的配置文件中配置如下内容: <properties> <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> &l

SpringBoot 日志配置

SpringBoot 日志的配置 如果不配置日志,默认配置是 base.xml 配置日志 在 resource 目录下新建 logback.xml <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="

Springboot 日志管理配置logback-spring.xml

几种常见的日志 Log4j:是最早的日志框架,是apach旗下的,可以单独使用,也可配合日志框架JCL使用: Log4j2:apach旗下的关于log4j的升级版: Logback:是基于slf4j接口实现的一套日志框架组件:(Logback是由log4j创始人设计的又一个开源日志组件.) JUL(java utillog):仿log4j实现的日志框架,是sun旗下的,(也就是在我们普遍使用的jdk中): Commons loggin:是一套日志接口(apache): Slf4j:也是一套日志接

springBoot日志框架自动配置与原理

1.日志框架 小张:开发一个大型系统: ? 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? ? 2.框架来记录系统的一些运行时信息:日志框架 : zhanglogging.jar: ? 3.高大上的几个功能?异步模式?自动归档?xxxx? zhanglogging-good.jar? ? 4.将以前框架卸下来?换上新的框架,重新修改之前相关的API:zhanglogging-prefect.jar: ? 5.JDBC---数据库驱动: ?

SpringBoot 应用篇 实现后端的接口版本支持

SpringBoot 应用篇 实现后端的接口版本支持 作为一个主职的后端开发者,在平时的工作中,最讨厌的做的事情可以说是参数校验和接口的版本支持了.对于客户端的同学来说,业务的历史包袱会小很多,当出现不兼容的业务变动时,直接开发新的就好:然而后端就没有这么简单了,历史的接口得支持,新的业务也得支持,吭哧吭哧的新加一个服务接口,url 又不能和之前的相同,怎么办?只能在某个地方加一个类似v1, v2... 那么有没有一种不改变 url,通过其他的方式来支持版本管理的方式呢? 本文将介绍一种,利用请

SpringBoot日志配置文件不生效

SpringBoot日志配置文件不生效是因为配置文件重复!!! SpringBoot项目中默认有一份日志配置文件,项目启动时先读取到了默认日志配置文件,没有读取resource目录中的配置文件,需要自定义日志信息的话需要在Springboot配置文件中指定读取自定义的配置文件 logging.config=classpath:log4j2.properties//设置使用日志路径 而且,默认的配置文件其实用着也还行,如果使用默认日志的话,输出控制台的级别是INFO,需要将日志信息持久化可以这样写

SpringBoot基础篇AOP之基本使用姿势小结

一般来讲,谈到Spring的特性,绕不过去的就是DI(依赖注入)和AOP(切面),在将bean的系列中,说了DI的多种使用姿势:接下来看一下AOP的玩法 <!-- more --> I. 背景知识 在实际使用之前有必要了解一下什么是AOP,以及AOP的几个基本概念 1. advice before: 在方法执行之前被调用 after: 在方法执行之后调用 after returning: 方法执行成功之后 after throwing: 方法抛出异常之后 around: 环绕,自己在内部决定方