Log4j 既不写入也不创建新文件

Log4j does not write nor creates new file

我一直在尝试在我的 Spigot 插件中设置 Log4j2 记录器。它不会创建任何日志记录文件,但是会将消息记录到控制台中。要补充的是,它没有记录跟踪消息,尽管我将整个记录器设置为“跟踪”。然后我尝试删除控制台附加程序,它仍然将消息记录到控制台。看起来 Log4j 忽略了 log4j2.xml。感谢您的帮助!

我的代码:

package main.java.sk.trollyj;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {

public final java.util.logging.Logger LOG;

public static Logger LOGGER = LogManager.getLogger(Main.class);

public Main() {
    super();
    LOG = this.getLogger();
}

@Override
public void onDisable() {
    super.onDisable();
    LOGGER.trace("entry");
    LOGGER.error("DISABLE");

    LOG.info("Disabled!");
    LOGGER.trace("exit");
}

@Override
public void onEnable() {
    super.onEnable();
    LOGGER.trace("entry");
    LOGGER.error("ENABLED");
    

    LOG.info("Enabled!");
    LOGGER.trace("exit");
}
}

Logger LOG 是 Spigot 的默认记录器,可以正常工作。

log4j2.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">

<Appenders>
    <Routing name="file">
        <Routes pattern="$${sd:type}">
            <Route>
                <RollingFile name="Rolling-${sd:type}" fileName="${filename}"
                             filePattern="TribalWars/logs/-${sd:type}.%i.log.gz">
                    <PatternLayout>
                        <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>
                    </PatternLayout>
                    <SizeBasedTriggeringPolicy size="500" />
                </RollingFile>
            </Route>
        </Routes>
    </Routing>
</Appenders>

<Loggers>
    <Logger name="main.java.sk.trollyj.Main" level="TRACE"/>
    <Root level="trace">
        <AppenderRef ref="file"/>
    </Root>
</Loggers>

</Configuration>

My classpath

您必须使用 log4j2 进行日志记录吗? Bukkit 有一个内置的记录器,适用于大多数项目。我的所有插件都使用了 Bukkit 记录器,我很少看到其他插件使用它。 Bukkit 的记录器就像 运行 Plugin#getLogger.info(msg) 一样简单——它还包含 warningsevere(错误)方法。无需进一步设置。

您正在使用 RoutingAppender 并将结构化数据消息的类型字段用作路由键。问题是,您的示例没有显示您发送任何结构化数据消息。如果您不使用路由附加程序记录结构化数据消息没有多大意义。

您的配置还显示您引用了 ${filename} 但从未定义该变量。所以它将在应用程序启动时在当前目录的任何位置创建一个名为“${filename}”的文件,如果它有权限。

如果它正在记录到控制台,那么它要么没有找到您的配置,要么遇到了错误。您应该使用 -Dlog4j2.debug=true 启动您的应用程序,以查看日志记录配置期间发生的情况。