本文主要给大家介绍SpringBoot中如何通过sl4j日志组件优雅地记录日志。其实,我们入门 JAVA 的第一行代码就是一行日志,那你现在还在使用System.out.println("Hello,小明!")记录日志吗?

我经历过的日志组件

我最开始接触的日志组件是Log4j

Log4j 作为Apache的一个开放源代码的项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等我们期望它输出到的地方;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

我们可以通过一个配置文件来灵活地进行上面的配置,而不需要修改应用的代码。Log4j作为当时作为最先比较流行的日志框架,给我们在应用开发和维护带来了很大的便捷。

但是,如今还是慢慢的走下“神坛”呢,逐渐被Logback替代,众里寻她千百度,原来Logback升级版,相对Log4j而言有了更多的改进,而且开发人员竟然是同班人马(其实就是一个人写的)!

新星Logback

Logback主要有下面的特性:

  1. 更快的执行速度:基于我们先前在Log4j上的工作,Logback 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上10倍。在保证Logback的组件更加快速的同时,同时所需的内存更加少;
  2. 充分的测试:Logback 历经了几年,数不清小时数的测试。尽管Log4j也是测试过的,但是Logback的测试更加充分,跟Log4j不在同一个级别。我们认为,这正是人们选择Logback而不是Log4j的最重要的原因。谁不希望即使在恶劣的条件下,你的日志框架依然稳定而可靠呢?
  • 由三个模块组成

    • logback-core
    • logback-classic
    • logback-access

logback-core是其它模块的基础设施,其它模块基于它构建,显然,logback-core提供了一些关键的通用机制。logback-classic的地位和作用等同于 Log4J,它也被认为是 Log4J的一个改进版,并且它实现了简单日志门面 SLF4J;而 logback-access主要作为一个与 Servlet容器交互的模块,比如说tomcat或者 jetty,提供一些与 HTTP访问相关的功能。

那Sl4J又是什么?

slf4j:The Simple Logging Facade for Java 即java的简单日志门面

简答的讲就是slf4j是一系列的日志接口,slf4j是作为一个日志的抽象行为存在的,但是并没有提供真正的实现。

slf4j为各种日志框架提供了一个统一的界面,使用户可以用统一的接口记录日志,动态地决定要使用的实现框架,比如LogbackLog4jcommon-logging等框架都实现了这些接口。

我是如何配置日志的?

路人皆知,Springboot默认使用的日志框架是Logback。顺势而为,在项目中,我们使用Logback,其实只需增加一个配置文件(自定义你的配置)即可。

配置文件详解

配置文件精简结构如下所示

<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 属性文件:在properties/yml文件中找到对应的配置项 -->
<springProperty scope="context" name="logging.path" source="logging.path"/>
<contextName>程序员小明</contextName> <appender>
//xxxx
</appender> <logger>
//xxxx
</logger> <root>
//xxxx
</root>
</configuration>

这个文件在springboot中默认叫做logback-spring.xml,我们只要新建一个同名文件放在resources下面, 配置即可生效。

每个配置的解释如下所示:

contextName

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录

property

用来定义变量值的标签,property标签有两个属性,namevalue;其中name的值是变量的名称,value的值时变量定义的值。通过property定义的值会被插入到logger上下文中。定义变量后,可以使“${name}”来使用变量。如上面的xml所示。

logger

用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender

root

根logger,也是一种logger,且只有一个level属性

appender

负责写日志的组件

appender 的种类
  • ConsoleAppender:把日志添加到控制台
  • FileAppender:把日志添加到文件
  • RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。它是FileAppender的子类

filter

