В соответствии с документацией log4cxx для того, чтобы сделать это в настоящее время
вам нужно объявить хотя бы один контекст MappedDiagnostic.
Непроверенный частичный фрагмент этого показан ниже
#include <sys/types.h>
#include <log4cxx/mdc.h>
#include <iostream>
#include <sstream>
int main (int argc, char **argv)
{
//at the start of your program
pid_t pid = getpid();
pid_t tid = gettid();
std::string pidstring;
std::string tidstring;
std::stringstream buffer;
buffer << pid << std::endl;
pidstring = buffer.str();
buffer.str(std::string());
buffer << tid << std::endl;
tidstring = buffer.str();
buffer.str(std::string());
MDC::put( "pid", pidstring);
MDC::put( "tid", tidstring);
// do actual stuff here
return 0;
}
После дальнейшей проверки источника log4cxx я понял, что файл не принимает ConversionPattern, а FileNamePattern делает. Я полагаю, что вы можете использовать FileNamePattern, только если вы используете TimeBasedRollingPolicy или FixedWindowRollingPolicy.
Теперь вы можете добавить processid в журнал
добавив следующий параметр в теги appender в файле конфигурации XML.
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="MyApplication-%d{yyyy-MM-dd}- %X{pid}.log"/>
<param name="activeFileName" value="MyApplication.log"/>
</rollingPolicy>
<param name="file" value="appxDailyLog.log"/>
или вы можете включить его в макет шаблона, указав следующие теги макета также внутри тегов appender в файле конфигурации XML.
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%X{pid} %X{tid} %d{yyyy-MM-dd HH:mm:ss,SSS}"/>
</layout>
Нет простого способа из файла конфигурации, чтобы каждый процесс добавлял свой собственный процесс в свой собственный журнал, как вы знакомы в log4net.
Было несколько потоков списка рассылки log4cxx, в которых упоминалось динамическое переименование журнала, но все они включали многочисленные изменения в коде C ++, и они не выполняют то, что вы запрашиваете.
Используемый ими метод предполагает наличие <param name="file" value="${logfilename}"/>
, где $ logfilename - это переменная окружения, которая устанавливается
std::string filename ="MyApp-";
filename.append(pidstring);
logger = Logger::getLogger("Nameoflogger");
setenv("logfile.name", "MyApp.log", 1);
вызывая что-то вроде приведенного выше фрагмента в коде C ++, каждый раз, когда вы хотите изменить имя журнала.
Другие методы будут включать исправления для log4cxx, поскольку в настоящее время он не обладает необходимыми вам функциями .
Ссылки
log4cxx Wiki шаблона преобразования
Краткое введение в Apache log4cxx
log4cxx Учебник
Справочник по классу MDC log4cxx