Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 在Log4j2中动态/编程地配置您自己的异步记录器_Logging_Asynchronous_Log4j_Log4j2 - Fatal编程技术网

Logging 在Log4j2中动态/编程地配置您自己的异步记录器

Logging 在Log4j2中动态/编程地配置您自己的异步记录器,logging,asynchronous,log4j,log4j2,Logging,Asynchronous,Log4j,Log4j2,我的项目中已经实现了一个旧的log4j1.x,我们通过扩展类org.apach.log4j.logger创建了我们自己的日志。但是现在我们想转到Log4j2,因为它有一个asynLogger。下面的代码是否满足了以编程方式创建时支持我的Log4j2的异步日志的所有功能 import java.util.HashMap; 导入org.apache.logging.log4j.Level; 导入org.apache.logging.log4j.core.LoggerContext; 导入org.a

我的项目中已经实现了一个旧的log4j1.x,我们通过扩展类org.apach.log4j.logger创建了我们自己的日志。但是现在我们想转到Log4j2,因为它有一个asynLogger。下面的代码是否满足了以编程方式创建时支持我的Log4j2的异步日志的所有功能

import java.util.HashMap;
导入org.apache.logging.log4j.Level;
导入org.apache.logging.log4j.core.LoggerContext;
导入org.apache.logging.log4j.core.appender.ConsoleAppender;
导入org.apache.logging.log4j.core.appender.RandomAccessFileAppender;
导入org.apache.logging.log4j.core.async.AsyncLoggerContext;
导入org.apache.logging.log4j.core.layout.PatternLayout;
导入org.apache.logging.log4j.message.FormattedMessageFactory;
导入org.apache.logging.log4j.message.MessageFactory;
公共最终类MyLog4j2Logger扩展
org.apache.logging.log4j.core.async.AsyncLogger{
私有静态HashMap logCache=newhashmap(4);
私有MyLog4j2Logger(LoggerContext上下文、字符串名称、MessageFactory msgFactory){
super(上下文、名称、msgFactory);
System.out.println(“使用异步记录器”);
//设置为所有级别
此.setLevel(Level.ALL);
}
/*
*返回记录器实例的工厂方法。如果
*实例已存在于else立即创建的哈希表中
*归还它。
*/
公共最终静态MyLog4j2Logger getCustomLogger(字符串sCategory){
试一试{
System.setProperty(“Log4jContextSelector”,
“org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”);
//检查类别的实例是否已存在
if(logCache.containsKey(sCategory)){
MyLog4j2Logger=logCache.get(sCategory);
info(“正在为“+sCategory”创建记录器);
返回记录器;
}否则{
//为此类别创建新的自定义记录器
MyLog4j2Logger customLogger=configureCategoryLogger(sCategory);
//将自定义记录器添加到表中。
logCache.put(sCategory、customLogger);
info(“为“+sCategory”创建了一个新的记录器);
return(MyLog4j2Logger)customLogger;
}
}捕获(异常扩展){
系统输出
.println(“获取记录器实例时引发异常”);
exp.printStackTrace();
}
返回null;
}
专用静态MyLog4j2Logger配置CategoryLogger(字符串散格){
//创建记录器上下文
LoggerContext上下文=新的AsyncLoggerContext(sCategory);
//创建格式化消息工厂
MessageFactory msgFactory=新格式化的MessageFactory();
MyLog4j2Logger=新的MyLog4j2Logger(上下文、sCategory、,
MSG工厂);
RandomAccessFileAppender appender=RandomAccessFileAppender
.createAppender(
“C:\\temp\\App.log”,//文件名
“true”,//追加
“file_appender-”+sCategory,//名称
“true”,//立即刷新
“”,//缓冲区大小
“true”,//忽略异常
PatternLayout.createLayout(
“%-5p-[%d]-[%t]-[%l]:%m%n”,空,
null,“UTF-8”,“true”,sCategory),null,//过滤器
“false”,//广告
null,//广告商URI
空//配置
);
ConsoleAppender ConsoleAppender=ConsoleAppender.createAppender(
PatternLayout.createLayout(“%-5p-[%d]-[%t]-[%l]:%m%n”,
空,空,“UTF-8”,空,空),空,空,
“控制台”,空,空);
appender.start();
consoleApender.stop();
logger.getContext().getConfiguration().getLoggerConfig(sCategory)
.addAppender(appender,Level.TRACE,null);
logger.getContext().getConfiguration().getLoggerConfig(sCategory)
.addAppender(consoleAppender,Level.OFF,null);
System.out.println(logger.getContext().getConfiguration())
.getAppenders());
返回记录器;
}
公共静态void main(字符串[]args){
MyLog4j2Logger logger=MyLog4j2Logger.getCustomLogger(“测试”);
调试(“调试消息”);
logger.error(“error MSG”);
logger.info(“info msg”);
}
}

