Log4j2 创建不需要的日志文件
Log4j2 creates unwanted logfile
我想设置日志级别和日志文件的文件名和文件路径。我找到了一种方法来执行此操作并且一切正常,但 log4j 创建了一个 additionla 日志文件。
我得到以下 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<File name="logFile" filename="${sys:logDir}${sys:logFilename}" >
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
在我的主要函数中,我设置了 ${sys:logDir} 和 ${sys:logFilename}:
import config.ReadParameterFile;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import java.io.IOException;
public class main {
private final static Logger log = LogManager.getLogger(main.class);
public static void main(String [] args) throws IOException {
ReadParameterFile config = new ReadParameterFile();
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config1 = ctx.getConfiguration();
LoggerConfig loggerConfig = config1.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
switch (config.getProtokollProtokollTiefe()){
case "Default":loggerConfig.setLevel(Level.DEBUG);
break;
case "Produktion":loggerConfig.setLevel(Level.ERROR);
break;
case "Test":loggerConfig.setLevel(Level.FATAL);
break;
default:System.out.print("falsche Logtief");
}
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
ctx.reconfigure();
ctx.updateLoggers();
}
}
它按我想要的方式工作,但 log4j 在我的主项目路径中创建了一个名为“${sys:logDir}${sys:logFilename}”的文件。为什么 log4j2 这样做?我想它在我设置名称之前初始化了日志文件。我该如何更改它?
此致!
我可以通过以下方法解决问题:
public class main {
public static void main(String [] args) throws IOException {
ReadParameterFile config = new ReadParameterFile();
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
switch (config.getProtokollProtokollTiefe()){
case "Default":System.setProperty("logLvl","DEBUG");
break;
case "Produktion":System.setProperty("logLvl","ERROR");
break;
case "Test": System.setProperty("logLvl","ALL");
break;
default:System.out.print("falsche Logtief");
}
}
}
记录器被声明为静态字段。这是在加载 class 时初始化的, 在 调用 main
方法之前。
第一次调用 LogManager
应该是在设置这些系统属性之后。
您可以在设置属性后初始化 Logger,也可以使用 -D
选项在命令行上设置属性。
您需要做的:
private static ReadParameterFile config;
private static Logger log;
static {
config = new ReadParameterFile();
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
log = LogManager.getLogger(main.class);
}
我想设置日志级别和日志文件的文件名和文件路径。我找到了一种方法来执行此操作并且一切正常,但 log4j 创建了一个 additionla 日志文件。 我得到以下 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<File name="logFile" filename="${sys:logDir}${sys:logFilename}" >
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
在我的主要函数中,我设置了 ${sys:logDir} 和 ${sys:logFilename}:
import config.ReadParameterFile;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import java.io.IOException;
public class main {
private final static Logger log = LogManager.getLogger(main.class);
public static void main(String [] args) throws IOException {
ReadParameterFile config = new ReadParameterFile();
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config1 = ctx.getConfiguration();
LoggerConfig loggerConfig = config1.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
switch (config.getProtokollProtokollTiefe()){
case "Default":loggerConfig.setLevel(Level.DEBUG);
break;
case "Produktion":loggerConfig.setLevel(Level.ERROR);
break;
case "Test":loggerConfig.setLevel(Level.FATAL);
break;
default:System.out.print("falsche Logtief");
}
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
ctx.reconfigure();
ctx.updateLoggers();
}
}
它按我想要的方式工作,但 log4j 在我的主项目路径中创建了一个名为“${sys:logDir}${sys:logFilename}”的文件。为什么 log4j2 这样做?我想它在我设置名称之前初始化了日志文件。我该如何更改它?
此致!
我可以通过以下方法解决问题:
public class main {
public static void main(String [] args) throws IOException {
ReadParameterFile config = new ReadParameterFile();
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
switch (config.getProtokollProtokollTiefe()){
case "Default":System.setProperty("logLvl","DEBUG");
break;
case "Produktion":System.setProperty("logLvl","ERROR");
break;
case "Test": System.setProperty("logLvl","ALL");
break;
default:System.out.print("falsche Logtief");
}
}
}
记录器被声明为静态字段。这是在加载 class 时初始化的, 在 调用 main
方法之前。
第一次调用 LogManager
应该是在设置这些系统属性之后。
您可以在设置属性后初始化 Logger,也可以使用 -D
选项在命令行上设置属性。
您需要做的:
private static ReadParameterFile config;
private static Logger log;
static {
config = new ReadParameterFile();
System.setProperty("logDir",config.getProtokollDirProtokoll());
System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
log = LogManager.getLogger(main.class);
}