log4cxx asyncappender очищает все журналы перед выходом - PullRequest
0 голосов
/ 24 сентября 2019

Я использую Asynappender и DOMConfigurator для загрузки XML-файла.Я теряю половину логов.Мое приложение закрывается, но в журнале появляется только несколько журналов.

Я обнаружил, что вызов метода close () класса AsyncAppender обрабатывает ожидающие события перед выходом.Означает ли это, что он сбрасывает все журналы в файл журнала?И если да, то, поскольку у меня нет этого объекта, я просто загружаю файл, используя DOMConfigurator :: configure ().Как я могу получить объект Asynappender для вызова close ()?Есть ли другой способ очистить логи перед выходом?Использование какой-либо конфигурации в XML-файле?

Ниже приведен мой код для справки:

#include <log4cxx/logger.h>
#include <log4cxx/xml/domconfigurator.h>
#include<iostream>

using namespace log4cxx;
using namespace log4cxx::xml;
using namespace log4cxx::helpers;

LoggerPtr loggerMyMain(Logger::getLogger( "main"));

int main(int args, char **argv)
{
    DOMConfigurator::configure("asynclog4cxxconfig.xml");

    LOG4CXX_TRACE(perf, "this is a performance message!!!");
    LOG4CXX_DEBUG(loggerMyMain, "this is a debug message.");
    LOG4CXX_WARN (loggerMyMain, "this is a warn message, not too bad.");
    LOG4CXX_ERROR(loggerMyMain, "this is a error message, something serious is happening.");
    LOG4CXX_FATAL(loggerMyMain, "this is a fatal message!!!");

    return 0;
}

Ниже приведен XML-файл:

<?xml version="1.0" encoding="UTF-8" ?>
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="appxNormalAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="file" value="logfile" />
    <param name="MaxFileSize" value="1000KB" />
    <param name="MaxBackupIndex" value="3" />
    <param name="append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%X{process} %d %-5p %C{2} (%F:%L) - %m%n" />
    </layout>
  </appender>

  <appender name="async_appxNormalAppender" class="org.apache.log4cxx.AsyncAppender">
     <appender-ref ref="appxNormalAppender"/>
  </appender>

   <root>
       <priority value="debug" />
       <appender-ref ref="async_appxNormalAppender"/>
  </root>
</log4j:configuration>

1 Ответ

0 голосов
/ 25 сентября 2019

Проблема решена, выложите ее здесь, если это кому-то поможет.В конце добавлен фрагмент кода ниже.

LoggerPtr root_logger = Logger::getRootLogger();
AppenderPtr app_ptr = root_logger->getAppender("async_appxNormalAppender");
if(app_ptr != NULL)
   app_ptr->close();
...