Как зарегистрировать идентификатор процесса, используя Log4cxx или log4j

Я использую log4cxx мой проект, и я могу записать текущий идентификатор потока, используя маркер [%t], как записать в него идентификатор процесса или log4j?.

Я использую файл конфигурации ConversionPattern & xml.

Спасибо,

5 ответов

Основываясь на вышеупомянутых ответах, я собираюсь сделать это в log4j следующим образом:

import java.lang.management.*;
import org.apache.log4j.MDC;

private String getPID() {
  RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
  return rt.getName();
}

private void configLog4j() {
  // call this from somewhere before you start logging
  MDC.put("PID", getPID());
}

Тогда в моем log4j.properties:

log4j.appender.FILE.layout.ConversionPattern=%d %X{PID} [%t] %p %c{1} %x - %m%n

Это на самом деле даст PID, который состоит из идентификационного номера и имени хоста, по крайней мере, в моей реализации Java, и из того, что я прочитал, может зависеть от конкретной реализации. Вы можете пойти дальше и выделить только PID.

Я просмотрел документацию log4j и log4cxx и нигде не нашел ничего о регистрации процесса id.

Итак, чтобы быть кратким: нет, вы не можете регистрировать идентификатор процесса, по крайней мере, не напрямую.

Поскольку вы используете C++, вы можете получить PID вашей программы. Вот как это сделать в Linux (Ubuntu по этой ссылке). Вот как это сделать в Windows.

Получите этот PID в начале вашей программы, используйте MDC и вставьте в него свой PID.

Я не думаю, что есть лучший способ.

Делать это в log4j было бы еще сложнее, так как я не знаю способа для работающей программы получить свой PID, используя стандартные классы Java.

Этого не существует ни в одном из log4xxx, но с небольшим усилием вы можете сделать это самостоятельно. На самом деле это очень простая задача, если вы не возражаете против небольшого кодирования. Это в основном то, что я делал несколько раз: переопределить фактический appender или его макет, убедитесь, что ваш класс вставляет идентификатор процесса в карту свойств события. Затем используйте это свойство по имени, как если бы оно было свойством MDC. Использование MDC напрямую, как предложено выше, не лучший выбор, потому что они связаны с потоками, и вы должны быть уверены, что каждый поток помещает PID при запуске. Но если вы не можете или не хотите переопределять appender или layout, то это, вероятно, будет единственным вариантом.

Ответ @skiphoppy очень хорошо работает для Log4j1.x, но я подумал, что его можно обновить, чтобы показать, как он работает в новом Log4j2.

(ПРИМЕЧАНИЕ. Я попытался отправить это как редактирование публикации выше, так как это всего лишь небольшая ревизия кода ответа, но я публикую его как отдельный ответ, поскольку моя ревизия была отклонена.)

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import org.apache.logging.log4j.ThreadContext;

private String getPID() {
  RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
  return rt.getName();
}

private void configLog4j() {
  // Here is the Log4j2 way
  ThreadContext.put("PID", rtmx.getName());
}

Как говорится в ответе Скифоппи, он выводит немного больше, чем просто идентификатор процесса. Например, на моей машине (Fedora 20):

16237@localhost.localdomain

Вы можете извлечь только идентификатор процесса с помощью следующего кода, размещенного в файле конфигурации XML: %replace{%X{PID}}{[A-Za-z@\.]*}{}

Учитывая приведенный выше вывод для идентификатора процесса:

16237@localhost.localdomain

регулярное выражение будет производить

16237

В Log4J нет функции для достижения этой цели, однако вы можете передать идентификатор процесса и использовать его.

Этот пост в блоге показывает один из способов: http://blackbeanbag.net/wp/2009/01/14/log-file-management-in-coherence-using-log4j/

По сути, передайте идентификатор процесса как системное свойство, а затем используйте его в шаблоне Log4j.

По-видимому, это связано с тем, что JVM не предоставляет простой способ доступа к идентификатору процесса. Начиная с JDK1.5+, это может работать: http://www.theresearchkitchen.com/archives/100

Другие вопросы по тегам