SpringBoot配置logback日志一些方法

一、SpringBoot配置指定某一个类的log输出到指定目录或文件里

在logback-spring.xml中 ,新增一个logger,并指定其appender。

<!--  定义日志存储的地址 -->

    <property name="log_address" value="logs/iclass_web_service/info"/>

    <!-- log info start -->
    <appender name="LOG_VERIFY_CODE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log_address}/verify-code-%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>
                <pattern>
                    %msg%n
                </pattern>
                <charset>UTF-8</charset>
            </pattern>
        </encoder>

    </appender>
<!--  定义打印日志的类 -->
    <logger name="com.server.commons.utils.log.VerifyCodeLog" level="INFO">
        <appender-ref ref="LOG_VERIFY_CODE"/>
    </logger>

这里需要注意三点:1 将value里日志存储的地址设置好,2 在logger name里指定要打印log的类在项目里的位置,3 appender指定一下。
appender呢是负责写日志的组件(具体可以去看看java school里的log教程:http://www.51gjie.com/javaweb/1110.html)。主要有三种
ConsoleAppender: 把日志打印到控制台;FileAppender: 把日志输出到文件;RollingFileAppender: 滚动记录地把日志输出到文件, 也就是可以支持日志文件按文件大小拆分,或者按日期拆分。按需选择就好。
最后,在指定的类里修改一下getlogger
private Logger logger = LoggerFactory.getLogger(VerifyCodeLog.class);

二、SpringBoot配置以json格式输出日志

这个两种方法可参考
第一种:采用logstash-logback-encoder来实现JSON日志输出
引入一下依赖:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>
<!--springboot日志-start-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

配置一下logback-spring.xml

<!--  定义日志存储的地址 -->

    <property name="log_address" value="logs/iclass_web_service/info"/>

    <!-- log info start -->
    <appender name="log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log_address}/verify-code-info.%d{yyyy-MM-dd}.log
            </FileNamePattern>
        </rollingPolicy>


        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <pattern>
                    <pattern>
                        { "time":"%d{yyyy-MM-dd HH:mm:ss}",
                          "message": "%message"}
                        %n
                    </pattern>
                </pattern>
            </providers>
        </encoder>
        
    </appender>
    <logger name="com.server.commons.utils.log.VerifyCodeLog" level="INFO">
        <appender-ref ref="log"/>
    </logger>

最后,在指定的类里修改一下getlogger
private Logger logger = LoggerFactory.getLogger(VerifyCodeLog.class);

第二种:直接在类里使用JSONObject
对于要log的message,直接创建一个json object,把需要的message put进去

public class VerifyCodeLog {

    private static VerifyCodeLog instance = new VerifyCodeLog();

    private Logger logger = LoggerFactory.getLogger(VerifyCodeLog.class);

    public void info(String msg) {
        logger.info(msg);
    }

    public static void log(String phone,String msg) {
        JSONObject object = new JSONObject();
        object.put("time",time);
        object.put("msg",msg);
        instance.info(object.toJSONString());
    }
}
public SendVerifyCodeResponse sendVerifyCode(SendVerifyCodeRequest request) {
        String phone= request.getPhone();
        SmsResponse smsResponse = verifyCodeManager.sendVerifyCode(phone, verifyCode);
        int errorCode = smsResponse.getError();
        if (errorCode == 0) {
            VerifyCodeLog.log(System.currentTimeMillis(),phone);
        return new SendVerifyCodeResponse();
    }

然后,配置一下logback-spring.xml,这里就只需要一般配置就好了

<!--  定义日志存储的地址 -->

    <property name="log_address" value="logs/iclass_web_service/info"/>

    <!-- log info start -->
    <appender name="LOG_VERIFY_CODE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log_address}/verify-code-%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>
                <pattern>
                    %msg%n
                </pattern>
                <charset>UTF-8</charset>
            </pattern>
        </encoder>

    </appender>
    <logger name="com.server.commons.utils.log.VerifyCodeLog" level="INFO">
        <appender-ref ref="LOG_VERIFY_CODE"/>
    </logger>

这里如果从业务角度考虑,会比较推荐使用第二种方法,因为logstash是可以配置把log打到第三方服务的,只是logjson的话没必要引入一个大的中间件,会把服务加重。

三、一些滚动策略配置的简单介绍

TimeBasedRollingPolicy:

  1. fileNamePattern(必填),由文件名加上一个%d的占位符。可指定日期格式,时区
  2. maxHistory(选填),int值,指定log文件最大保留历史
  3. totalSizeCap(选填),int,归档文件的最大size
  4. cleanHistoryOnStart(选填),Boolean,在appender启动时,是否删除归档文件

FixedWindowRollingPolicy:
1. minIndex:窗口索引最小值,maxIndex:窗口索引最大值,太大时默认为20
2. fileNamePattern:必须包含“%i”作为占位符,xxx.log-%i.log归档文件会从xxx.log-minIndex.log到xxx.log-maxIndex.log

SizeAndTimeBasedRollingPolicy:
和TimeBased差不多,不过多了个size限制
1.maxFileSize:文件最大size

官方超详细https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy

SizeBasedTriggeringPolicy:

观察当前活动文件的大小,如果已经大于了指定的值,它会给 RollingFileAppender 发一个信号触发对当前活动文件的轮转。http://www.51gjie.com/javaweb/1120.html