SpringBoot整合logback-spring.xml配置

    技术2023-06-16  82

    SpringBoot整合Logback

    集成到springboot的yml格式配置文件的示例logback的具体配置创建Log.java工具类测试

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

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

    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:日志消息,%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>

    创建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"); } }
    Processed: 0.029, SQL: 9