【问题标题】:Proper format for log4j2.xml RollingFile configurationlog4j2.xml RollingFile 配置的正确格式
【发布时间】:2014-06-17 03:00:17
【问题描述】:

我在使用 log4j2 的 glassfish 4 应用程序中遇到以下异常:

SEVERE: ERROR StatusLogger Invalid URL C:/glassfish4/glassfish/domains/domain1/config/log4j2.xml java.net.MalformedURLException: Unknown protocol: c

我的 log4j2.xml 中有以下部分:

<RollingFile name="RollingFile" fileName="C:/glassfish4/glassfish/domains/domain1/logs/ucsvc.log"
             filePattern="C:/glassfish4/glassfish/domains/domain1/logs/$${date:yyyy-MM}/ucsvc-%d{MM-dd-yyyy}-%i.log">

我知道如果它正在寻找一个 URL,那么“C:/glassfish4/...”的格式不正确。

但是,滚动文件部分实际上是有效的:我看到一个日志文件和滚动的日志文件在我期望的位置。

如果我更改为根本不起作用的 URL(例如 file:///C/glassfish4/...)。

那么我应该忽略异常吗? (一切似乎都正常)。或者有人可以解释这部分配置的正确格式吗?

【问题讨论】:

  • 你试过类似file://C:/glassfish4....的东西吗? (即只有 2 个 / 而不是 3 个)
  • 是的,这根本行不通。应用程序甚至没有启动。

标签: glassfish-4 log4j2


【解决方案1】:

我还没有完全确定为什么配置文件对我和 OP 一样适用,但是,我可以确认将路径引用更改为 file:// url 可以解决问题(即:摆脱错误/警告/刺激)。

在我的 IntelliJ 运行/调试配置中,对于 VM 选项,我有:

-Dlog4j.configurationFile=file://C:\dev\path\to\log4j2.xml

我可以确认 '\' 被翻译成 '/' 所以,不用担心。

编辑

好的,整个事情都有效,因为他们(apache 家伙)非常努力地加载配置,事实上,他们确实是从通过c:\... 符号指定的文件加载。他们只是在继续尝试之前抛出一个相当具有误导性的异常。

在 ConfigurationFactory::getConfiguration:

    **source = getInputFromURI(FileUtils.getCorrectedFilePathUri(config));**
} catch (Exception ex) {
    // Ignore the error and try as a String.
}
if (source == null) {
    final ClassLoader loader = this.getClass().getClassLoader();
    **source = getInputFromString(config, loader);**

第一个粗体行尝试从 URL 加载并失败,引发异常。然后代码继续,弹出到 getInputFromString:

try {
    final URL url = new URL(config);
    return new ConfigurationSource(url.openStream(), FileUtils.fileFromURI(url.toURI()));
} catch (final Exception ex) {
    final ConfigurationSource source = getInputFromResource(config, loader);
    if (source == null) {
        try {
            **final File file = new File(config);
            return new ConfigurationSource(new FileInputStream(file), file);**

它尝试再次加载配置,失败并陷入困境,再次尝试,失败并最终在粗体线上成功(处理File)。

好的,我想用粗体强调的代码行实际上只是用**包裹;猜这个网站不允许嵌套标签?无论如何,你们都明白其中的意思。

读起来有点乱,但这就是为什么即使你得到那个看起来很讨厌(而且完全误导)的异常它也能工作的原因。

【讨论】:

    【解决方案2】:

    感谢乔恩,我一直在搜索.. 这有帮助!

    这是在 Intellij 13、Tomcat 7.0.56 上

    -Dlog4j.configurationFile=file://C:\Surendra\workspace\cmdb\resources\elasticityLogging.xml

    【讨论】:

      【解决方案3】:

      问题不在于您的 log4j2.xml 文件的内容。

      问题是 log4j2 无法找到您的 log4j2.xml 配置文件。仔细看错误,报错的URL是C:/glassfish4/glassfish/domains/domain1/config/log4j2.xml:配置文件。

      我不确定这是为什么。你是通过系统属性-Dlog4j.configurationFile=path/to/log4j2.xml指定配置文件的位置吗?

      不过,如果应用程序和日志记录工作正常,那么也许没有问题。不过很奇怪。您可以通过在 log4j2.xml 文件顶部配置 &lt;Configuration status="trace"&gt; 来获取有关 log4j 配置的更多详细信息。这会将 log4j 初始化详细信息打印到控制台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        相关资源
        最近更新 更多