1.sofaboot4与springboot3集成

springboot3.x集成sofaboot4.x

查看官网文档:https://www.sofastack.tech/projects/sofa-boot/quick-start/

环境

  • springboot:3.4.3
  • springcloud: 2023.0.3
  • springcloud-alibaba: 2023.0.1.2
  • sofaboot: 4.3.0

根据官方文档先创建一个springboot项目,然后添加sofaboot依赖,如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>${spring.boot.version}</version>
    <relativePath/> 
</parent>

替换为:

<parent>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofaboot-dependencies</artifactId>
    <version>${sofa.boot.version}</version>
</parent>

添加依赖:

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>actuator-sofa-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置log4j2日志

排除默认的logback日志依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
    <exclusion>
        <artifactId>spring-boot-starter-logging</artifactId>
        <groupId>org.springframework.boot</groupId>
    </exclusion>
</exclusions>
</dependency>

添加log4j2依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

添加log4j2配置文件,resources目录下新建log4j2-spring.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-spring-boot</artifactId>
</dependency>
  • disruptor: 异步日志
  • log4j-spring-boot: springboot集成log4j2日志,可以使用springboot配置文件中的配置

添加log4j2-spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration  monitorInterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--变量配置-->
    <Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
        <Property name="LOG_LEVEL_PATTERN">%5p</Property>
        <Property name="LOG_DEFAULT_DATE_FORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
        <Property name="LOG_PATTERN">%clr{%d{${sys:LOG_DEFAULT_DATE_FORMAT_PATTERN}}}{faint} %clr{${sys:LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
        <Property name="FILE_LOG_PATTERN">%d{${sys:LOG_DEFAULT_DATE_FORMAT_PATTERN}} ${sys:LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>

        <!-- 应用名称 -->
        <Property name="CHAR_SET">UTF-8</Property>
        <!-- 引用Spring上下文中的属性 -->
        <Property name="MODULE_LOGGING_PATH">${spring:logging.path}</Property>
        <Property name="APPLICATION_NAME">${spring:spring.application.name}</Property>
        <!--修改日志等级 的包名-->
        <Property name="APPLICATION_LOG_LEVEL">${spring:logging.level.cn.com.accumulate.admin}</Property>
        <Property name="ROOT_LOG_LEVEL">${spring:logging.level.root}</Property>
    </Properties>

    <Appenders>
        <!-- 控制台输出 -->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </console>

        <!--spring -->
        <RollingFile name="SPRING-APPENDER" fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/spring.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/spring.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="UTF-8"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
        </RollingFile>

        <!-- mybatis.log -->
        <!--        <RollingFile name="MYBATIS-APPENDER" fileName="${MODULE_LOGGING_PATH}/mybatis.log"-->
        <!--                     filePattern="${MODULE_LOGGING_PATH}/mybatis.log.%d{yyyy-MM-dd}"-->
        <!--                     append="true">-->
        <!--            <PatternLayout-->
        <!--                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"-->
        <!--                    charset="UTF-8"/>-->
        <!--            <TimeBasedTriggeringPolicy/>-->
        <!--            <DefaultRolloverStrategy/>-->
        <!--        </RollingFile>-->

        <!-- app-default.log -->
        <RollingFile name="ACCUMULATE-APP-DEFAULT-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/app-default.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/app-default.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="UTF-8"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
        </RollingFile>

        <!-- common-error.log -->
        <RollingFile name="ACCUMULATE-ERROR-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/common-error.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/common-error.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
<!--            <ThresholdFilter level="ERROR"/>-->
        </RollingFile>

        <!--biz.log-->
        <RollingFile name="ACCUMULATE-BUSINESS-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/biz.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/biz.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
<!--            <ThresholdFilter level="ERROR"/>-->
        </RollingFile>

        <!--biz-digest.log-->
        <RollingFile name="ACCUMULATE-BUSINESS-DIGEST-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/biz-digest.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/biz-digest.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
<!--            <ThresholdFilter level="ERROR"/>-->
        </RollingFile>

        <!--core.log-->
        <RollingFile name="ACCUMULATE-CORE-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/core.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/core.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
        </RollingFile>

        <!--core-digest.log-->
        <RollingFile name="ACCUMULATE-CORE-DIGEST-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/core-digest.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/core-digest.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
<!--            <ThresholdFilter level="ERROR"/>-->
        </RollingFile>

        <!--nacos-digest.log-->
        <RollingFile name="ACCUMULATE-NACOS-DIGEST-APPENDER"
                     fileName="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/nacos-digest.log"
                     filePattern="${MODULE_LOGGING_PATH}/${APPLICATION_NAME}/nacos-digest.log.%d{yyyy-MM-dd}"
                     append="true">
            <PatternLayout
                    pattern="%d [%X{traceId} %X{rpcId} - %X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n%throwable"
                    charset="${CHAR_SET}"/>
            <TimeBasedTriggeringPolicy/>
            <DefaultRolloverStrategy/>
<!--            <ThresholdFilter level="ERROR"/>-->
        </RollingFile>
    </Appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <Loggers>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <!--        <AsyncLogger name="org.mybatisflex" level="info" additivity="false">-->
        <!--            <AppenderRef ref="Console"/>-->
        <!--            <AppenderRef ref="MYBATIS-APPENDER"/>-->
        <!--        </AsyncLogger>-->

        <!--spring 相关日志-->
        <!--若是additivity设为false,则子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <AsyncLogger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="SPRING-APPENDER"/>
        </AsyncLogger>
        <AsyncLogger name="com.alibaba.nacos" level="trace" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="ACCUMULATE-NACOS-DIGEST-APPENDER"/>
        </AsyncLogger>

        <!--应用模块日志-->
        <!-- 需要修改每个模块的基础包名 -->
        <AsyncLogger name="cn.com.accumulate" additivity="false"
                     level="${APPLICATION_LOG_LEVEL}">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="ACCUMULATE-APP-DEFAULT-APPENDER"/>
            <AppenderRef ref="ACCUMULATE-ERROR-APPENDER"/>
        </AsyncLogger>

        <!--业务日志-->
        <AsyncLogger name="ACCUMULATE-BUSINESS-DETAIL-LOG" additivity="false" level="${APPLICATION_LOG_LEVEL}">
            <AppenderRef ref="ACCUMULATE-ERROR-APPENDER"/>
            <AppenderRef ref="ACCUMULATE-BUSINESS-APPENDER"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <AsyncLogger name="ACCUMULATE-BUSINESS-DIGEST-LOG" additivity="false" level="${APPLICATION_LOG_LEVEL}">
            <AppenderRef ref="ACCUMULATE-ERROR-APPENDER"/>
            <AppenderRef ref="ACCUMULATE-BUSINESS-DIGEST-APPENDER"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <AsyncLogger name="ACCUMULATE-CORE-DETAIL-LOG" additivity="false" level="info">
            <AppenderRef ref="ACCUMULATE-ERROR-APPENDER"/>
            <AppenderRef ref="ACCUMULATE-CORE-APPENDER"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <AsyncLogger name="ACCUMULATE-CORE-DIGEST-LOG" additivity="false" level="${APPLICATION_LOG_LEVEL}">
            <AppenderRef ref="ACCUMULATE-ERROR-APPENDER"/>
            <AppenderRef ref="ACCUMULATE-CORE-DIGEST-APPENDER"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <Root level="${ROOT_LOG_LEVEL}" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="ACCUMULATE-APP-DEFAULT-APPENDER"/>
        </Root>
    </Loggers>
</Configuration>

新增application.properties配置文件

# 日志级别
spring.application.name=accumulate-admin
logging.path=./logs
logging.config=classpath:log4j2-spring.xml

这三行配置是必须的,配置以后sofaboot相关的日志也会在这个路径下创建

/images/sofaboot/1-1.jpg

日志文件配置成功,这里没有使用官方提供的 com.alipay.sofa.common.log.LoggerSpaceManager#getLoggerBySpace(java.lang.String, java.lang.String) 获取日志对象,而是使用 org.slf4j.LoggerFactory#getLogger(java.lang.String) 获取日志对象

测试日志打印功能并输出到core.log文件中

/images/sofaboot/1-2.jpg

启动项目后查看控制台日志与core.log文件

/images/sofaboot/1-3.jpg

这里业务日志分不同文件记录在将来配置监控系统的时候非常有帮助,直接监听你要监控的日志文件即可,并且可以随着你的业务的增长自动扩展

参考文档

扩展类文件

AdminCommonConfig.java

package cn.com.accumulate.admin.config.nacos;

import cn.com.accumulate.admin.utils.LoggerClient;
import cn.com.accumulate.common.log.LoggerUtil;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import lombok.Data;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author 紫滨
 * @date 2025/1/22
 */
@Getter
@Component
@ConfigurationProperties(prefix = "common")
@NacosConfigurationProperties(dataId = "accumulate-admin-common.yaml", autoRefreshed = true)
public class AdminCommonConfig {

    /**
     * -- GETTER --
     *  Getter method for property <tt>version</tt>.
     *
     * @return property value of version
     */
    private String version;

    /**
     * -- GETTER --
     *  Getter method for property <tt>env</tt>.
     *
     * @return property value of env
     */
    private String env;

    /**
     * -- GETTER --
     *  Getter method for property <tt>isOpen</tt>.
     *
     * @return property value of isOpen
     */
    private String isOpen;

    /**
     * -- GETTER --
     *  Getter method for property <tt>myConfig</tt>.
     *
     * @return property value of myConfig
     */
    private String myConfig;

    /**
     * Setter method for property <tt>version</tt>.
     *
     * @param version value to be assigned to property version
     */
    public void setVersion(String version) {
        LoggerUtil.info(LoggerClient.CORE_DETAIL_LOG, "配置更新前值:{0}", this.version);
        this.version = version;
        LoggerUtil.info(LoggerClient.CORE_DETAIL_LOG, "配置更新后值:{0}", this.version);
    }

    /**
     * Setter method for property <tt>env</tt>.
     *
     * @param env value to be assigned to property env
     */
    public void setEnv(String env) {
        this.env = env;
    }

    /**
     * Setter method for property <tt>isOpen</tt>.
     *
     * @param isOpen value to be assigned to property isOpen
     */
    public void setIsOpen(String isOpen) {
        this.isOpen = isOpen;
    }

    /**
     * Setter method for property <tt>myConfig</tt>.
     *
     * @param myConfig value to be assigned to property myConfig
     */
    public void setMyConfig(String myConfig) {
        this.myConfig = myConfig;
    }

    @Override
    public String toString() {
        return "AdminCommonConfig{" +
                "version='" + version + '\'' +
                ", env='" + env + '\'' +
                ", isOpen='" + isOpen + '\'' +
                ", myConfig='" + myConfig + '\'' +
                '}';
    }
}

LoggerUtil.java

package cn.com.accumulate.common.log;

import cn.com.accumulate.common.util.MessageUtil;
import com.google.common.base.Joiner;
import org.slf4j.Logger;

/**
 * @author 紫滨
 * @date 2024/12/31
 */
public class LoggerUtil {

    /**
     * 输出info level的log信息.
     *
     * @param logger
     * @param message log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params  log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void info(Logger logger, String message, Object... params) {
        if (logger.isInfoEnabled()) {
            logger.info(format(message, params));
        }
    }

    /**
     * 将入参str拼接起来输出
     *
     * @param logger
     * @param msgs
     */
    public static void infoWithStrs(Logger logger, Object... msgs) {
        if (logger.isInfoEnabled()) {
            logger.info(Joiner.on("").skipNulls().join(msgs));
        }
    }

    /**
     * 输出warn level的log信息.
     *
     * @param message log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params  log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void warn(Logger logger, String message, Object... params) {
        Throwable t = getThrowable(params);
        if (null == t) {
            logger.warn(format(message, params));
        } else {
            logger.warn(format(message, params), t);
        }
    }

    /**
     * 将入参str拼接起来输出
     *
     * @param logger
     * @param msgs
     */
    public static void warnWithStrs(Logger logger, Object... msgs) {
        if (logger.isWarnEnabled()) {
            logger.warn(Joiner.on("").skipNulls().join(msgs));
        }
    }

    /**
     * 将入参str拼接起来输出
     *
     * @param logger
     * @param msgs
     */
    public static void warnWithStrs(Logger logger, Throwable t, Object... msgs) {
        if (logger.isWarnEnabled()) {
            logger.warn(Joiner.on("").skipNulls().join(msgs), t);
        }
    }

    /**
     * 输出warn level的log信息.
     *
     * @param throwable 异常对象
     * @param message   log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params    log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void warn(Logger logger, Throwable throwable, String message, Object... params) {
        logger.warn(format(message, params), throwable);
    }

    /**
     * 输出debug level的log信息.
     *
     * @param message log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params  log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void debug(Logger logger, String message, Object... params) {
        if (logger.isDebugEnabled()) {
            logger.debug(format(message, params));
        }
    }


    /**
     * 输出warn level的log信息.
     *
     * @param throwable 异常对象
     * @param message   log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params    log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void debug(Logger logger, Throwable throwable, String message, Object... params) {
        logger.debug(format(message, params), throwable);
    }

    /**
     * 将入参str拼接起来输出
     *
     * @param logger
     * @param msgs
     */
    public static void debugWithStrs(Logger logger, Object... msgs) {
        if (logger.isDebugEnabled()) {
            logger.debug(Joiner.on("").skipNulls().join(msgs));
        }
    }

    /**
     * 输出error level的log信息.
     *
     * @param message log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params  log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void error(Logger logger, String message, Object... params) {
        Throwable t = getThrowable(params);
        if (null == t) {
            logger.error(format(message, params));
        } else {
            logger.error(format(message, params), t);
        }
    }

    public static void error(Logger logger, Throwable t) {
        if (logger.isErrorEnabled()) {
            logger.error("error", t);
        }
    }

    /**
     * 输出error level的log信息.
     *
     * @param throwable 异常对象
     * @param message   log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params    log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    public static void error(Logger logger, Throwable throwable, String message, Object... params) {
        logger.error(format(message, params), throwable);
    }

    public static void errorWithStrs(Logger logger, Object... msgs) {
        if (logger.isErrorEnabled()) {
            logger.error(Joiner.on("").skipNulls().join(msgs));
        }
    }

    public static void errorWithStrs(Logger logger, Throwable t, Object... msgs) {
        if (logger.isErrorEnabled()) {
            logger.error(Joiner.on("").skipNulls().join(msgs), t);
        }
    }

    /**
     * search throwable object from params
     *
     * @param params
     * @return
     */
    private static Throwable getThrowable(Object... params) {
        for (Object obj : params) {
            if (obj instanceof Throwable) {
                return (Throwable) obj;
            }
        }
        return null;
    }

    /**
     * 日志信息参数化格式化
     *
     * @param message log信息,如:<code>xxx{0},xxx{1}...</code>
     * @param params  log格式化参数,数组length与message参数化个数相同, 如:<code>Object[]  object=new Object[]{"xxx","xxx"}</code>
     */
    private static String format(String message, Object... params) {
        if (params != null && params.length != 0) {
            return MessageUtil.formatMessage(message, params);
        }
        return message;
    }

}

LoggerClient.java

package cn.com.accumulate.admin.utils;

import cn.com.accumulate.admin.constants.LoggerConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author 紫滨
 * @date 2024/12/31
 */
public class LoggerClient {

    /**
     * 请求相关日志
     */
    public static Logger ACCESS_LOG;

    /**
     * 业务详情日志
     */
    public static Logger BUS_DETAIL_LOG;

    /**
     * 业务摘要日志
     */
    public static Logger BUS_DIGEST_LOG;

    /**
     * 核心详情日志
     */
    public static Logger CORE_DETAIL_LOG;

    /**
     * 核心摘要日志
     */
    public static Logger CORE_DIGEST_LOG;

    /**
     * 缓存日志
     */
    public static Logger CACHE_DETAIL_LOG;

    /**
     * 外围调用日志
     */
    public static Logger INTEGRATION_LOG;

    /**
     * 消息发送明细日志
     */
    public static Logger MSG_PUB_DETAIL_LOG;

    /**
     * 消息消费明细日志
     */
    public static Logger MSG_SUB_DETAIL_LOG;

    /**
     * 异步执行器日志
     */
    public static Logger ASYNC_EXECUTOR_LOG;

    /**
     * 异步执行器摘要日志
     */
    public static Logger ASYNC_EXECUTOR_DIGEST_LOG;

    /**
     * 定时任务日志
     */
    public static Logger SCHEDULER_LOG;

    /**
     * 定时任务摘要日志
     */
    public static Logger SCHEDULER_DIGEST_LOG;


    
    private static final String BIZ_COMMON_SERVICE_SPACE = "accumulate-common-service";

    static {
        init();
    }

    public static void init() {
        setAccessLog(LoggerFactory.getLogger(LoggerConstants.ACCESS_LOG));
        setBusDetailLog(LoggerFactory.getLogger(LoggerConstants.BUS_DETAIL_LOG));
        setBusDigestLog(LoggerFactory.getLogger(LoggerConstants.BUS_DIGEST_LOG));
        setCoreDetailLog(LoggerFactory.getLogger(LoggerConstants.CORE_DETAIL_LOG));
        setCoreDigestLog(LoggerFactory.getLogger(LoggerConstants.CORE_DIGEST_LOG));
        setCacheDetailLog(LoggerFactory.getLogger(LoggerConstants.CACHE_DETAIL_LOG));
        setIntegrationLog(LoggerFactory.getLogger(LoggerConstants.INTEGRATION_LOG));
        setMsgPubDetailLog(LoggerFactory.getLogger(LoggerConstants.MSG_PUB_DETAIL_LOG));
        setMsgSubDetailLog(LoggerFactory.getLogger(LoggerConstants.MSG_SUB_DETAIL_LOG));
        setAsyncExecutorLog(LoggerFactory.getLogger(LoggerConstants.ASYNC_EXECUTOR_LOG));
        setAsyncExecutorDigestLog(LoggerFactory.getLogger(LoggerConstants.ASYNC_EXECUTOR_DIGEST_LOG));
        setSchedulerLog(LoggerFactory.getLogger(LoggerConstants.SCHEDULER_LOG));
        setSchedulerDigestLog(LoggerFactory.getLogger(LoggerConstants.SCHEDULER_DIGEST_LOG));
    }

    /**
     * Setter method for property <tt>ACCESS_LOG</tt>.
     *
     * @param accessLog value to be assigned to property ACCESS_LOG
     */
    public static void setAccessLog(Logger accessLog) {
        ACCESS_LOG = accessLog;
    }

    /**
     * Setter method for property <tt>BUS_DETAIL_LOG</tt>.
     *
     * @param busDetailLog value to be assigned to property BUS_DETAIL_LOG
     */
    public static void setBusDetailLog(Logger busDetailLog) {
        BUS_DETAIL_LOG = busDetailLog;
    }

    /**
     * Setter method for property <tt>BUS_DIGEST_LOG</tt>.
     *
     * @param busDigestLog value to be assigned to property BUS_DIGEST_LOG
     */
    public static void setBusDigestLog(Logger busDigestLog) {
        BUS_DIGEST_LOG = busDigestLog;
    }

    /**
     * Setter method for property <tt>CORE_DETAIL_LOG</tt>.
     *
     * @param coreDetailLog value to be assigned to property CORE_DETAIL_LOG
     */
    public static void setCoreDetailLog(Logger coreDetailLog) {
        CORE_DETAIL_LOG = coreDetailLog;
    }

    /**
     * Setter method for property <tt>CORE_DIGEST_LOG</tt>.
     *
     * @param coreDigestLog value to be assigned to property CORE_DIGEST_LOG
     */
    public static void setCoreDigestLog(Logger coreDigestLog) {
        CORE_DIGEST_LOG = coreDigestLog;
    }

    /**
     * Setter method for property <tt>CACHE_DETAIL_LOG</tt>.
     *
     * @param cacheDetailLog value to be assigned to property CACHE_DETAIL_LOG
     */
    public static void setCacheDetailLog(Logger cacheDetailLog) {
        CACHE_DETAIL_LOG = cacheDetailLog;
    }

    /**
     * Setter method for property <tt>INTEGRATION_LOG</tt>.
     *
     * @param integrationLog value to be assigned to property INTEGRATION_LOG
     */
    public static void setIntegrationLog(Logger integrationLog) {
        INTEGRATION_LOG = integrationLog;
    }




    /**
     * Setter method for property <tt>MSG_PUB_DETAIL_LOG</tt>.
     *
     * @param msgPubDetailLog value to be assigned to property MSG_PUB_DETAIL_LOG
     */
    public static void setMsgPubDetailLog(Logger msgPubDetailLog) {
        MSG_PUB_DETAIL_LOG = msgPubDetailLog;
    }

    /**
     * Setter method for property <tt>MSG_SUB_DETAIL_LOG</tt>.
     *
     * @param msgSubDetailLog value to be assigned to property MSG_SUB_DETAIL_LOG
     */
    public static void setMsgSubDetailLog(Logger msgSubDetailLog) {
        MSG_SUB_DETAIL_LOG = msgSubDetailLog;
    }



    /**
     * Setter method for property <tt>ASYNC_EXECUTOR_LOG</tt>.
     *
     * @param asyncExecutorLog value to be assigned to property ASYNC_EXECUTOR_LOG
     */
    public static void setAsyncExecutorLog(Logger asyncExecutorLog) {
        ASYNC_EXECUTOR_LOG = asyncExecutorLog;
    }

    /**
     * Setter method for property <tt>ASYNC_EXECUTOR_DIGEST_LOG</tt>.
     *
     * @param asyncExecutorDigestLog value to be assigned to property ASYNC_EXECUTOR_DIGEST_LOG
     */
    public static void setAsyncExecutorDigestLog(Logger asyncExecutorDigestLog) {
        ASYNC_EXECUTOR_DIGEST_LOG = asyncExecutorDigestLog;
    }



    /**
     * Setter method for property <tt>SCHEDULER_LOG</tt>.
     *
     * @param schedulerLog value to be assigned to property SCHEDULER_LOG
     */
    public static void setSchedulerLog(Logger schedulerLog) {
        SCHEDULER_LOG = schedulerLog;
    }

    /**
     * Setter method for property <tt>SCHEDULER_DIGEST_LOG</tt>.
     *
     * @param schedulerDigestLog value to be assigned to property SCHEDULER_DIGEST_LOG
     */
    public static void setSchedulerDigestLog(Logger schedulerDigestLog) {
        SCHEDULER_DIGEST_LOG = schedulerDigestLog;
    }

}

下一篇文章记录 sofaboot 集成nacos配置中心与注册中心,并且实现动态配置的功能

0%