Log4j2中的AsyncLogger完成了代码段所做的一切(以及更多)。我会检查并为您的应用程序配置它,以降低代码的复杂性。

Log4j初始化非常复杂。我确信可以创建只执行log4j的一些初始化并且仍然可以工作的自定义代码,但是我不明白为什么要这样做。基于标准配置的log4j-2.0初始化是否存在问题?(在这种情况下,我想了解p
        import java.util.HashMap;

        import org.apache.logging.log4j.Level;
        import org.apache.logging.log4j.core.LoggerContext;
        import org.apache.logging.log4j.core.appender.ConsoleAppender;
        import org.apache.logging.log4j.core.appender.RandomAccessFileAppender;
        import org.apache.logging.log4j.core.async.AsyncLoggerContext;
        import org.apache.logging.log4j.core.layout.PatternLayout;
        import org.apache.logging.log4j.message.FormattedMessageFactory;
        import org.apache.logging.log4j.message.MessageFactory;

        public final class MyLog4j2Logger extends
                org.apache.logging.log4j.core.async.AsyncLogger {

            private static HashMap<String, MyLog4j2Logger> logCache = new HashMap<String, MyLog4j2Logger>(4);

            private MyLog4j2Logger(LoggerContext context, String name,MessageFactory msgFactory) {
                super(context, name, msgFactory);
                System.out.println("Using AsyncLogger");

                // Set to all levels
                this.setLevel(Level.ALL);
            }

            /*
            * Factory Method that returns an instance of Logger. returns if the
            * instance is already present in the Hash Table else creates now and
            * returns it.
            */
            public final static MyLog4j2Logger getCustomLogger(String sCategory) {
                try {
                    System.setProperty("Log4jContextSelector",
                            "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
                    // Check if Instance is already present for the Category
                    if (logCache.containsKey(sCategory)) {
                        MyLog4j2Logger logger = logCache.get(sCategory);
                        logger.info("Getting already created logger for " + sCategory);
                        return logger;
                    } else {

                        // Create a new custom logger for this category
                        MyLog4j2Logger customLogger = configureCategoryLogger(sCategory);

                        // Add the custom logger to Table.
                        logCache.put(sCategory, customLogger);

                        customLogger.info("Created a New Logger for " + sCategory);

                        return (MyLog4j2Logger) customLogger;
                    }
                } catch (Exception exp) {
                    System.out
                            .println("Exception thrown while fetching Logger instance");
                    exp.printStackTrace();
                }

                return null;

            }

            private static MyLog4j2Logger configureCategoryLogger(String sCategory) {

                // Create logger context
                LoggerContext context = new AsyncLoggerContext(sCategory);

                // Create formatted message factory
                MessageFactory msgFactory = new FormattedMessageFactory();

                MyLog4j2Logger logger = new MyLog4j2Logger(context, sCategory,
                        msgFactory);

                RandomAccessFileAppender appender = RandomAccessFileAppender
                        .createAppender(
                                "C:\\temp\\App.log",// filename
                                "true",// append
                                "file_appender-" + sCategory,// name
                                "true",// immediateFlush
                                "",// bufferSize
                                "true",// ignoreExceptions
                                PatternLayout.createLayout(
                                        "%-5p - [%d] - [%t] - [%l]  : %m%n", null,
                                        null, "UTF-8", "true", sCategory), null,// filter
                                "false",// advertise
                                null,// advertiseURI
                                null// config
                        );

                ConsoleAppender consoleAppender = ConsoleAppender.createAppender(
                        PatternLayout.createLayout("%-5p - [%d] - [%t] - [%l]  : %m%n",
                                null, null, "UTF-8", null, null), null, null,
                        "Console", null, null);

                appender.start();
                consoleAppender.stop();
                logger.getContext().getConfiguration().getLoggerConfig(sCategory)
                        .addAppender(appender, Level.TRACE, null);
                logger.getContext().getConfiguration().getLoggerConfig(sCategory)
                        .addAppender(consoleAppender, Level.OFF, null);
                System.out.println(logger.getContext().getConfiguration()
                        .getAppenders());

                return logger;

            }

            public static void main(String[] args) {

                MyLog4j2Logger logger = MyLog4j2Logger.getCustomLogger("TESTING");
                logger.debug("Debug MSG");
                logger.error("Error MSG");
                logger.info("INFO msg");

            }

        }