• RocketMQ-日志


    RocketMQ日志

    RocketMQ提供了一个日志模块,实现自定义的Appender,目的是为了将日志发送到MQ中。

    可以参考文章https://blog.csdn.net/wanbf123/article/details/77988801

    在RocketMQ的client模块中中,提供一个适配log4j,log4j2和logback的工程类。不妨来学习一下。

    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You under the Apache License, Version 2.0
     * (the "License"); you may not use this file except in compliance with
     * the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.apache.rocketmq.client.log;
    
    import java.lang.reflect.Method;
    import java.net.URL;
    
    import org.apache.rocketmq.common.constant.LoggerName;
    import org.slf4j.ILoggerFactory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class ClientLogger {
        public static final String CLIENT_LOG_ROOT = "rocketmq.client.logRoot";
        public static final String CLIENT_LOG_MAXINDEX = "rocketmq.client.logFileMaxIndex";
        public static final String CLIENT_LOG_LEVEL = "rocketmq.client.logLevel";
    
        private static Logger log;
    
        private static Class logClass = null;
    
        private static Logger createLogger(final String loggerName) {
            // 如果定义了rocketmq日志配置文件的路径的话  就优先使用,否则使用默认的
            String logConfigFilePath =
                    System.getProperty("rocketmq.client.log.configFile",
                            System.getenv("ROCKETMQ_CLIENT_LOG_CONFIGFILE"));
            Boolean isloadconfig =
                    Boolean.parseBoolean(System.getProperty("rocketmq.client.log.loadconfig", "true"));
    
            // 下面3个是资源文件地址
            final String log4JResourceFile =
                    System.getProperty("rocketmq.client.log4j.resource.fileName", "log4j_rocketmq_client.xml");
    
            final String logbackResourceFile =
                    System.getProperty("rocketmq.client.logback.resource.fileName", "logback_rocketmq_client.xml");
    
            final String log4J2ResourceFile =
                    System.getProperty("rocketmq.client.log4j2.resource.fileName", "log4j2_rocketmq_client.xml");
    
            // 定义日志写文件地址
            String clientLogRoot = System.getProperty(CLIENT_LOG_ROOT, "${user.home}/logs/rocketmqlogs");
            System.setProperty("client.logRoot", clientLogRoot);
            // 定义日志级别
            String clientLogLevel = System.getProperty(CLIENT_LOG_LEVEL, "INFO");
            System.setProperty("client.logLevel", clientLogLevel);
            // 定义日志数
            String clientLogMaxIndex = System.getProperty(CLIENT_LOG_MAXINDEX, "10");
            System.setProperty("client.logFileMaxIndex", clientLogMaxIndex);
    
            if (isloadconfig) {
                try {
                    // 确定具体使用哪一个日志框架
                    ILoggerFactory iLoggerFactory = LoggerFactory.getILoggerFactory();
                    Class classType = iLoggerFactory.getClass();
                    if (classType.getName().equals("org.slf4j.impl.Log4jLoggerFactory")) {
                        Class<?> domconfigurator;
                        Object domconfiguratorobj;
                        domconfigurator = Class.forName("org.apache.log4j.xml.DOMConfigurator");
                        domconfiguratorobj = domconfigurator.newInstance();
                        if (null == logConfigFilePath) {
                            Method configure = domconfiguratorobj.getClass().getMethod("configure", URL.class);
                            URL url = ClientLogger.class.getClassLoader().getResource(log4JResourceFile);
                            configure.invoke(domconfiguratorobj, url);
                        } else {
                            Method configure = domconfiguratorobj.getClass().getMethod("configure", String.class);
                            configure.invoke(domconfiguratorobj, logConfigFilePath);
                        }
    
                    } else if (classType.getName().equals("ch.qos.logback.classic.LoggerContext")) {
                        Class<?> joranConfigurator;
                        Class<?> context = Class.forName("ch.qos.logback.core.Context");
                        Object joranConfiguratoroObj;
                        joranConfigurator = Class.forName("ch.qos.logback.classic.joran.JoranConfigurator");
                        joranConfiguratoroObj = joranConfigurator.newInstance();
                        Method setContext = joranConfiguratoroObj.getClass().getMethod("setContext", context);
                        setContext.invoke(joranConfiguratoroObj, iLoggerFactory);
                        if (null == logConfigFilePath) {
                            URL url = ClientLogger.class.getClassLoader().getResource(logbackResourceFile);
                            Method doConfigure =
                                    joranConfiguratoroObj.getClass().getMethod("doConfigure", URL.class);
                            doConfigure.invoke(joranConfiguratoroObj, url);
                        } else {
                            Method doConfigure =
                                    joranConfiguratoroObj.getClass().getMethod("doConfigure", String.class);
                            doConfigure.invoke(joranConfiguratoroObj, logConfigFilePath);
                        }
    
                    } else if (classType.getName().equals("org.apache.logging.slf4j.Log4jLoggerFactory")) {
                        Class<?> joranConfigurator = Class.forName("org.apache.logging.log4j.core.config.Configurator");
                        Method initialize = joranConfigurator.getDeclaredMethod("initialize", String.class, String.class);
                        if (null == logConfigFilePath) {
                            initialize.invoke(joranConfigurator, "log4j2", log4J2ResourceFile);
                        } else {
                            initialize.invoke(joranConfigurator, "log4j2", logConfigFilePath);
                        }
                    }
                    logClass = classType;
                } catch (Exception e) {
                    System.err.println(e);
                }
            }
            return LoggerFactory.getLogger(LoggerName.CLIENT_LOGGER_NAME);
        }
    
        public static Logger getLog() {
            if (log == null) {
                log = createLogger(LoggerName.CLIENT_LOGGER_NAME);
                return log;
            } else {
                return log;
            }
        }
    
        public static void setLog(Logger log) {
            ClientLogger.log = log;
        }
    
        public static void main(String[] args) {
            /**
             * 在${user.home}/logs/rocketmqlogs中找到了日志文件
             */
            ClientLogger.getLog().info("+++++");
        }
    }
  • 相关阅读:
    如何设计工作流引擎?
    产品特点概述驰骋工作流
    驰骋工作流程如何与您的系统进行耦合
    进制转换
    DNS欺骗(转) Anny
    Remember My Account Number(2 schema) Anny
    Mysql中的临时表使用方法(转) Anny
    Mysql任务调度(Event Schedular) Anny
    Using ssh connect to Amazon EC2 instance Anny
    Amazon EC2名词项目笔记(转) Anny
  • 原文地址:https://www.cnblogs.com/gaojy/p/15077745.html
Copyright © 2020-2023  润新知