filter其实是appender里面的子元素。它作为过滤器存在,执行一个过滤器会有返回DENY,NEUTRAL,ACCEPT三个枚举值中的一个。

  • DENY:日志将立即被抛弃不再经过其他过滤器

  • NEUTRAL:有序列表里的下个过滤器过接着处理日志

  • ACCEPT:日志会被立即处理,不再经过剩余过滤器

    有以下几种过滤器

    ThresholdFilter

    临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
    </filter>
    LevelFilter

    级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath(用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>

项目实例

准备

一个简单正常的Springboot项目

配置文件

application.yml

有关日志的简单配置,我们可以直接在application.yml中进行简单的配置,比如指明日志的打印级别和日志的输出位置

logging:
level:
root: info
path: ./logs

也可以根据分环境配置指明使用的配置文件,缺省为logback-spring.xml

logging:
level:
root: info
path: ./logs
config: classpath:/logback-dev.xml

logback-spring.xml

resources目录下新建logback-spring.xml文件,举例一个简单的需求,如果在项目中我们如果需要指定日志的输出格式以及根据日志级别输出到不同的文件,可以配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 属性文件:在properties文件中找到对应的配置项 -->
<springProperty scope="context" name="logging.path" source="logging.path"/>
<contextName>xiaoming</contextName>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出(配色):%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%yellow(%d{yyyy-MM-dd HH:mm:ss}) %red([%thread]) %highlight(%-5level) %cyan(%logger{50}) - %magenta(%msg) %n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender> <!--根据日志级别分离日志,分别输出到不同的文件-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--按时间保存日志 修改格式可以按小时、按天、月来保存-->
<fileNamePattern>${logging.path}/xiaoming.info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--保存时长-->
<MaxHistory>90</MaxHistory>
<!--文件大小-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${logging.path}/xiaoming.error.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>90</MaxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>

再比如如果粒度再细一些,根据不同的模块,输出到不同的文件,可以如下配置

 <!--特殊功能单独appender 例如调度类的日志-->
<appender name="CLASS-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${logging.path}/mkc.class.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>90</MaxHistory>
</rollingPolicy>
</appender>
<!--这里的name和业务类中的getLogger中的字符串是一样的-->
<logger name="xiaoming" level="INFO" additivity="true">
<appender-ref ref="CLASS-APPENDER" />
</logger>

正常情况下xiaoming是指的

private Logger xiaoming = LoggerFactory.getLogger("xiaoming");

如果我们使用的是lomok插件,则xiaoming指的是topic

@Slf4j(topic = "xiaoming")
public class XiaoMingTest { }

其他

小明目前用到的就这么多啦,更多的日志配置场景,大家可以访问:看完这个不会配置 logback ,请你吃瓜!

有什么问题,欢迎大家留言~

欢迎关注微信公众号”程序员小明”,获取更多资源。

SpringBoot优雅地配置日志的更多相关文章

  1. springboot通过slf4j配置日志

    原因:SpringBoot默认使用slf4j日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉: 而我今天想引入log4j的时候,pom文件一直报错,显示找不到log4j的jar包,应当是 ...

  2. springboot(三)配置日志

    github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-serviceSLF ...

  3. SpringBoot整合log4j2进行日志配置及防坑指南

    写在前面 最近项目经理要求将原先项目中的日志配置logBack,修改为log4j2,据说是log4j2性能更优于logback,具体快多少,网上有说快10多倍,看来还是很快的,于是新的一波挑战又开始了 ...

  4. springboot超级详细的日志配置(基于logback)

    前言   java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用) ...

  5. springboot支付项目之日志配置

    日志框架 本节主要内容: 1:常见的几种日志框架 2:Logback的使用 3:怎么配置info和error级别日志到不同文件中并且按照日期每天一个文件. 以上几个框架可以分类如下: SLF4J和Lo ...

  6. SpringBoot文档翻译系列——26.日志logging

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7613854.html 这是SpringBoot的日志内容 26 日志 Spring使用Co ...

  7. SpringBoot基础系列-使用日志

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996897.html SpringBoot基础系列-使用日志 概述 SpringBoot ...

  8. SpringBoot+kafka+ELK分布式日志收集

    一.背景 随着业务复杂度的提升以及微服务的兴起,传统单一项目会被按照业务规则进行垂直拆分,另外为了防止单点故障我们也会将重要的服务模块进行集群部署,通过负载均衡进行服务的调用.那么随着节点的增多,各个 ...

  9. 用Python优雅的处理日志

    我们可以通过以下3种方式可以很优雅配置logging日志: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文 ...

随机推荐

  1. Junit初级应用实例

    Request: public interface Request { String getName(); } Response: public interface Response { String ...

  2. UEditor 之初体验后记

    1.UEditor 基本介绍 1.1.关于 UEditor 1.2.UEditor 现状 2.UEditor 简单使用 2.1.将 UEditor 源码集成到项目中 2.2.让 UEditor 的 U ...

  3. python介绍、安装及相关语法、python运维、编译与解释

    1.python介绍 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/)是一种广泛使用的解释型.高级编程.通用型编程语言,由吉多.范罗苏姆创造,第一版发布于1991年.可以视 ...

  4. stack用法,queue用法,

    stack stack 模板类的定义在头文件中. stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要 的,在不指定容器类型时,默认的容器类型为deque. 定义st ...

  5. 题解 P5016 【龙虎斗】

    首先祝各位大佬noip有个好成绩吧 当时比赛有个大数据,蒟蒻我暴力居然过了,好激动 这题一定要注意开long long (那个大数据就是我开long long才过的) 还有刚开始应设置答案为m(见解析 ...

  6. Git介绍以及安装

    Git的作者是大名鼎鼎的Linux之父Linus Torvalds. Git是一个分布式的版本控制系统,Git三个字母的含义可以理解为"Global Information Tracker& ...

  7. fjnuoj 1004 游戏 (博弈论)

    思路: N 为1或质数 先手必赢 N 为质数X质数的积 后手必赢 先手取两个质数的积则赢 #include #include #define ll long long using namespace ...

  8. Java emoji持久化mysql

    好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf-8字符集保存不了保存不了表情字符,这是为什么呢?因为普通的字符 ...

  9. 林大妈的JavaScript基础知识(一):JavaScript简史

    前言:做一名Web设计师是一件令人兴奋的事.在Web技术中,JavaScript是一个经历从被人误解到万众瞩目的巨大转变,在历史的冲击中被留存下来的个体.因为JavaScript的引导,Web开发也从 ...

  10. GitLab与Git的结合

    作为一名刚入职的大数据初级开发工程师,来到公司后发现代码是部署在GItLab上,之前一直认为代码可以放在码云.github上面,然后就很迷惑就对GitLab进行了了解,将git 和gitlab结合起来 ...