SpringBoot整合logback-spring.xml配置

集成到springboot的yml格式配置文件的示例

logback:
  path: /data/logs
  serviceName: demo-sdk
logging:
  config: classpath:logback/logback-spring.xml
  level:
    dao: debug
    org:
      mybatis: debug

logback的具体配置一(按路径打印日志文件)

(文件名要与yml文件中的一致,且不能以logback.xml命名)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <springProperty scope="context" name="serviceName" source="logback.serviceName"/>
    <springProperty scope="context" name="path" source="logback.path"/>

    <!--控制台日志打印格式-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %highlight(%msg) %n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
    </appender>

    <!--服务日志-->
    <appender name="service_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/logback-${serviceName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--当日志文件大小达到最大值时,进行压缩归档-->
            <fileNamePattern>${path}/service/logback-${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志文件最大值-->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>

        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
    </appender>

    <!--spring框架日志-->
    <appender name="spring_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/logback-springFrameWork.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/spring/logback-springFrameWork.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
    </appender>

    <!--开发环境:打印控制台-->
    <!--<springProfile name="dev">-->
        <!--<logger name="com.demo.dao.mapper" level="debug"/>-->
    <!--</springProfile>-->
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>



    <!--操作日志-->
    <appender name="oper_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/interface-${serviceName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${path}/service/interface-${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <!--操作日志记录-->
    <logger name="oper_file">
        <appender-ref ref="oper_file"></appender-ref>
    </logger>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
    -->
    <!--服务日志,com.demo包下的日志输出到服务日志文件中-->
    <logger name="com.demo" level="DEBUG"  additivity="true">
        <appender-ref ref="service_file"></appender-ref>
    </logger>
    <!--spring框架日志,com.springframework框架中的日志输出到spring框架日志文件中-->
    <logger name="org.springframework" level="info"  additivity="true">
        <appender-ref ref="spring_file"></appender-ref>
    </logger>
</configuration>

logback的具体配置二(按日志的级别打印日志文件)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <springProperty scope="context" name="serviceName" source="logback.serviceName"/>
    <springProperty scope="context" name="path" source="logback.path"/>

    <!--控制台日志打印格式-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%highlight高亮,%logger{50}类名,%line行数,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%line) - %highlight(%msg) %n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!--打印DEBUG级以上的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!--ERROR日志-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/error-${serviceName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--当日志文件大小达到最大值时,进行压缩归档-->
            <fileNamePattern>${path}/error/${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志文件最大值-->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>

        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>

        <!-- 过滤方式:门槛过滤,只记录ERROR级别以上的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!--INFO日志-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/info-${serviceName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--当日志文件大小达到最大值时,进行压缩归档-->
            <fileNamePattern>${path}/info/${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志文件最大值-->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>

        <!-- 过滤方式:匹配过滤,对匹配到的日志执行匹配策略 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 匹配级别 -->
            <level>DEBUG</level>
            <!-- 匹配到的执行策略 -->
            <onMatch>DENY</onMatch>
            <!-- 不匹配的执行策略 -->
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>
    <!--  DAO的包进行DEBUG日志设置  -->
    <logger name="com.demo.dao" level="DEBUG" />

    <root>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="error_file" />
        <appender-ref ref="info_file" />
    </root>
</configuration>

创建Log.java工具类

package com.demo.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

    /**
    * <p>Description: [log日志工厂类]</p>
    */
    public class Log {

        /**
    * <p>Discription:[获得Logger]</p>
    *
    * @param clazz 日志发出的类
    * @return
    */
    public static Logger get(Class<?> clazz) {
        return LoggerFactory.getLogger(clazz);
    }

    /**
    * <p>Discription:[获得Logger]</p>
    *
    * @param name 自定义的日志发出者名称
    * @return
    */
    public static Logger get(String name) {
        return LoggerFactory.getLogger(name);
    }

    /**
    * <p>Discription:[获得日志,自动判定日志发出者]</p>
    *
    * @return
    */
    public static Logger get() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LoggerFactory.getLogger(stackTrace[2].getClassName());
    }

    /**
    * <p>Discription:[Trace等级日志,小于debug--由于动态获取Logger,效率较低,建议在非频繁 调用的情况下使用!!]</p>
    *
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void trace(String format, Object... arguments) {
        trace(innerGet(), format, arguments);
    }

    /**
    * <p>Discription:[Trace等级日志,小于Debug]</p>
    *
    * @param log 日志对象
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void trace(Logger log, String format, Object... arguments) {
        log.trace(format, arguments);
    }

    /**
    * <p>Discription:[Debug等级日志,小于Info--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void debug(String format, Object... arguments) {
        debug(innerGet(), format, arguments);
    }

    /**
    * <p>Discription:[Debug等级日志,小于Info]</p>
    *
    * @param log 日志对象
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void debug(Logger log, String format, Object... arguments) {
        log.debug(format, arguments);
    }
        
    /**
    * <p>Discription:[Info等级日志,小于Warn--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void info(String format, Object... arguments) {
        info(innerGet(), format, arguments);
    }

    /**
    * <p>Discription:[Info等级日志,小于Warn]</p>
    *
    * @param log 日志对象
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void info(Logger log, String format, Object... arguments) {
        log.info(format, arguments);
    }

    /**
    * <p>Discription:[Warn等级日志,小于Error--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void warn(String format, Object... arguments) {
        warn(innerGet(), format, arguments);
    }

    /**
    * <p>Discription:[Warn等级日志,小于Error]</p>
    *
    * @param log 日志对象
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void warn(Logger log, String format, Object... arguments) {
        log.warn(format, arguments);
    }

    /**
    * <p>Discription:[Warn等级日志,小于Error--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param e 需在日志中堆栈打印的异常
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void warn(Throwable e, String format, Object... arguments) {
        warn(innerGet(), e, format(format, arguments));
    }

    /**
    * <p>Discription:[Warn等级日志,小于Error]</p>
    *
    * @param log 日志对象
    * @param e 需在日志中堆栈打印的异常
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void warn(Logger log, Throwable e, String format, Object... arguments) {
        log.warn(format(format, arguments), e);
    }

    /**
    * <p>Discription:[Error等级日志--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void error(String format, Object... arguments) {
        error(innerGet(), format, arguments);
    }

    /**
    * <p>Discription:[Error等级日志]</p>
    *
    * @param log 日志对象
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void error(Logger log, String format, Object... arguments) {
        log.error(format, arguments);
    }

    /**
    * <p>Discription:[Error等级日志--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]</p>
    *
    * @param e 需在日志中堆栈打印的异常
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void error(Throwable e, String format, Object... arguments) {
        error(innerGet(), e, format(format, arguments));
    }

    /**
    * <p>Discription:[Error等级日志 ]</p>
    *
    * @param log 日志对象
    * @param e 需在日志中堆栈打印的异常
    * @param format 格式文本,{} 代表变量
    * @param arguments 变量对应的参数
    */
    public static void error(Logger log, Throwable e, String format, Object... arguments) {
        log.error(format(format, arguments), e);
    }

    /**
    * <p>Discription:[格式化文本]</p>
    *
    * @param template 文本模板,被替换的部分用 {} 表示
    * @param values 参数值
    * @return 格式化后的文本
    */
    private static String format(String template, Object... values) {
        return String.format(template.replace("{}", "%s"), values);
    }

    /**
    * <p>Discription:[获得日志,自动判定日志发出者]</p>
    *
    * @return
    */
    private static Logger innerGet() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LoggerFactory.getLogger(stackTrace[3].getClassName());
    }
}


测试

import org.slf4j.Logger;
import com.demo.common.utils.Log;

public class LogDemo {

	private static Logger log = Log.get(CustomerServiceImpl.class);

    public static void main(String[] args) {
    	Log.debug(log, "\n 方法[{}],入参:[{}][{}]", "LogDemo-main", "参数1","参数2");
        log.debug("debug");
    }
}

适用的logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <springProperty scope="context" name="serviceName" source="logback.serviceName"/>
    <springProperty scope="context" name="path" source="logback.path"/>

    <!--控制台日志打印格式-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%highlight高亮,%logger{50}类名,%line行数,%n是换行符-->
            <pattern>%d{ISO8601} [%thread] %highlight(%-5level) %cyan(%logger{50}:%line) - %highlight(%msg) %n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!--打印DEBUG级以上的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!--ERROR日志-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/${serviceName}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--当日志文件大小达到最大值时,进行压缩归档-->
            <fileNamePattern>${path}/error/${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志文件最大值-->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>

        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{ISO8601} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>

        <!-- 过滤方式:门槛过滤,只记录ERROR级别以上的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!--INFO日志-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${path}/${serviceName}-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--当日志文件大小达到最大值时,进行压缩归档-->
            <fileNamePattern>${path}/info/${serviceName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志文件最大值-->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{ISO8601} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
    </appender>

    <!--  DAO的包进行DEBUG日志设置  -->
    <logger name="com.jtlsp.schedul.dao" level="DEBUG" />

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="error_file" />
        <appender-ref ref="info_file" />
    </root>
</configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值