自定义Log4j配置文件和RocketMQ-Client.jar下log文件冲突问题解决

Posted Java硅谷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义Log4j配置文件和RocketMQ-Client.jar下log文件冲突问题解决相关的知识,希望对你有一定的参考价值。

项目jar正常,我们项目log4j中已经配置了root日志级别level为info,但是启动项目后,自定义logger日志只能打印error级别。
启动服务时总是出现没有设置root logger的日志级别。
 
   
   
 
  1. 2018-05-09 16:24:34,309 main WARN No Root logger was configured,

  2. creating default ERROR-level Root logger with Console appender

但是我们日志文件已经设置了info级别
 
   
   
 
  1. <Root level="INFO">

  2.      <AppenderRef ref="ConsoleAppend"/>

  3.    </Root>

分析

经过debug发现,加载的日志文件不是我们配置的日志文件,而是rocketmq下的配置的日志文件。

打开该配置文件

 
   
   
 
  1. <!DOCTYPE xml>

  2. <Configuration status="warn" name="RocketmqClient">

  3.    <Appenders>

  4.        <Console name="STDOUT-APPENDER">

  5.            <PatternLayout pattern="%-5p %c{2} , %m%n"/>

  6.        </Console>

  7.        <RollingFile name="RocketmqClientAppender" fileName="${sys:client.logRoot}/rocketmq_client.log"

  8.                     filePattern="${sys:client.logRoot}/rocketmq_client-%d{yyyy-MM-dd}-%i.log">

  9.            <PatternLayout pattern="%d{yyy-MM-dd HH\:mm\:ss,SSS} %p %c{1}(%L) - %m%n"/>

  10.            <Policies>

  11.                <TimeBasedTriggeringPolicy/>

  12.                <SizeBasedTriggeringPolicy size="1 GB"/>

  13.            </Policies>

  14.            <DefaultRolloverStrategy max="${sys:client.logFileMaxIndex}"/>

  15.        </RollingFile>

  16.    </Appenders>

  17.    <Loggers>

  18.        <logger name="RocketmqClient" level="${sys:client.logLevel}" additivity="false">

  19.            <appender-ref ref="RocketmqClientAppender"/>

  20.        </logger>


  21.        <logger name="RocketmqCommon" level="${sys:client.logLevel}" additivity="false">

  22.            <appender-ref ref="RocketmqClientAppender"/>

  23.        </logger>


  24.        <logger name="RocketmqRemoting" level="${sys:client.logLevel}" additivity="false">

  25.            <appender-ref ref="RocketmqClientAppender"/>

  26.        </logger>

  27.    </Loggers>

  28. </Configuration>

分析确实不存在root level的配置。

1、我们自定义的日志配置文件

2、目前我们使用的是rocketmq-4.2.0版本

