Camel log4j 2如何禁用“date:“查找- log4j抛出异常

8iwquhpp  于 2022-11-07  发布在  Apache
关注(0)|答案(4)|浏览(161)

edit目前似乎无法执行filed an issue

我在我的apache camel应用程序中使用log4j 2。在camel中,文件名可以这样配置"?fileName=${date:now:yyyyMMdd-HHmmss}ID.${id}.gz"
如果我将日志级别设置为debug,camel会尝试记录它正在做的事情,但log4j似乎会尝试查找/解释带有“date:“的字符串,并抛出异常:

2014-11-24 11:29:19,218 ERROR Invalid date format: "now:yyyyMMdd-HHmmss", using default java.lang.IllegalArgumentExcepti
on: Illegal pattern character 'n'
        at java.text.SimpleDateFormat.compile(Unknown Source)
        at java.text.SimpleDateFormat.initialize(Unknown Source)
        at java.text.SimpleDateFormat.<init>(Unknown Source)
        at java.text.SimpleDateFormat.<init>(Unknown Source)
        at org.apache.logging.log4j.core.lookup.DateLookup.formatDate(DateLookup.java:60)
        at org.apache.logging.log4j.core.lookup.DateLookup.lookup(DateLookup.java:53)
        at org.apache.logging.log4j.core.lookup.Interpolator.lookup(Interpolator.java:144)
        at org.apache.logging.log4j.core.lookup.StrSubstitutor.resolveVariable(StrSubstitutor.java:1008)
        at org.apache.logging.log4j.core.lookup.StrSubstitutor.substitute(StrSubstitutor.java:926)
        at org.apache.logging.log4j.core.lookup.StrSubstitutor.substitute(StrSubstitutor.java:816)
        at org.apache.logging.log4j.core.lookup.StrSubstitutor.replace(StrSubstitutor.java:385)
        at org.apache.logging.log4j.core.pattern.MessagePatternConverter.format(MessagePatternConverter.java:71)
        at org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36)
        at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:189)
        at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:53)
        at org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:52)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:
104)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:97)
        at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:428)
        at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:407)
        at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:365)
        at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:112)
        at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1347)
        at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1312)
        at org.apache.logging.slf4j.Log4jLogger.debug(Log4jLogger.java:132)
        at org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:518)
        at org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:570)
        at org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:454)
        at org.apache.camel.util.EndpointHelper.setProperties(EndpointHelper.java:249)
        at org.apache.camel.impl.DefaultComponent.setProperties(DefaultComponent.java:272)
        at org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:67)
        at org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:37)
        at org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:123)
        at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:514)
        at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:547)

有没有办法关闭这个“日期:“查找?为什么它会试图解释来自日志的东西呢?我认为它不应该以任何方式被触及?!

编辑,非常容易在测试中重现:

public class LogTest {

    private Logger log = LoggerFactory.getLogger(LogTest.class);

    @Test
    public void test() {
        log.info("${date:now:buhu}");

    }
}

${date:}对我们来说至关重要-只有“data:now”在工作。因此这个问题完全独立于camel,但是camel使用${date:...}模式来处理一些事情。下面是重现问题的一个简单方法-异常将在camel设置阶段抛出-不需要测试代码-日志记录级别必须是“debug”!:

public class LogTest extends CamelTestSupport{

    private Logger log = LoggerFactory.getLogger(LogTest.class);

    @Test
    public void test() {
        //log.info("${date:now:yyyyMMdd-HHmmss}");

    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("direct:a").to("file:./?fileName=${date:now:yyyyMMdd-HHmmss}ID.${id}.gz");
            }
        };
    }

}
lyfkaqu1

lyfkaqu11#

此问题已在Log4j 2的2.7版本中得到修复。
解决方案是升级到该版本(或更高版本),并在模式属性中将选项“{nolookups}”添加到%msg。

%msg{nolookups}

比如说

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{1} %L %M %t - %msg{nolookups}%n%xEx%n" />
rn0zuynd

rn0zuynd2#

如果将simple-Expression写成$simple{..}而不是${..},那么log4j 2就不会使用他的日期查找。
因此,如果您将路线更改为:

from("direct:a").to("file:./?fileName=${date:now:yyyyMMdd-HHmmss}ID.${id}.gz");

至:

from("direct:a").to("file:./?fileName=$simple{date:now:yyyyMMdd-HHmmss}ID.${id}.gz");

即使您调试Camel,它也应该工作。

h43kikqp

h43kikqp3#

要在本地禁用日期查找,可以在表达式前面添加一个“$”:

log.info("$${date:now:buhu}");

这将打印${date:now:buhu},而不是引发打印堆栈跟踪的异常。
至于如何使用Camel来避免这种情况,我不确定。最干净的修复可能是log4j 2更新来禁用他们的DateLookup特性。一个临时的修复是禁用org.apache.camel包中的DEBUG级别日志:

<loggers>
     <logger name="org.apache.camel" level="INFO" />
     <root level="debug">
        <appender-ref ref="Console" />
     </root>
 </loggers>

这并不理想,但是如果我们需要调试Camel上下文创建,我们可以增加日志级别,因为日志语句对于一般的日常开发来说不是必需的。

roqulrg3

roqulrg34#

现在正确的解决方案是将log4j-core库升级到2.15.0或更高版本。在撰写本文时,最新和当前推荐的版本是2.16.0。
此处记录的消息中发生的变量替换是CVE-2021-44228(也称为Log 4Shell)中利用的同一功能的症状。
默认情况下,该功能在2.15.0中被禁用,在2.16.0中被删除。
这对任何人来说都不是什么新闻,但作为一种安全措施,禁用此功能对take steps来说非常重要,即使没有使用Apache Camel或遇到所描述的问题。
顺便说一句,我在搜索Log 4Shell漏洞的早期预警信号时发现了这个问题,我在我的文章中引用了它。

相关问题