当前位置: 首页 > 知识库问答 >
问题:

log4j2如何禁用“日期:”查找-log4j引发异常

束飞捷
2023-03-14

编辑似乎不可能在此刻归档一个问题。

我正在apache camel应用程序中使用log4j2。在骆驼中,可以通过这种方式配置文件名“?filename=${date:now:yyyymmdd-hhmmss}id.${id}.gz”

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:...}几件事的模式。这里有一个重现问题的简单路线--异常将在骆驼设置阶段抛出--不需要测试代码--日志级别必须是“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");
            }
        };
    }

}

共有1个答案

卜方伟
2023-03-14

这个问题在2.7版本的log4j2中得到了修复。

解决方案是升级到该版本(或更高版本),并在pattern属性中添加选项“{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" />
 类似资料:
  • 问题内容: 我正在开发一个通过Commons使用Log4J的项目。 我正在尝试找到日志文件的路径,但是没有找到合适的方法来从Logger返回日志文件的路径。 有人尝试过吗? 问题答案: 您必须 从根记录器 获取所有附加程序,然后获取日志文件的名称。

  • 问题内容: 如果我有一个, 并且想要获得一周中的特定时间(由0(星期日)至6(星期六)指定)。 例如,如果我有as 和as ,我想得到,如果我有as , 编辑: 你们大多数人都误解了它。我有一些日期,并且想要获得由同一周的0-6指定的日期。 所以不,我不要… 的日子 问题答案: 我想这就是你想要的。

  • 我们有一个使用ApacheAxis2在JBossOpenShift上运行的web服务应用程序。我们正在迁移到log4j2。然而,除了我们的应用程序日志之外,参考库的一些日志(如axis2日志)也使用log4j记录hazelcast日志。我们得出这个结论,因为他们仍然使用旧的log4。属性文件,而不是log4j2。xml文件。我们的应用程序使用log4j2。xml文件。因此将创建两个日志文件,一个用

  • 我需要获取当前日期,但格式如下: 有什么方法我可以用吗?我只找到了不同的格式和暂时无法使用的东西。用于使用python。

  • 这个问题只是当WIFI被禁用并且phone正在使用移动数据的时候。如果我有WIFI连接,那么应用程序可以正常工作。 以下是代码详细信息: 清单: uses-permission Android:name=“android.permission.internet” uses-permissionandroid:name=“android.permission.access_network_state

  • 我刚刚安装了amsul日期选择器,但我无法弄清楚如何禁用日期?例如,如果我希望日历显示今天的日期和1年前的未来日期。例如:2019年5月2日- 此外,我正在尝试从- 谢谢 Amsul:https://amsul.ca/pickadate.js/