SpringBoot整合Logback
集成到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>