Java log4j2-更改默认根文件夹

Java log4j2-更改默认根文件夹,java,log4j2,Java,Log4j2,我知道我的标题不是很简单,我想在这里更具体一些。 我使用的是log4j2,到目前为止,我的日志文件夹是:“C:\log” 我想将根驱动器(“C:”)更改为安装应用程序的位置 例如: 如果jar文件位于“d:\apps\jar.jar”中,则日志路径将为“d:\log” 如果jar文件位于“c:\apps\jar.jar”中,那么日志路径将是“c:\log” 我试图将log4j2.xml(以下)中的行更改为: 并在初始化记录器之前调用此函数: private static void initial

我知道我的标题不是很简单,我想在这里更具体一些。 我使用的是log4j2,到目前为止,我的日志文件夹是:“C:\log”

我想将根驱动器(“C:”)更改为安装应用程序的位置

例如: 如果jar文件位于“d:\apps\jar.jar”中,则日志路径将为“d:\log” 如果jar文件位于“c:\apps\jar.jar”中,那么日志路径将是“c:\log”

我试图将log4j2.xml(以下)中的行更改为:

并在初始化记录器之前调用此函数:

private static void initialLog() {
    Path dllPath = Paths.get(System.getProperty("user.dir"));
    String driveLetter = dllPath.getRoot().toString().replace("\\", "");
    System.setProperty("myapp.data.dir", driveLetter);
}
org.apache.logging.log4j.core.LoggerContext ctx =
    (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
但这不是工作。有什么想法吗

我的旧log4j2.xml

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

  <Appenders>
      <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{dd/MM/yyyy HH:mm:ss:SSS}       %p       %c{1.}       %m%n"/>
    </Console>
    <File name="log" 
          fileName="C:/log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">
      <PatternLayout pattern="%d{dd/MM/yyyy,HH:mm:ss},%p,%m%n"
                        header="Date,Time,Type,Message%n"      />
      <Filters>
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL" />
        <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
        <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL" />
        <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
      </Filters>
    </File>

  </Appenders>
  <Loggers>
    <Root level="all">
      <AppenderRef ref="log" />
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

在您的示例中,我发现两种情况下日志的相对路径是相同的,因此,如果您始终希望具有该结构,可以将路径定义为:

<File name="log" 
      fileName="../log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">
您应该重新配置记录器:

private static void initialLog() {
    Path dllPath = Paths.get(System.getProperty("user.dir"));
    String driveLetter = dllPath.getRoot().toString().replace("\\", "");
    System.setProperty("myapp.data.dir", driveLetter);
}
org.apache.logging.log4j.core.LoggerContext ctx =
    (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
请记住,在这种情况下,您应该编辑配置xml文件以使用系统属性,如下所示:

<File name="log" 
      fileName="${sys:myapp.data.dir}/log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">


有趣的事实:使用根驱动器和构建路径有一种棘手的方法:

<Properties>
  <Property name="rootDrive">../../../../../../../../../../../../../../</Property>
</Properties>
<File name="log" 
      fileName="${rootDrive}/your/folder/structure/log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">

../../../../../../../../../../../../../../

请记住,除了您自己使用的项目之外,我不会建议您使用此选项,因为如果用户从更深的文件夹级别运行应用程序,可能会产生意外的结果。

在您的示例中,我发现在这两种情况下,日志的相对路径是相同的,因此,如果您始终希望具有该结构,您可以将路径定义为:

<File name="log" 
      fileName="../log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">
您应该重新配置记录器:

private static void initialLog() {
    Path dllPath = Paths.get(System.getProperty("user.dir"));
    String driveLetter = dllPath.getRoot().toString().replace("\\", "");
    System.setProperty("myapp.data.dir", driveLetter);
}
org.apache.logging.log4j.core.LoggerContext ctx =
    (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
请记住,在这种情况下,您应该编辑配置xml文件以使用系统属性,如下所示:

<File name="log" 
      fileName="${sys:myapp.data.dir}/log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">


有趣的事实:使用根驱动器和构建路径有一种棘手的方法:

<Properties>
  <Property name="rootDrive">../../../../../../../../../../../../../../</Property>
</Properties>
<File name="log" 
      fileName="${rootDrive}/your/folder/structure/log/log_${date:dd-MM-yyyy_HH-mm-ss}.csv">

../../../../../../../../../../../../../../

请记住,除了您自己使用的项目之外,我不会建议您使用此选项,因为如果用户从更深的文件夹级别运行应用程序,可能会产生意外的结果。

对于log4j2,您可以使用

# May change log file path as per the need
property.filename = ${sys:user.dir}/logs/debug.log

对于log4j2,您可以使用

# May change log file path as per the need
property.filename = ${sys:user.dir}/logs/debug.log

;可能问题在于log4j配置将在代码运行之前完成。但它的不工作不是一个错误的描述;可能问题在于log4j配置将在代码运行之前完成。但它的不工作并不是一个错误描述