美文网首页
Spring Boot 日志Logback

Spring Boot 日志Logback

作者: 小昭文 | 来源:发表于2018-10-24 14:23 被阅读28次
    image.png

    Spring Boot 内置包含了logback 和 slf4j,通过依赖关系可以看到,
    spring-boot-starter -> spring-boot-starter-logging
    spring-boot-starter-logging又依赖了 logbackslf4j

    image.png

    因此我们无需在pom.xml文件中引入任何依赖。

    日志格式

    SpringBoot默认的日志输出格式是这样的,从左到右依次是:

    • 日期时间
    • 日志级别
    • 进程号
    • 线程名称
    • 源代码的类名称
    • 日志信息
    2018-10-24 11:23:54.773  INFO     1529   ---[nio-8080-exec-1] com.xiaozhao.controller.HelloController  : 我是控制器,接收到了参数:詹姆斯
    时间日期精确到毫秒          日志级别   进程id ---[线程名称]          源代码的类名称                             : 业务日志
    

    日志级别

    Spring Boot 默认只输出到控制台,日志级别只显示INFO、WARN、ERROR

    虽然可以通过以下2种方式启动debug日志,但是只会输出系统相关的日志,咱们在程序中写的debug级别日志是不能输出的。
    1)在 application.properties 中设置 debug=true

    1. 使用命令行启动: java -jar myApp.jar --debug

    最简单配置

    日志默认是不输出到文件中的,但是在生产环境下,一般需要记录运行日志的,我们只需在application.properties加上如下配置即可。

    logging.path=/Users/xiaozhao/Technology/temp/logs
    logging.file=/Users/xiaozhao/Technology/temp/logs/my.log
    logging.level.root=info
    

    上面三行配置依次为:

    • 日志文件的路径
    • 日志文件名称
    • 日志级别

    日志大小默认为10MB,超过这个大小后建立新文件。

    自定义深层次配置

    如果想要对日志有更精细的控制,可以添加额外的配置文件。在resources文件夹下建立对应的配置文件即可,文件名称约定为:

    • logback.xml
    • logback-spring.xml

    这2个文件的区别是加载的时机不同,logback.xml加载的比较早,因此和Spring Boot的一些互动性不如 logback-spring.xml

    建议使用 logback-spring.xml即可,因为这个可以加入一些扩展配置,比如和spring的profile配合,读取application.properties中的一些属性等。

    logback 扩展配置
    1.与profile配合

    可以使用 springProfile 标签来选择性的包含或者排除一些设置项。

    比如我们在开发阶段时,一般只要把日志输出到控制台即可,没有必要输出到文件中。
    而在生产环境中输出到控制台是没有意义的,同时还有性能开销,一般需要把日志输出到文件,则取消输出到控制台。

    例如有一个application-dev.properties的配置,用于开发环境,在我们的application.properties中有如下设置

    # 启用开发环境
    spring.profiles.active=dev
    

    然后在logback-spring.xml中加入如下节点

    <!--开发环境下只输出到控制台,不写日志文件-->
        <springProfile name="dev">
            <root level="INFO">
                <appender-ref ref="STDOUT"/>
            </root>
        </springProfile>
    

    同理再加一个生产环境的配置节点

    <!-- 生产环境日志级别为INFO/并且记录日志文件 -->
        <springProfile name="prod">
            <root level="INFO">
                <appender-ref ref="FILE"/>
            </root>
        </springProfile>
    

    还可以指定不同的输出级别,例如在开发环境下指定输出级别为 DEBUG 而在生产下为INFO

    2.读取application.properties中的配置项

    可以通过 springProperty节点来读取 application.properties中的属性值,例如我们要读取项目名称来作为日志文件的主名称。

    在application.properties中有这么一个配置项

    spring.application.name=BangBang
    

    然后在logback-spring.xml文件中添加一个节点

      <springProperty scope="context" name="logName" source="spring.application.name" defaultValue="bang.log"/>
    
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/${logName}.%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>10MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
    

    其中:

    • scope:作用域
    • name: 在logback-spring.xml文件中供其他地方引用的变量名称
    • source: 在application.properties中定义的项
    • defaultValue: 默认值

    这样就可以把项目名称读取进来,生成的日志文件就是项目名称作为名称,运行之后的截图:

    image.png

    示例

    以下为一个logback-spring.xml配置的例子

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <!--
          说明:
          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形式命名
              stdout将日志信息输出到控制上,为方便开发测试使用
       -->
    
    
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <property name="LOG_HOME" value="/Users/xiaozhao/Technology/temp"/>
        <!-- 读取 spring.application.name 属性来生成日志文件名
            scope:作用域
            name:在 logback-spring.xml 使用的键
            source:application.properties 文件中的键
            defaultValue:默认值
        -->
        <springProperty scope="context" name="logName" source="spring.application.name" defaultValue="bang.log"/>
    
    
    
        <!-- 控制台输出 -->
        <!-- 彩色日志 -->
        <!-- 彩色日志依赖的渲染类 -->
        <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
        <conversionRule conversionWord="wex"
                        converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
        <conversionRule conversionWord="wEx"
                        converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
        <!-- 彩色日志格式 -->
        <property name="CONSOLE_LOG_PATTERN"
                  value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
        <!-- Console 输出设置 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                <charset>utf8</charset>
            </encoder>
        </appender>
    
        <!-- 按照每天生成日志文件 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/${logName}.%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>10MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
    
        <!--用来设置某一个包或者具体的某一个类的日志打印级别-->
        <!--打印MyBatis的sql语句-->
        <logger name="com.xiaozhao.dao" level="DEBUG"></logger>
    
    
        <!-- 日志输出级别,生产环境下需要移除控制台输出 -->
        <!--<root level="INFO">-->
        <!--<appender-ref ref="STDOUT"/>-->
        <!--<appender-ref ref="FILE"/>-->
        <!--</root>-->
    
        <!--开发环境下只输出到控制台,不写日志文件-->
        <springProfile name="dev">
            <root level="INFO">
                <appender-ref ref="STDOUT"/>
            </root>
        </springProfile>
    
        <!-- 生产环境日志级别为INFO/并且记录日志文件 -->
        <springProfile name="prod">
            <root level="INFO">
                <appender-ref ref="FILE"/>
            </root>
        </springProfile>
    </configuration>
    

    完整代码
    https://github.com/xiaozhaowen/spring-boot-in-action/tree/master/springboot-logback

    相关文章

      网友评论

          本文标题:Spring Boot 日志Logback

          本文链接:https://www.haomeiwen.com/subject/hhpttqtx.html