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)
一样简单——它还包含 warning
和 severe
(错误)方法。无需进一步设置。
您正在使用 RoutingAppender 并将结构化数据消息的类型字段用作路由键。问题是,您的示例没有显示您发送任何结构化数据消息。如果您不使用路由附加程序记录结构化数据消息没有多大意义。
您的配置还显示您引用了 ${filename} 但从未定义该变量。所以它将在应用程序启动时在当前目录的任何位置创建一个名为“${filename}”的文件,如果它有权限。
如果它正在记录到控制台,那么它要么没有找到您的配置,要么遇到了错误。您应该使用 -Dlog4j2.debug=true 启动您的应用程序,以查看日志记录配置期间发生的情况。
我一直在尝试在我的 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)
一样简单——它还包含 warning
和 severe
(错误)方法。无需进一步设置。
您正在使用 RoutingAppender 并将结构化数据消息的类型字段用作路由键。问题是,您的示例没有显示您发送任何结构化数据消息。如果您不使用路由附加程序记录结构化数据消息没有多大意义。
您的配置还显示您引用了 ${filename} 但从未定义该变量。所以它将在应用程序启动时在当前目录的任何位置创建一个名为“${filename}”的文件,如果它有权限。
如果它正在记录到控制台,那么它要么没有找到您的配置,要么遇到了错误。您应该使用 -Dlog4j2.debug=true 启动您的应用程序,以查看日志记录配置期间发生的情况。