Spring Boot 日志配置

引用步骤 

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台

壹、使用spring boot logback框架的默认配置

直接使用下面第3个步骤写日志即可输出日志到控制台,不再需要其他配置。

如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。

logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log
如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。
如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log
注:二者不能同时使用,如若同时使用,则只有logging.file生效
默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO
 

贰、自定义日志配置文件

UfczRg.png

 上图为多中日志框架示意图,spring boot 默认日志使用logback框架。

日志门面就是日志的接口,日志库就是接口的具体实现。适配器就是将接口和具体实现进行连接的桥梁。

除图中显示的适配器,还有很多适配器,比如log4j-to-slf4j。

除图中日志库,还有log4j2,是对log4j的全面重构。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被spring boot正确加载:

     Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
     Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
     Log4j2:log4j2-spring.xml, log4j2.xml
     JDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml)。

Spring boot 日志配置文件默认命名 logback-spring.xml,放在 src/main/resources 下面即可被spring boot自动识别,spring boot可以为它添加一些spring boot特有的配置项(下面会提到);如果不使用默认配置名,可以通过配置指定配置文件名。

(1)指定配置文件名

        如果使用默认日志配置文件名 logback-spring.xml,则不需要指定;否则,需要指定日志文件名。

logging.config=classpath:logback_custome.xml

(2)编写配置文件

在src/main/resources下面添加logback_custome.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--======================================= 本地变量 ======================================== -->
    <!--在没有定义${LOG_HOME}系统变量的时候,可以设置此本地变量。提交测试、上线时,要将其注释掉,使用系统变量。 -->
    <!-- <property name="LOG_HOME" value="D:/data/logs" /> -->

    <!-- 应用名称:和统一配置中的项目代码保持一致(小写) -->
    <property name="APP_NAME" value="base" />
    <!--日志文件保留天数 -->
    <property name="LOG_MAX_HISTORY" value="180" />
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
    <!--应用日志文件保存路径 -->
    <property name="LOG_APP_HOME" value="${catalina.home}/${APP_NAME}/app" />

    <!--=========================== 按照每天生成日志文件:默认配置=================================== -->
    <!-- 控制台输出 -->
    <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="APP"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_APP_HOME}/base.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>${LOG_MAX_HISTORY}</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{500} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--=============================== 定义各个框架的输出级别 ====================================== -->
    <logger name="org.springframework">
        <level value="WARN" />
    </logger>
    <logger name="org.apache.shiro">
        <level value="WARN" />
    </logger>
    <logger name="freemarker">
        <level value="WARN" />
    </logger>
    <logger name="org.hibernate">
        <level value="WARN" />
    </logger>
    <logger name="org.hibernate.SQL">
        <level value="DEBUG" />
    </logger>
    
    <root level="DEBUG">
        <appender-ref ref="APP" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

 (3)打印日志

                第1种方式:程序中logger打印

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        int status = 0;
        if (status == 0) {
            logger.info("status:{}", status);
        } else {
            logger.info("status:{}", status);
        }
        logger.info("end!");
    }
}

         第2种方式:注解@Slf4j

                如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用lombok注解@Slf4j;

                (1)需要在pom文件引入lombok

               (2)类上面添加@Sl4j注解,然后使用log打印日志;

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
    <version>1.16.16</version><!--版本号自己选一个就行-->
</dependency>
@Slf4j
@RestController
@RequestMapping("/car4car")
public class Car4carController {
   
    @GetMapping("/queryList")
    
    public WebResponse<Page<Car4car>> queryList(PageInfo pageInfo, HttpServletRequest request){
        try {
            Page<Car4car> page = iCar4carService.queryList(pageInfo,request);
            return WebResponse.ok(page,"查询成功");
        } catch (Exception e) {
            log.error("伴随分析-车车查询失败》》》》》》" + e);
            e.printStackTrace();
        }
        return WebResponse.fail("查询失败");
    }
}

几个常用的 lombok 注解:
     @Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
     @Setter:注解在属性上;为属性提供 setting 方法
     @Getter:注解在属性上;为属性提供 getting 方法
     @SneakyThrows:无需在签名处显式抛出异常
     @Log4j:注解在类上;为类提供一个 属性名为log 的 log4j 日志对像
     @Slf4j: 同上
     @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
     @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

 日志配置文件详解

可以使用以下两种方式对日志系统的输出格式、记录级别、输出方式等进行配置:

  • 使用properties文件方式
  • 使用xml文件方式

properties文件方式

log4j.rootLogger=info, ServerDailyRollingFile, stdout
log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=logs/notify-subscription.log
log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c] %m%n

输出结果为:

2016-05-12 16:08:21 INFO [club.chuxing.learn.Main] status:0
2016-05-12 16:08:21 INFO [club.chuxing.learn.Main] end!

xml文件方式

  1. 设置日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 应用名称 -->
    <property name="APP_NAME" value="logtest" />
    <!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 -->
    <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />
    <!-- 日志输出格式 -->
    <property name="ENCODER_PATTERN"
              value="%d{yyyy-MM-dd  HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" />
    <contextName>${APP_NAME}</contextName>

    <!-- 控制台日志:输出全部日志到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>${ENCODER_PATTERN}</Pattern>
        </encoder>
    </appender>

    <!-- 文件日志:输出全部日志到文件 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/output.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 错误日志:用于将错误日志输出到独立文件 -->
    <appender name="ERROR_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 独立输出的同步日志 -->
    <appender name="SYNC_FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/sync.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="log.sync" level="DEBUG" addtivity="true">
        <appender-ref ref="SYNC_FILE" />
    </logger>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

