logback:
path: /data/logs
serviceName: demo-sdk
logging:
config: classpath:logback/logback-spring.xml
level:
dao: debug
org:
mybatis: debug
<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">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %highlight(%msg) %npattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="service_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${path}/logback-${serviceName}.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${path}/service/logback-${serviceName}.%d{yyyy-MM-dd}.%i.log.zipfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>180maxHistory>
rollingPolicy>
<encoder>
<pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%npattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="spring_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${path}/logback-springFrameWork.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${path}/spring/logback-springFrameWork.%d{yyyy-MM-dd}.%i.log.zipfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>180maxHistory>
rollingPolicy>
<encoder>
<pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%npattern>
<charset>UTF-8charset>
encoder>
appender>
<root level="debug">
<appender-ref ref="STDOUT"/>
root>
<appender name="oper_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${path}/interface-${serviceName}.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${path}/service/interface-${serviceName}.%d{yyyy-MM-dd}.%i.log.zipfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>180maxHistory>
rollingPolicy>
<encoder>
<pattern>%msg%npattern>
encoder>
appender>
<logger name="oper_file">
<appender-ref ref="oper_file">appender-ref>
logger>
<logger name="com.demo" level="DEBUG" additivity="true">
<appender-ref ref="service_file">appender-ref>
logger>
<logger name="org.springframework" level="info" additivity="true">
<appender-ref ref="spring_file">appender-ref>
logger>
configuration>
package com.demo.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Description: [log日志工厂类]
*/
public class Log {
/**
* Discription:[获得Logger]
*
* @param clazz 日志发出的类
* @return
*/
public static Logger get(Class<?> clazz) {
return LoggerFactory.getLogger(clazz);
}
/**
* Discription:[获得Logger]
*
* @param name 自定义的日志发出者名称
* @return
*/
public static Logger get(String name) {
return LoggerFactory.getLogger(name);
}
/**
* Discription:[获得日志,自动判定日志发出者]
*
* @return
*/
public static Logger get() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
return LoggerFactory.getLogger(stackTrace[2].getClassName());
}
/**
* Discription:[Trace等级日志,小于debug--由于动态获取Logger,效率较低,建议在非频繁 调用的情况下使用!!]
*
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void trace(String format, Object... arguments) {
trace(innerGet(), format, arguments);
}
/**
* Discription:[Trace等级日志,小于Debug]
*
* @param log 日志对象
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void trace(Logger log, String format, Object... arguments) {
log.trace(format, arguments);
}
/**
* Discription:[Debug等级日志,小于Info--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void debug(String format, Object... arguments) {
debug(innerGet(), format, arguments);
}
/**
* Discription:[Debug等级日志,小于Info]
*
* @param log 日志对象
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void debug(Logger log, String format, Object... arguments) {
log.debug(format, arguments);
}
/**
* Discription:[Info等级日志,小于Warn--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void info(String format, Object... arguments) {
info(innerGet(), format, arguments);
}
/**
* Discription:[Info等级日志,小于Warn]
*
* @param log 日志对象
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void info(Logger log, String format, Object... arguments) {
log.info(format, arguments);
}
/**
* Discription:[Warn等级日志,小于Error--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void warn(String format, Object... arguments) {
warn(innerGet(), format, arguments);
}
/**
* Discription:[Warn等级日志,小于Error]
*
* @param log 日志对象
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void warn(Logger log, String format, Object... arguments) {
log.warn(format, arguments);
}
/**
* Discription:[Warn等级日志,小于Error--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param e 需在日志中堆栈打印的异常
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void warn(Throwable e, String format, Object... arguments) {
warn(innerGet(), e, format(format, arguments));
}
/**
* Discription:[Warn等级日志,小于Error]
*
* @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);
}
/**
* Discription:[Error等级日志--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void error(String format, Object... arguments) {
error(innerGet(), format, arguments);
}
/**
* Discription:[Error等级日志]
*
* @param log 日志对象
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void error(Logger log, String format, Object... arguments) {
log.error(format, arguments);
}
/**
* Discription:[Error等级日志--由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!]
*
* @param e 需在日志中堆栈打印的异常
* @param format 格式文本,{} 代表变量
* @param arguments 变量对应的参数
*/
public static void error(Throwable e, String format, Object... arguments) {
error(innerGet(), e, format(format, arguments));
}
/**
* Discription:[Error等级日志 ]
*
* @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);
}
/**
* Discription:[格式化文本]
*
* @param template 文本模板,被替换的部分用 {} 表示
* @param values 参数值
* @return 格式化后的文本
*/
private static String format(String template, Object... values) {
return String.format(template.replace("{}", "%s"), values);
}
/**
* Discription:[获得日志,自动判定日志发出者]
*
* @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");
}
}