Spring Boot 日志Logback

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 东行西走南北游,笑语携春为何求,一念慈心执天意,天马行空合大猷。 原创作品 (Original Article)
    一诗一境界阅读 140评论 0 0
  • 许多念念不忘 根本不会有回响 01 有时候,太爱一个人,就在一开始就输了。你拼命付出,Ta理所当然。后来,你还想拼...
    萱小蕾阅读 446评论 0 2
  • 先看《晋书·惠帝纪》里的一小段: 及天下荒乱,百姓饿死,帝曰:“何不食肉糜?” 晋惠帝时,闹饥荒,百姓没饭吃,...
    潘家文阅读 672评论 1 4