Добавьте идентификатор процесса к имени файла журнала в log4cxx - PullRequest
3 голосов
/ 31 января 2012

В log4net я могу легко установить идентификатор процесса для логового имени файла из конфигурации легко

<appender name="LogFileAppender" 
type="log4net.Appender.RollingFileAppender,log4net">

<file type="log4net.Util.PatternString" value="Log[%processid]" />
  • Могу ли я сделать то же самое для log4cxx из файла конфигурации?
  • Если да, то как?

1 Ответ

2 голосов
/ 13 февраля 2012

В соответствии с документацией 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

...