输出结果为:

2016-05-12 17:08:32.105 [main] INFO club.chuxing.learn.Main - status:0
2016-05-12 17:08:32.114 [main] INFO club.chuxing.learn.Main - end!

日志系统配置说明

输出级别的种类

  • ERROR 为严重错误 主要是程序的错误
  • WARN 为一般警告,比如session丢失
  • INFO 为一般要显示的信息,比如登录登出
  • DEBUG 为程序的调试信息

(1)配置日志信息输出目的地

        log4j.appender.appenderName=??

org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

(2)配置日志信息的格式

     log4j.appender.appenderName.layout = ??

org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

(3)ConsoleAppender选项

  • Threshold=DEBUG:指定日志消息的输出最低层次。
  • ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
  • Target=System.err:默认情况下是System.out,指定输出控制台

(4)FileAppender 选项

  • Threshold=DEBUG:指定日志消息的输出最低层次。
  • ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
  • File=mylog.txt:指定消息输出到mylog.txt文件。
  • Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

(5) RollingFileAppender 选项

  • Threshold=DEBUG:指定日志消息的输出最低层次。
  • ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
  • File=mylog.txt:指定消息输出到mylog.txt文件。
  • Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
  • MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
  • MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

(6)日志信息格式中几个符号所代表的含义

  • -X号: X信息输出时左对齐;
  • %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
  • %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  • %r: 输出自应用启动到输出该log信息耗费的毫秒数
  • %c: 输出日志信息所属的类目,通常就是所在类的全名
  • %t: 输出产生该日志事件的线程名
  • %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
  • %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
  • %%: 输出一个”%”字符
  • %F: 输出日志消息产生时所在的文件名称
  • %L: 输出代码中的行号
  • %m: 输出代码中指定的消息,产生的日志具体信息
  • %n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行

 

(7)property可以用来设置变量,可以通过${name}来访问,有以下的属性

  • name,用于${name}访问的key

  • value,用于${name}访问的value

(8)appender格式化日志输出节点,有两个个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。appender有以下子节点:

  • filter,日志输出拦截器,可以自定义拦截器也可以用系统一些定义好的拦截器
/**
* 日志输出拦截器
* @author mm
* @date 2016年4月28日 下午3:36:23
*/
public class MyFilter extends Filter<ILoggingEvent> {

@Override
public FilterReply decide(ILoggingEvent event) {

    if (event.getMessage().contains("sample")) {
        return FilterReply.ACCEPT; //允许输入串
    } else {
        return FilterReply.DENY; //不允许输出
    }
}
}

         它可以提供最大的自定义输出,如果需要用到系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中

<filter  class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>
  • encoder和pattern节点组合用于具体输出的日志格式

  • file节点用来指明日志文件的输出位置,可以是绝对路径也可以是相对路径

  • rollingPolicy日志回滚策略,在这里我们用了TimeBasedRollingPolicy,基于时间的回滚策略,有以下子节点:(1)fileNamePattern,必要节点,可以用来设置指定时间的日志归档,例如我们上面的例子是每天将日志归档成一个zip包。(2)maxHistory ,可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为30的话,则30天之后,旧的日志就会被删除(3)totalSizeCap,可选节点,用来指定日志文件的上限大小,例如设置为3GB的话,那么到了这个值,就会删除旧的日志

    除了用TimeBasedRollingPolicy策略,我们还可以用SizeAndTimeBasedRollingPolicy,配置子节点的maxFileSize来指定单个日志文件的大小

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <!-- 每天一归档 -->
  <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
   <!-- 单个日志文件最多 100MB, 60天的日志周期,最大不能超过20GB -->
   <maxFileSize>100MB</maxFileSize>    
   <maxHistory>60</maxHistory>
   <totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
  <pattern>%msg%n</pattern>
</encoder>
</appender>

(9)root节点,必选节点,用来指定最基础的日志输出级别,他有俩个自己点可以用来应用appender,格式化日志输出

<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>

(10)logger节点,可选节点,用来具体指明包的日志输出级别,它将会覆盖root的输出级别

<!-- name 属性表示匹配的logger类型前缀 -->  
<logger name="com.taobao.jingwei.monitor">  
    <level value="WARN" />  
    <!-- 引用的appender,类似于spring的ref -->  
    <appender-ref ref="MONITOR" />  
</logger>  

      logger中有一个additivity属性,作用在于 children-logger是否使用 rootLogger配置的appender进行输出。

  • false:表示只用当前logger的appender-ref。
  • true:表示当前logger的appender-ref和rootLogger的appender-ref都有效。

      这样logger名字匹配com.taobao.jingwei.monitor的信息就只在MONITOR的appender输出,而不会在root logger中输出了

一个示例配置文件

log4j.debug=true   
log4j.rootLogger=DEBUG,D,E

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/logs.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = DEBUG
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

参考资料

     Spring Boot 日志配置(超详细)   

     Spring Boot 教程(五):log日志配置

     SpringBoot日志配置详解

     Java系统中常用日志框架

     日志组件slf4j介绍及配置详解

     注解@Slf4j的使用

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fang·up·ad

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值