SpringBoot 以slf4j门面模式使用日志(三)

238 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

五、日志文件输出

以上都是把日志输出到控制体,那在实际项目中这肯定是不行的,对于阅读分析会造成很多麻烦,因此我们需要将相关的日志都输出到日志文件中,便于我们后期阅读。

5-1、通过logging.file.name设置

  • 可以设置文件的名称, 如果没有设置路径会默认在项目的相对路径下

image.png

  • 还可以指定路径+文件名 D:/jony.log

image.png

5-2、通过logging.file.path设置

  • 不可以指定文件名称, 必须要指定一个物理文件夹路径,会默认使用spring.log

image.png

我们再尝试给d盘下添加文件,可以看到实际上还是把文件名,当做了路径来输出,然后再路径下输出spring.log日志文件

image.png

5-2、logging.file.name和logging.file.path的区别

logging.file.namelogging.file.path实例描述
(没有)(没有)仅控制台记录。
指定文件名(没有)my.log写入指定的日志文件。
(没有)具体目录/var/log写入spring.log指定的目录。

六、日志的存档

在项目访问量比较大的情况下,如果只输出一个文件,会导致这一个文件里面的内容会越来越大,在需要阅读日志文件的时候,打开文件就会变的相当麻烦,甚至无法打开的情况,而且也无法顺利准确定位到我们需要查看日期的日志。因此我们就需要对日志输出进行管理,可以设置10mb存储为一个日志文件,超过之后再在新的日志文件中存储。

在项目实际情况中,我们需要进行评估,如果一天内产生的日志量比较大,那我们就需要将一天内的日志进行多文件存储;如果一天内产生的日志量较小,则可以存储到一个文件中。因此日志的输出规格,需要我们根据实际情况进行评估。

如果使用的是Logback,则可以使用application.properties或application.yaml文件微调日志轮播设置。对于所有其他日志记录系统,您需要直接自己配置轮转设置(例如,如果使用Log4J2,则可以添加log4j.xml文件)。

6-1、logback的日志配置