3、分析mq日志配置源码ClientLogger
 
   
   
 
  1. public class ClientLogger {


  2.    public static final String CLIENT_LOG_ROOT = "rocketmq.client.logRoot";

  3.    public static final String CLIENT_LOG_MAXINDEX = "rocketmq.client.logFileMaxIndex";

  4.    public static final String CLIENT_LOG_LEVEL = "rocketmq.client.logLevel";


  5.    private static Logger log;


  6.    private static Logger createLogger(final String loggerName) {

  7.        //System.getProperty获取logConfigFilePath

  8.        String logConfigFilePath = System.getProperty("rocketmq.client.log.configFile", System.getenv("ROCKETMQ_CLIENT_LOG_CONFIGFILE"));

  9.        //是否加载rocketmq.client.log.loadconfig--默认为true

  10.        Boolean isloadconfig =

  11.            Boolean.parseBoolean(System.getProperty("rocketmq.client.log.loadconfig", "true"));

  12.        //log4J日志资源配置

  13.        final String log4JResourceFile =

  14.            System.getProperty("rocketmq.client.log4j.resource.fileName", "log4j_rocketmq_client.xml");

  15.        //logback日志资源配置

  16.        final String logbackResourceFile =

  17.            System.getProperty("rocketmq.client.logback.resource.fileName", "logback_rocketmq_client.xml");

  18.        //log4J2日志资源配置

  19.        final String log4J2ResourceFile =

  20.            System.getProperty("rocketmq.client.log4j2.resource.fileName", "log4j2_rocketmq_client.xml");


  21.        String clientLogRoot = System.getProperty(CLIENT_LOG_ROOT, System.getProperty("user.home") + "/logs/rocketmqlogs");

  22.        System.setProperty("client.logRoot", clientLogRoot);

  23.        String clientLogLevel = System.getProperty(CLIENT_LOG_LEVEL, "INFO");

  24.        System.setProperty("client.logLevel", clientLogLevel);

  25.        String clientLogMaxIndex = System.getProperty(CLIENT_LOG_MAXINDEX, "10");

  26.        System.setProperty("client.logFileMaxIndex", clientLogMaxIndex);

  27.        //允许加载配置

  28.        if (isloadconfig) {

  29.            try {

  30.                ILoggerFactory iLoggerFactory = LoggerFactory.getILoggerFactory();

  31.                Class classType = iLoggerFactory.getClass();

  32.                if (classType.getName().equals("org.slf4j.impl.Log4jLoggerFactory")) {

  33.                    Class<?> domconfigurator;

  34.                    Object domconfiguratorobj;

  35.                    domconfigurator = Class.forName("org.apache.log4j.xml.DOMConfigurator");

  36.                    domconfiguratorobj = domconfigurator.newInstance();

  37.                    if (null == logConfigFilePath) {

  38.                        Method configure = domconfiguratorobj.getClass().getMethod("configure", URL.class);

  39.                        URL url = org.apache.rocketmq.client.log.ClientLogger.class.getClassLoader().getResource(log4JResourceFile);

  40.                        configure.invoke(domconfiguratorobj, url);

  41.                    } else {

  42.                        Method configure = domconfiguratorobj.getClass().getMethod("configure", String.class);

  43.                        configure.invoke(domconfiguratorobj, logConfigFilePath);

  44.                    }


  45.                } else if (classType.getName().equals("ch.qos.logback.classic.LoggerContext")) {

  46.                    Class<?> joranConfigurator;

  47.                    Class<?> context = Class.forName("ch.qos.logback.core.Context");

  48.                    Object joranConfiguratoroObj;

  49.                    joranConfigurator = Class.forName("ch.qos.logback.classic.joran.JoranConfigurator");

  50.                    joranConfiguratoroObj = joranConfigurator.newInstance();

  51.                    Method setContext = joranConfiguratoroObj.getClass().getMethod("setContext", context);

  52.                    setContext.invoke(joranConfiguratoroObj, iLoggerFactory);

  53.                    if (null == logConfigFilePath) {

  54.                        URL url = org.apache.rocketmq.client.log.ClientLogger.class.getClassLoader().getResource(logbackResourceFile);

  55.                        Method doConfigure =

  56.                            joranConfiguratoroObj.getClass().getMethod("doConfigure", URL.class);

  57.                        doConfigure.invoke(joranConfiguratoroObj, url);

  58.                    } else {

  59.                        Method doConfigure =

  60.                            joranConfiguratoroObj.getClass().getMethod("doConfigure", String.class);

  61.                        doConfigure.invoke(joranConfiguratoroObj, logConfigFilePath);

  62.                    }


  63.                } else if (classType.getName().equals("org.apache.logging.slf4j.Log4jLoggerFactory")) {

  64.                    Class<?> joranConfigurator = Class.forName("org.apache.logging.log4j.core.config.Configurator");

  65.                    Method initialize = joranConfigurator.getDeclaredMethod("initialize", String.class, String.class);

  66.                    if (null == logConfigFilePath) {

  67.                        initialize.invoke(joranConfigurator, "log4j2", log4J2ResourceFile);

  68.                    } else {

  69.                        initialize.invoke(joranConfigurator, "log4j2", logConfigFilePath);

  70.                    }

  71.                }

  72.            } catch (Exception e) {

  73.                System.err.println(e);

  74.            }

  75.        }

  76.        return LoggerFactory.getLogger(LoggerName.CLIENT_LOGGER_NAME);

  77.    }


  78.    public static Logger getLog() {

  79.        if (log == null) {

  80.            log = createLogger(LoggerName.CLIENT_LOGGER_NAME);

  81.            return log;

  82.        } else {

  83.            return log;

  84.        }

  85.    }


  86.    public static void setLog(Logger log) {

  87.        org.apache.rocketmq.client.log.ClientLogger.log = log;

  88.    }


  89. }

经过分析可知:我们可以通过 System.setProperty来设置一些属性,屏蔽mq的日志配置,所以我们在mq的配置bean中设置:
 
   
   
 
  1. RocketMQConfiguration(){

  2.   System.setProperty("rocketmq.client.log.loadconfig","false");

  3. }

参考文章: https://www.cnblogs.com/devilfeng/p/6869166.html https://blog.csdn.net/wyfk2013/article/details/78218221


以上是关于自定义Log4j配置文件和RocketMQ-Client.jar下log文件冲突问题解决的主要内容,如果未能解决你的问题,请参考以下文章

自定义Log4j配置文件和RocketMQ-Client.jar下log文件冲突问题解决

log4j +spring aop+自定义注解方式输出日志

Log4j 自定义配置为每个级别分隔日志 - Playframework 1.2.5

2019-07-03 log4j2 自定义ElasticSearch Appender

Java日志框架 -- LOG4J(Log4j入门案例日志级别Log4j组件(LoggersAppendersLayouts)配置文件内置日志记录自定义Logger)

Java日志框架 -- LOG4J(Log4j入门案例日志级别Log4j组件(LoggersAppendersLayouts)配置文件内置日志记录自定义Logger)