今天做一个多环境的日志系统,yml文件里面写dev 就使用 dev的日志系统,如果是prod。就指定开发环境的日志系统。
结果今天倒好,写是写了,无法解析,老是在后面加一个 is_undefined的字符,我不知道这么回事,直到我用if和else来改写我才明白是缺少了依赖,需要添加janino依赖才跨域根据application的active的值来动态使用开发版或者生产环境的日志。
这个文章该了两次了,下面这个依赖不用加了,因为我不用if 标签判断了,改用了springProfile 就不用这个依赖了
想日志文件获取application.yml里面的active来选择对应的日志配置,需要添加如下依赖,不让无法解析获取yml里面的active的值。
<!-- logback 解析 条件表达式-->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.3</version>
</dependency>
效果:![](https://img-blog.csdnimg.cn/8bb1e66b0e1349c3a0c6a0faef00b571.png)
![](https://img-blog.csdnimg.cn/1cb1e6e2f597479eb0700e9a1559b3f8.png)
好了,上面解决了include标签 无法获取application.yml的${} 的问题了,下面开始多环境日志系统的配置。
所谓的多环境日志系统,就是获取spring boot的application.yml 文件里面的spring.profile.active的值来选择对应的日志配置,开发环境使用开发环境的日志配置文件,开发环境的日志在控制台输出,生产环境就用生产环境的日志配置文件,日志不是在控制台输出,而是输出到文件,报错的日志和不报错的日志,放在不同的文件里面。而且还有几个月前的日志,框架自动打包,压缩。
application.yml文件 (改变active:prod 为active:dev 可以切换到开发的日志配置)
server:
port: 8080
servlet:
context-path: /
spring:
application:
name: school
profiles:
active: prod
# 有prod dev环境
# include: dev,prod
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/javawebtest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
logging:
#指定日志的配置文件的位置。
config: classpath:logback-spring.xml
主要是loggind.config这里classpath:配置文件路径,还有spring.profiles.active的值,值是随便写的。后面你得用它。
1. 在resource目录下面放下面的三个文件
![](https://img-blog.csdnimg.cn/7e3d08074dba4f399f36c292fd9a87ad.png)
2. logback-spring.xml 配置文件(主配置文件)
include标签根据springProfile标签的值是否存在,存在就添加开发或者生产环境下的日志配置文件,不存在,就不执行里面的include.(关于使用<include resource="logback-${activeProfile}.xml"></include>)这个方法,好像不行 ${ }无法解析,这个是ai给我的,我感觉好假,根本就不行
<?xml version="1.0" encoding="UTF-8"?>
<!--scan logback 扫描指定目录下的配置文件 发生变化 重新加载 60秒检测一次 开发环境 关闭调试模型-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--name 属性为dev 表示设置了dev 的值的话,就执行include 的标签,引入xxx-dev 文件-->
<springProfile name="dev">
<include resource="logback-dev.xml"/>
</springProfile>
<!--同上 ,这个的定义prod是application.yml的active那个的值-->
<springProfile name="prod">
<include resource="logback-prod.xml"/>
</springProfile>
<!-- <include resource="logback-${profile}.xml"/>-->
<!-- <include resource="logback-${spring.profiles.active}.xml"/>-->
<!-- 定义变量 logPath 值是value后面的 定义日志存放目录 -->
<property name="logPath" value="./logs"/>
<!-- 日志输出的格式-->
<!-- %d{yyyy-MM-dd HH:mm:ss.SSS}:输出日志时间,格式为年-月-日 时:分:秒.毫秒。
[%t-%L]:输出线程名称和所在代码行号。
%-5level:输出日志级别,占用 5 个字符的宽度,左对齐。
%logger{36}:输出 Logger 名称,最大长度为 36。
%L:输出所在代码行号。
%M:输出所在方法名。
%msg:输出日志信息。
%xEx:输出异常信息。
%n:输出换行符。-->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} %L %M - %msg%xEx%n"/>
<!-- 应该是本文件的命令空间 ,有多个log 文件 -->
<contextName>logback</contextName>
</configuration>
3. logback-prod.xml 生产环境的日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 正常的日志文件,输出到文件中-->
<!-- 日志回滚,超过一定时间和文件大小,自动归档 然后进行压缩 -->
<appender name="fileDEBUGLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<!-- 可能是防止不必要的日志,对系统性能的影响 定义一个过滤器 ,日志Error的就Deny 调 ,否者就是接受 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>Error</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<!-- 指定日志文件的路径和名称 -->
<File>${logPath}/log_demo.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<!-- 日志回滚,梅泰诺都滚动到一个新的文件中 文件名是日期格式 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/log_demo_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!--为日志输出加一个过滤器 输出ERROR日志到指定的文件中-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logPath}/error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/error_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- 定义指定package的日志级别-->
<logger name="org.springframework" level="DEBUG"/>
<logger name="org.mybatis" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="io.lettuce.*" level="INFO"/>
<logger name="io.netty.*" level="ERROR"/>
<logger name="com.rabbitmq.*" level="DEBUG"/>
<logger name="org.springframework.amqp.*" level="DEBUG"/>
<logger name="org.springframework.scheduling.*" level="DEBUG"/>
<!--定义com.xxx..xx..xx包下的日志信息不上传,直接输出到fileDEBUGLog和fileErrorLog这个两个appender中,日志级别为DEBUG-->
<logger name="com.baiyu" additivity="false" level="DEBUG">
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</logger>
<root level="DEBUG">
<appender-ref ref="fileDEBUGLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</included>
4. logback-dev.xml 开发环境的日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!--配置日志的输出目标 输出到控制台 ConsoleAppender-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--指定日志输出格式 展示格式 layout-->
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
<!-- <layout class="ch.qos.logback.classic.PatternLayout">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- </layout>-->
<!--根据条件过滤日志 满足条件的才输出 过滤器,只有过滤到指定级别的日志信息才会输出,如果level为ERROR,那么控制台只会输出ERROR日志-->
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- 指定日志级别 Error 以上才输出 -->
<!-- <level>ERROR</level>-->
<!-- </filter>-->
</appender>
<!--指定最基础的日志输出级别-->
<root level="DEBUG">
<!--appender将会添加到这个loger-->
<appender-ref ref="consoleLog"/>
</root>
</included>
ok 如果是生产环境的话,产生两个文件,我这是4个是两天的日志了,你们第一次是两个日志,今天4月9日,昨天的日志是04-08
![](https://img-blog.csdnimg.cn/9811106ec0e6482ea9b25e341573f980.png)