Log4j: установка сгенерированного имени файла журнала, чтобы включить имя хоста - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь сгенерировать логи, используя log4j. Часть ведения журнала работает правильно, но я хочу включить имя хоста (где создаются журналы) для добавления в имя файла.

например: мое текущее имя файла журнала: logger.2019-06-12-06-14

что я хочу: logger_ $ HOST.2019-06-12-06-14 где $ HOST - это имя хоста

Я уже видел другие сообщения в stackoverflow и в зависимости от этого я установил имя хоста в своем коде Java, где я думаю, что оно устанавливается перед вызовом log4j

    static {
        try {
            HOST_NAME = InetAddress.getLocalHost().getCanonicalHostName();
        } catch (UnknownHostException e) {
            HOST_NAME = "localhost";
        }
        System.setProperty("hostname", HOST_NAME);
    }

и изменили файл cfg (где у нас есть свойства, определенные для всех регистраторов), чтобы включить системное свойство:

    *.*.log4j.appender.MyLogger.File=/logs/logger_$hostname;

Но сгенерированное результирующее имя файла - logger_ $ hostname.2019-06-12-06-14 (буквально $ hostname вместо значения свойства)

В постах упоминается, что способ присвоения переменной в файле cfg - logger _ $ {hostname} , но при компиляции он выдает ошибку с неожиданным {, поэтому Я просто поставил $ hostname .

Я пробовал и другие способы, например, поставить

    *.*.log4j.appender.MyLogger.File=/logs/logger_$env:hostname;

    *.*.log4j.appender.MyLogger.File=$hostname;

    *.*.log4j.appender.MyLogger.File=/logs/logger_$HOST;
 (thinking since its running in unix, it might pick the HOST variable :( )

но пока не повезло. Есть идеи, что я могу делать не так?

Кстати, я звоню регистратору по этому номеру:

    private static Logger logger = Logger.getLogger("MyLogger");

Итак, можно ли задать имя хоста из класса, в который я веду журнал. Я хочу вращать свои журналы каждую минуту, поэтому не хочу связываться с другими настройками log4j. Мои полные свойства app4 log4j:

    *.*.log4j.logger.myLogger=(INFO,MyLogger);
    *.*.log4j.additivity.myLogger=false; # this logger does not show up in main logs
    *.*.log4j.appender.MyLogger.File=/logs/logger_$hostname;
    *.*.log4j.appender.MyLogger.layout=org.apache.log4j.PatternLayout;
    # %n: new line for each entry
    *.*.log4j.appender.MyLogger.layout.ConversionPattern="%m%n";
    *.*.log4j.appender.MyLogger.Append=true;
    *.*.log4j.appender.MyLogger.ImmediateFlush=true;
    *.*.log4j.appender.MyLogger.Encoding=UTF8;

    # Enable 1 minute rotation
    *.*.log4j.appender.MyLogger.DatePattern="'.'yyyy-MM-dd-HH-mm";
    # Disable periodic flush since files will be flushed upon rotation that happens every minute
    *.*.log4j.appender.MyLogger.PeriodicFlush=false;

Любые идеи, чтобы исправить это будет очень полезно. (И извиняюсь, потому что это своего рода повторяющийся вопрос, но я не могу выяснить проблему с более ранними сообщениями :()

1 Ответ

0 голосов
/ 12 июня 2019

Вы можете использовать опцию ${env:HOST} в log4j2.xml для поиска среды, как указано в документации: https://logging.apache.org/log4j/2.0/manual/lookups.html#EnvironmentLookup

Например:

<RollingRandomAccessFile name="CustomLoggerRandomFile"
                             fileName="logs/${env:HOST}_system.log"
                             filePattern="${env:HOST}_system-%d{yyyy-MM-dd}-%i.log.gz"
                             immediateFlush="false">

РЕДАКТИРОВАТЬ: я предположил, что вы используете log4j2 и переменная $ HOST должна быть создана на хост-компьютере (где создаются журналы) в качестве переменной среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...