Как уничтожить экземпляры log4j logger - PullRequest
0 голосов
/ 18 февраля 2019

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

Итак, я не могу просто получить регистратор для имени класса, добавить файл appender, записать журналы, закрыть и удалить appender, потому что при запуске параллельного кода - logger будет содержать обаappenders и logs будут записываться в оба файла.

Итак, я могу создать новый экземпляр logger для каждого выполнения Logger.getLogger (classname + counter), но как пометить его как мусор после завершения работы?

PS Более того ... Мне нужна распечатка нескольких сообщений в консоль от всех этих регистраторов.

Возможно, я что-то не так делаю, возможно, log4j не создан для этого шаблона, и я должен его реализовать.Но log4j - приоритет для меня, потому что он уже широко используется в этом большом приложении.

Заранее спасибо, Андрей!

1 Ответ

0 голосов
/ 19 февраля 2019

Вы не можете уничтожить / очистить экземпляры Appender.Но вы можете улучшить имеющееся у вас решение с помощью панели инструментов Log4j2.

Возможна маршрутизация в динамические файлы в Log4j, но в большинстве случаев достаточно Marker в файле или, по крайней мере, отправная точка дляболее сложная маршрутизация.

Пожалуйста, прочтите его документацию .Особенно последний абзац важен для вашего случая:

При их использовании необходимо учитывать некоторые важные правила, касающиеся маркеров.

  1. Маркеры должны быть уникальными.Они постоянно регистрируются по имени, поэтому следует позаботиться о том, чтобы маркеры, используемые в вашем приложении, отличались от маркеров в зависимостях приложения, если только этого не требуется.
  2. Родительские маркеры можно динамически добавлять или удалять.Однако это довольно дорого.Вместо этого рекомендуется идентифицировать родителей при первом получении Маркера, как показано в приведенных выше примерах.В частности, метод set заменяет все маркеры в одной операции, в то время как добавление и удаление действуют одновременно только на один маркер.
  3. Оценка маркеров с несколькими предками намного дороже, чем у маркеров без родителей.Например, в одном наборе тестов для оценки соответствия Маркера своему деду потребовалось в 3 раза больше времени, чем при оценке самого Маркера.Даже в этом случае оценка маркеров является недорогой по сравнению с разрешением имени класса вызывающего абонента или номера строки.

Тогда вы можете использовать маркер в конфигурации в тех местах, где ожидается шаблон, например:$${marker:}.Я не использовал это в имени файла, хотя и сомневаюсь, что это работает, но вы можете создать маршрутизацию на основе Маркер .

Я использовал этот простой тестовый скриптобратите внимание на использование Marker, которое создается для каждой строки из сканера.В вашем случае он будет создан с помощью config или из входных данных сервлета или подобного.

package toTest;

import java.util.Scanner;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

public class TestMe {
    private final Logger myOneAndOnlyLogger = LogManager.getLogger("MyCentralName");
    public static void main(String[] args) {
        new TestMe().doMyThing();
    }

    private void doMyThing() {
        Scanner input = new Scanner(System.in);
        String line = "";
        while(!line.equals("QUIT")) {
            System.out.println("Line: ");
            line = input.nextLine();
            Marker forThisRound = MarkerManager.getMarker(line);
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "1");
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "2");
            System.out.println("Line done.");
        }
    }
}

и это log4j2.properties (пример файла, который я имел под рукой с маркером в шаблоне):

status = error
name = MarkerExample

#Make sure to change log file path as per your need
property.filename = /tmp/java/marker.log

filters = threshold

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appenders = rolling

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /tmp/java/debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} $${marker:} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MBONE
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20

loggers = rolling

#Make sure to change the package structure as per your application

logger.rolling.name = MyCentralName
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...