您的位置:首页 > 其它

日志框架体系梳理( 续 )

2022-05-24 17:14 1101 查看

0、前言

  • 基础篇链接( 含JUL、JCL、LOG4J、LOGBACK、SLF4J、LOG4J2 ):https://www.cnblogs.com/xiegongzi/p/16293103.html


7、SpringBoot相关

  • SpringBoot 默认使用SLF4J作为日志门面,Logback作为日志实现来记录日志
  • 项目初始依赖,只需要一个web启动器就可以了,我的SpringBoot版本
    2.3.12.RELEASE
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 在这里面有这log日志相关的依赖



7.1、快速上手

测试

@Test
void quickStartSpringBootLog() {
// 是org.slf4j包下的
Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}

结果

ERROR 8208 ---[           main] c.z.SpringbootLogApplicationTests        : error信息
WARN 8208 --- [           main] c.z.SpringbootLogApplicationTests        : warn信息
INFO 8208 --- [           main] c.z.SpringbootLogApplicationTests        : info信息
  • 从这个输出内容得到的结果: 这种输出格式,就是典型的logback输出格式,即:SpringBoot的默认日志实现是logback
  • 日志默认级别是info级别


7.2、桥接器

  • 看一下SpringBoot中的日志桥接器是什么
@Test
void bridgeTest() {
// 是org.apache.logging.log4j包下的
Logger logger = LogManager.getLogger(SpringbootLogApplicationTests.class);
logger.info("info信息");
}

  • 结果
INFO 20948 --- [           main] c.z.SpringbootLogApplicationTests        : info信息
  • 从这个效果就可以看出来: 1、SpringBoot中桥接器是好使的
  • 2、使用的桥接器就是基础篇中的slf4j+logback的形式


7.3、使用application.yml进行日志配置

7.3.1、认识yml配置日志的方式

spring:
application:
name: SpringBootLog-server
# 日志配置
logging:
# 日志级别 此示例为com.zixieqing包下的日志级别
level:
com:
zixieqing: debug
# 格式设置
pattern:
# 控制台输出格式设置
console: "%d{yyyy-MM-dd} [%level] -%m%n"

测试

@Test
void ymlConfigLogTest() {
// 是org.slf4j包下的
Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}

结果

2022-05-24 [ERROR] -error信息
2022-05-24 [WARN] -warn信息
2022-05-24 [INFO] -info信息
2022-05-24 [DEBUG] -debug信息


7.3.2、yml配置日志输出到文件中

spring:
application:
name: SpringBootLog-server
# 日志配置
logging:
# 日志级别 此示例为com.zixieqing包下的日志级别
level:
com:
zixieqing: debug
# 格式设置
pattern:
# 控制台输出格式设置
console: "%d{yyyy-MM-dd} [%level] -%m%n"# 将日志输出到文件中
file:
path: "d:/test/SpringBootLog"

  • 注意:yml配置文件中的
    path: "d:/test/SpringBootLog"
    只是路径,而默认的文件名叫做
    spring.log

测试

@Test
void fileLog() {
// 是org.slf4j包下的
org.slf4j.Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}


7.4、使用logback实现日志拆分

  • 如果是需要配置日志拆分等相对高级的功能,那么
    application.yml
    就达不到需求了,所以:需要使用日志实现相应的配置文件
  • 这里的示例就是
    logback
    日志实现,和基础篇中一样,需要在类路径
    resources
    下,配置
    logback.xml

logback.xml测试配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"/>
<property name="logPath" value="d:/test" />

<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>

<!-- 配置文件的appender 可拆分归档的文件 -->
<appender name="rollingLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输入格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 引入文件位置 -->
<file>${logPath}/roll_logback.log</file>

<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

<!-- 按照时间和压缩格式声明文件名 压缩格式gz -->
<fileNamePattern>${logPath}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>

<!-- 按照文件大小来进行拆分 -->
<maxFileSize>1KB</maxFileSize>
</rollingPolicy>
</appender>

<logger name="com.zixieqing" level="debug" additivity="false">
<appender-ref ref="rollingLog"/>
</logger>

</configuration>
  • 想要配置其他的,基础篇中怎么配置,搬过来即可

测试

@Test
void rollingLOg() {
// 是org.slf4j包下的
org.slf4j.Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
for (int i = 0; i < 1000; i++) {
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}


7.5、使用slf4j + log4j2 - 重点

  • 这两个搭配才干活不累

步骤

  • 1、因为SpringBoot默认是采用的slf4j + logback的形式,因此:去除web启动中的logging,从而就去除logback日志实现了( 为什么剔除logging就可以了,看maven的依赖树,logback的上一级就是logging

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
    <!-- 排除掉原始依赖 以此去除logback引用 -->
    <exclusion>
    <artifactId>spring-boot-starter-logging</artifactId>
    <groupId>org.springframework.boot</groupId>
    </exclusion>
    </exclusions>
    </dependency>

  • 2、导入SpringBoot和log42j的整合启动器

    <!-- 添加log4j2依赖 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

  • 3、在
    resources
    目录下新建
    log4j2.xml
    配置文件,并编写想要的内容即可
<?xml version="1.0" encoding="UTF-8"?>
<!--status 框架本身的日志级别   monitorInterval指定热更新间隔 最小值5秒 idea不生效-->
<Configuration status="warn" monitorInterval="5">

<!--此文件中的全局属性配置-->
<properties>
<property name="LOG_PATH" value="d:/test/SpringBootLog"/>
</properties>

<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n"/>
</Console>
</Appenders>

<Appenders>
<!--拆分日志-->
<RollingFile name="rollingFile"
fileName="${LOG_PATH}/app.log"
filePattern="${LOG_PATH}/$${date:yyyy-MM}/app.%d{dd-HH-mm} %i.log">

<!--拦截器 如果等级为debug的放行 否则就禁止 可以单独禁止某一项-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>

<!--自定义日志输出格式-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n"/>

<!--拆分策略-->
<Policies>
<!--系统启动时 触发拆分规则 产生一个新的日志文件-->
<OnStartupTriggeringPolicy/>

<!--按照时间节点拆分 就是filePattern定义的-->
<TimeBasedTriggeringPolicy/>

<!--单文件最大100m-->
<SizeBasedTriggeringPolicy size="1MB"/>
</Policies>

<!--统一目录下 最多生成10个文件-->
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>

<Loggers>
<Root level="info">
<AppenderRef ref="consoleAppender"/>
<AppenderRef ref="rollingFile"/>
</Root>
</Loggers>
</Configuration>
  • 想要其他的配置,就把基础篇中对应的内容搬过来即可
  • 注意点:这个
    log4j2.xml
    文件中配置了如下内容的话:
<properties>
<property name="LOG_PATH" value="d:/test/SpringBootLog"/>
</properties>
  • 那么别傻不拉几的在yml中又配置如下内容( 或者要都配置的话,那么保证两个路径一样,不然报N多
    ERROR / cause by: not found xxxxxxx
    具体报的是什么忘了,总之貌似是
    Failed to load log4j2 configurationerror detected
    ,具体英文是什么忘了,大概意思就是
    检测到log4j2.xml
    加载失败
# 日志配置
logging:
file:
path: "d:/test/SpringBootLog"

测试

@Test
void slf4jAndLog4j2Test() {
// 是org.slf4j包下的
org.slf4j.Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}

结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: