日志框架之Logback

2022-07-15  本文已影响0人  Tinyspot

1. Logback

2. Logger, Appenders and Layouts

3. Logback多环境配置

<springProfile name="prod">
    <root level="error">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</springProfile>
<springProfile name="dev,test">
    <root level="INFO">...</root>
</springProfile>

启动方式:
方式一:java -jar xxx.jar –spring.profiles.active=prod
方式二:在 application.properties 中配置 logging.config=classpath:logback-spring.xml

4. 打印日志的规范准则

4.1 占位符

// 参数化形式{}占位,[] 进行参数隔离
logger.info("name:{}, age:{}", "tinyspot", "20");
logger.info("name:{}, age:{}", new Object[]{"tinyspot", "20"});
logger.info("call method, with args: [{}], [{}]", user, result);

4.2 打印异常栈

try {
    Class.forName("classname");
} catch (ClassNotFoundException e) {
    // e.printStackTrace();
    // logger.info("出现异常:{}", e);  有问题,e是引用类型对象,不能和前面的 {} 做字符串拼接
    logger.info("出现异常:", e);
}

4.3 日志级别判断

// 为什么要提前判断isDebugEnabled()
if (log.isDebugEnabled()) {
    // 没使用占位符 {},直接字符串拼接损耗性能
    log.debug("hello, this is " + name);
}

// 使用 {},JVM执行到这时不会进行字符串拼接,且日志框架会自动判断DEBUG有没有开启
log.debug("hello, this is {}", name);

5. logback.xml

5.1 Layouts

Conversion Word Definition
c{length}
lo{length}
logger{length}
logger name
return the sub-string right to the rightmost dot character in the logger name
C{length}
class{length}
fully-qualified class name
m / msg / message 日志内容,logger.info("message:{}", "tinyspot");
M / method
d{pattern}
date{pattern}
d{pattern, timezone}
date{pattern, timezone}
%d{yyyy-MM-dd HH:mm:ss.SSS}
n "\r\n"
L / line the line number
t / thread the name of the thread

补充:转换器算法
The converter's abbreviation algorithm

5.2 自定义 Logger

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- 通过`${name}`取得 value 值 (EL表达式) -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
    <property name="fileDir" value="/Users/tinyspot/Downloads"></property>
    <!-- appender设置日志输出的位置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <traget>System.err</traget>  <!-- System.out 默认黑色;System.err 红色 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>  <!-- 引用 property 配置中的 ${pattern} -->
        </encoder>
    </appender>
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <file>${fileDir}/mylog.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    <!-- RollingFileAppender常用,日志要有滚动策略,避免单个文件过大 -->
    <appender name="rollingAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${fileDir}/roll.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!-- 指定拆分规则 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${fileDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>  <!-- %i 表示序号 -->
            <maxFileSize>1KB</maxFileSize>
        </rollingPolicy>
    </appender>
    <!-- 自定义logger, additivity=false 不会重复记录 -->
    <!-- name="路径"  默认有父子关系 -->
    <!-- additivity:false 表示不继承 rootLogger -->
    <logger name="com.demo" level="info" additivity="false">
        <appender-ref ref="consoleAppender" />
    </logger>
    <!-- 日志记录器,root 即 rootLogger -->
    <!--  level: 日志级别,ALL表示所有日志级别 -->
    <root level="ALL">
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="fileAppender" />
        <appender-ref ref="rollingAppender" />
    </root>
</configuration>

Log4j 改造为 logback

上一篇下一篇

猜你喜欢

热点阅读