Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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
Java 转换器类别插件未包含在Jar中的log4j2插件dat文件中_Java_Intellij Idea_Log4j2 - Fatal编程技术网

Java 转换器类别插件未包含在Jar中的log4j2插件dat文件中

Java 转换器类别插件未包含在Jar中的log4j2插件dat文件中,java,intellij-idea,log4j2,Java,Intellij Idea,Log4j2,首先是我要做的一些背景知识。我的雇主正在从使用C#的Windows服务器迁移到Linux上的Java,以迁移到AWS。在尝试创建日志附加器以将日志推送到AWS CloudWatch时,出现了这个特殊问题。我对Java还是相当陌生的,所以请容忍我:)我正在使用IntelliJ IDEA 15.0.2 Windows编程 我找到了一个Mihailo Despotovic创建的现有日志追加器 我做了一些修改,使其更易于配置凭据配置文件、日志组/流等的使用 现在谈谈我经历过的问题,希望有人能指导我找到一

首先是我要做的一些背景知识。我的雇主正在从使用C#的Windows服务器迁移到Linux上的Java,以迁移到AWS。在尝试创建日志附加器以将日志推送到AWS CloudWatch时,出现了这个特殊问题。我对Java还是相当陌生的,所以请容忍我:)我正在使用IntelliJ IDEA 15.0.2 Windows编程

我找到了一个Mihailo Despotovic创建的现有日志追加器

我做了一些修改,使其更易于配置凭据配置文件、日志组/流等的使用

现在谈谈我经历过的问题,希望有人能指导我找到一个可能的解决方案

试试看

我在一个AWS实例上这样做。我的厨师配方在与Jar文件相同的文件夹中创建了log4j2.xml文件。从堆栈中为配置分配了自定义JSON。Jar文件的调用将-Dlog4j.configurationfile指向路径/log4j2.xml。一旦调用getLogger(),就会出现大量错误状态记录器无法识别的格式说明符[XXXX],其中XXXX是不同的布局选项。然后它说找不到log4j2配置文件,将使用默认值,然后使用完全相同的错误状态记录器Unrecogned…

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.something.something">
    <Appenders>
        <CloudWatchLogAppender name="CloudWatchLogAppender"
                           awsLogGroupName="log group name"
                           awsLogStreamName="log stream name"
                           awsCredentialProfile="credential profile name"
                           queueDepth="50000"
                           drainLimit="256"
                           flushPeriod="5"
                           >
            <PatternLayout pattern="%msg" />
        </CloudWatchLogAppender>
    </Appenders>
    <Loggers>
        <Root level="all">
            <AppenderRef ref="CloudWatchLogAppender" />
        </Root>
    </Loggers>
</Configuration>
试试看

接下来,我想尝试用Java编程设置配置。log4j文档让我有点困惑,但我还是被它绊倒了:

并更改为使用我的自定义日志追加器:

org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
PatternLayout layout = PatternLayout.createLayout("%msg", null, null, null, null, false, true, null, null);
CloudWatchLogAppender appender = new CloudWatchLogAppender("CloudWatchLogAppender",
                    logGroupName,
                    logStreamName,
                    null,
                    queueDepth,
                    drainLimit,
                    flushPeriod,
                    layout);
appender.start();
rootLogger.getContext().getConfiguration().addLoggerAppender(rootLogger, appender);
rootLogger.setLevel(Level.ALL);
Logger logger = LogManager.getLogger(com.something.something.App.class);
我必须包括以下内容,以将默认的Level.ERROR更改为其他内容(将通过配置处理“levels”):

这就像一个从想法出发的魅力。记录的任何内容都会按预期进入AWS CloudWatch

然后,我将它构建到一个Jar(maven项目,也在gradle中尝试过),运行它,同样的错误状态记录器无法识别的格式说明符[XXXX]泛滥

Log Appender仍然会登录到AWS CloudWatch,但它只发送了模式布局%msg

然后,我使用远程调试来查看是否可以深入到log4j2,并找到从IDEA运行它与从Jar运行它之间的区别。这就是我发现从IDEA运行时,它引用maven存储库log4j2 core 2.5 Jar来获取Log4j2Plugins.dat,并找到插件类别默认值,称为converter。但是当从Jar运行时,它使用META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat,maven将其包含在Jar中,并且它只有“root”类别和对我的自定义日志附件的引用。这意味着log4j2无法找到转换器的预期默认类别,这会造成大量布局错误

我甚至试图从存储库核心Jar文件中提取Log4j2Plugins.dat文件,并将其包含在项目中的同一路径下。在构建Jar时忽略它

我如何克服这个问题,让maven包含正确的Log4j2Plugins.dat文件?或者其他可能的解决方案

已编辑

使用Try#3的Hack:

我从log4j2核心jar存储库文件中提取了Log4j2Plugins.dat,并将其包含在我的厨师烹饪书中。让配方将文件复制到正确的文件夹结构中,然后使用“jar-uf”通过配方更新我的jar文件

org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
PatternLayout layout = PatternLayout.createLayout("%msg", null, null, null, null, false, true, null, null);
CloudWatchLogAppender appender = new CloudWatchLogAppender("CloudWatchLogAppender",
                    logGroupName,
                    logStreamName,
                    null,
                    queueDepth,
                    drainLimit,
                    flushPeriod,
                    layout);
appender.start();
rootLogger.getContext().getConfiguration().addLoggerAppender(rootLogger, appender);
rootLogger.setLevel(Level.ALL);
Logger logger = LogManager.getLogger(com.something.something.App.class);
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
loggerConfig.setLevel(Level.ALL);
ctx.updateLoggers();