log4j2 - изменить корневую папку по умолчанию - PullRequest
0 голосов
/ 04 сентября 2018

Я знаю, что мой титул не очень еле, я пытаюсь быть более конкретным здесь. Я использую log4j2, и до сих пор моя папка журнала была: "C: \ log"

Я хочу изменить корневой диск ("C:") на то место, где установлено приложение.

Например: Если файл jar находится в «d: \ apps \ jar.jar», путь к журналу будет «d: \ log» и если файл jar находится в «c: \ apps \ jar.jar», путь к журналу будет «c: \ log»

Я попытался изменить строку в моем log4j2.xml (ниже) на:

fileName="${myapp.data.dir}/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);
}

Но это не работа. Любая идея?

Мой старый 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>

1 Ответ

0 голосов
/ 04 сентября 2018

В вашем примере я вижу, что относительный путь к журналам одинаков в обоих случаях, поэтому, если вы всегда хотите иметь такую ​​структуру, вы можете определить путь как:

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

Если вы хотите (пере) настроить путь к файлу во время выполнения, отметьте ответ . Короче говоря, после настройки системного свойства с помощью

 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">

Имейте в виду, однако, что я бы не советовал это использовать для каких-либо целей, кроме проектов, которые вы будете использовать только для себя, поскольку это может привести к неожиданным результатам, если пользователь запустит приложение из более глубокого уровня папок.

...