名称描述说明
logging.logback.rollingpolicy.file-name-pattern归档的文件名${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.clean-history-on-start如果应在应用程序启动时进行日志归档清理。false
logging.logback.rollingpolicy.max-file-size归档前日志文件的最大大小。10MB
logging.logback.rollingpolicy.total-size-cap删除日志档案之前可以使用的最大大小。0B
logging.logback.rollingpolicy.max-history保留日志存档的天数(默认为7)7

6-2、压缩日志名称命名

对于以上配置参数,比较难理解的就是:logging.logback.rollingpolicy.file-name-pattern解析如下:

  • ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
    • ${LOG_FILE} 对应 logging.file.name
    • %d{yyyy-MM-dd} 日期 年-月-日
    • %i 索引, 当文件超出指定大小后进行的文件索引递增

6-3、日志归档的删除

logging.logback.rollingpolicy.max-history:
日志最久保存天数,默认7天。

logging.logback.rollingpolicy.total-size-cap:
指当文件最大到多少时就进行删除,默认是0B,不删除

logging.logback.rollingpolicy.clean-history-on-start:
在应用程序启动时进行日志归档清理。

6-4、logbakc日志测试

首先将日志最大设置为5KB,然后就可以看到在日志目录中,就会将我们历史的文件进行压缩。根据上面我们说的日志名称进行处理,最终为.gz文件 image.png

七、logback配置文件

在application.properties中只能配置logback的简单信息,要使用logback的其他高级功能比如,将日志发送到邮箱,或者记录到数据库,就没办法使用了,只能单独配置logback的配置文件。

需要注意的是,如果配置了单独的日志文件,在application.properties中配置的日志信息就无效了

7-1、创建logback日志配置文件

可以从官网拷贝一个基本版的配置文件,如下操作步骤

1、ducumentation

image.png

2、The logback manual

image.png

3、appenders

image.png

4、基本版配置

image.png

5、在项目中新建logback.xml,并将上面信息拷贝到文件中。

<configuration>

    <!--appender 追加器   日志以哪种方式进行输出
            name 取个名字
            class 不同实现类会输出到不同地方
                ch.qos.logback.core.ConsoleAppender 输出到控制台
    -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--格式-->
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <!--控制所有的日志级别-->
    <root level="DEBUG">
        <!-- 将当前日志级别输出到哪个追加器上面 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

7-2、设置跟细粒度的日志级别

在上面提到给我们自己写的代码设置单独的日志级别,在logback.xml中也可以进行设置,如下:

<logger name="com.jony" level="INFO"></logger>

这样在com.jony包下面的代码相关日志级别就设置为INFO了。

7-3、设置项目环境的日志输出信息

在之前的文章中提到,可以在配置文件中设置项目的当前环境,如设置开发环境:

spring.profiles.active=dev

在logback.xml中是没有设置环境变量的配置信息的,但是springboot中提供了相关配置信息如下:

image.png

根据以上的信息,我们配置项目环境的日志信息

image.png 设置dev输出日志信息为----;pro输入日志信息为+++++

运行测试一下

image.png 可以发现控制台信息报错了,提示没有这个标签,这是因为刚刚springProfile是springboot的,不是logback的标签,因此在logback.xml中是无法直接使用的。

可以看下spring官网的信息

image.png

logback自己有一套加载的机制,如果日志配置文件为logback.xml,则在springboot容器加载之前就加载了,需要将配置文件改为logback-spring.xml这样logback才加载不到。

如下图这样就可以加载成功,并且加载为dev的环境 image.png

把环境改为pro,再查看下日志的输出信息

image.png

7-4、在logback-spring配置文件中引用springboot全局配置文件中的配置项

在logback-spring.xml的配置文件中,我们可以使用application.properties中的配置项信息,如在application.properties中,我们之前配置了logging.pattern.dateformat=yyyy-MM-dd,这样在logback-spring.xml中就可以这样使用

<!--可以引用SpringBoot全局配置文件中的配置项-->
<springProperty scope="context" name="dateformat" source="logging.pattern.dateformat"
                defaultValue="-yyyy-MM-dd HH:mm:ss.SSS"/>

其中source的值即为application.properties中的配置信息key;defaultValue如果配置信息中没有,则使用这个值;scope=context当前配置只在当前上线文中其作用;name则为起的名字

在日志显示格式中,就可以使用了,如下:

image.png

将application.properties中的logging.pattern.dateformat注释掉,再次启动如下:

image.png

八、日志框架的切换

上面提到我们使用slf4j就是为了可以方便切换日志框架,那我们现在充logback日志框架切换为log4j2该如何操作呢

8-1、首先引入slf4j-log4j2的启动器

<!--log4j2的启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

在上面我们并未添加logback的启动器,为什么可以使用了呢,因为springboot中spring-boot-starter-web启动器已经自动添加了logback的依赖。

8-2、logback切换为log4j2日志

在之前文章中有提到,项目中只能存在一个日志桥接器,现在同时存在logback和log4j2,运行则会报错,如下:

image.png

8-2-1、排除logback的依赖

<dependency>
    <!--starter-web中自动添加了starter-logging 也就是logback的依赖-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>

    <exclusions>
        <!--排除starter-logging 也就是logback的依赖-->
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

在starter-web中添加exclusions,设置排除spring-boot-starter-logging。

8-2-2、添加log4j2的桥接器

<!--Log4j2的场景启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

8-2-3、添加log4j2的日志配置文件

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} ++++ %msg%n"/>
        </Console>
    </appenders>

    <loggers name="com.jony" level="TRACE"></loggers>
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

8-2-4、测试

image.png

8-3、logback切换为log4j

8-3-1、 要将logback的桥接器排除

<dependency>
            <!--starter-web中自动添加了starter-logging 也就是logback的依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!--排除starter-logging 也就是logback的依赖-->
<!--                <exclusion>-->
<!--                    <artifactId>spring-boot-starter-logging</artifactId>-->
<!--                    <groupId>org.springframework.boot</groupId>-->
<!--                </exclusion>-->

                <!--排除logback桥接器-->
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
            </exclusions>
        </dependency>

8-3-2、添加log4j的桥接器

<!--添加log4j桥接器-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>

8-3-3、添加log4j配置文件

log4j.properties

#trace<debug<info<warn<error<fatal
log4j.rootLogger=trace, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n