Регистрация PID в log4j2 без использования контекста потока

Мне нужно включить PID в мои журналы log4js. Я вижу много примеров, в которых используется контекст потока. Однако их необходимо установить для каждого отдельного созданного потока. Я возражаю против этого.

Мне нужно решение, которое либо не использует контекст потока, либо может устанавливать PID для всех контекстов потока для любого потока, который может быть создан, из любого произвольного класса.


person ds390s    schedule 14.04.2017    source источник
comment
Для этого мы добавили запрос функции: issues.apache.org/jira/browse/ LOG4J2-1884   -  person Matt    schedule 17.04.2017


Ответы (1)


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

На данный момент вы можете создать собственный плагин. См. код ниже. Это позволит указать %pid в макете шаблона (аналогично %m для сообщения).

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;

@Plugin(name = "ProcessIdPatternConverter", category = "Converter")
@ConverterKeys({ "pid", "processId" })
public final class ProcessIdPatternConverter extends LogEventPatternConverter {
    private final String pid;

    private ProcessIdPatternConverter(String[] options) {
        super("Process ID", "pid");
        String temp = options.length > 0 ? options[0] : "???";
        try {
            // likely works on most platforms
            temp = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
        } catch (final Exception ex) {
            try {
                // try a Linux-specific way
                temp = new File("/proc/self").getCanonicalFile().getName();
            } catch (final IOException ignoredUseDefault) {}
        }
        pid = temp;
    }

    /**
     * Obtains an instance of ProcessIdPatternConverter.
     *
     * @param options users may specify a default like {@code %pid{NOPID} }
     * @return instance of ProcessIdPatternConverter.
     */
    public static ProcessIdPatternConverter newInstance(final String[] options) {
        return new ProcessIdPatternConverter(options);
    }

    @Override
    public void format(final LogEvent event, final StringBuilder toAppendTo) {
        toAppendTo.append(pid);
    }
}

Дополнительные сведения о работе подключаемых модулей Log4j2 см. в руководстве.

Один из способов позволить Log4j2 распознать ваш плагин — указать имя пакета класса плагина в атрибуте packages конфигурации:

<Configuration status="trace" 
     packages="com.myorg.mypluginpackage">

(Trace включает внутреннюю отладку Log4j2, чтобы помочь в устранении неполадок.)

person Remko Popma    schedule 15.04.2017
comment
Да, но не могли бы вы отредактировать ответ, включив в него информацию о добавлении пакета нового класса в конфигурацию log4j2.xml? - person ds390s; 17.04.2017