2012-01-09 13 views
5

Deseo iniciar sesión en archivos diferentes en mi código.Inicie sesión en un archivo diferente con log4cxx

¿Cómo puedo hacer que en log4cxx con la configuración XML o mediante programación en código ...

  • Supongamos que tengo 1.k, k + 1, .. n componentes.
  • Se ejecutan en la misma aplicación
  • Quiero log k componente al registrador-k, log k + componente 1 al registrador-k + 1 al mismo tiempo

Actualización:

Logger.addAppender() enfoque:

log4cxx::helpers::Pool p; 

std::string paramAppender = "appxNormalAppender"; 
std::string paramFileName = "\\Logs\\MyLog.txt"; 

LOG4CXX_DECODE_CHAR(logAppender, paramAppender); 
LOG4CXX_DECODE_CHAR(logFileName, paramFileName); 


FileAppenderPtr fileAppender = 
logger->getLoggerRepository()->getRootLogger()->getAppender(logAppender); 

if(fileAppender!= NULL) 
{ 


    fileAppender->setFile(logFileName); 

    fileAppender->activateOptions(p); 

} 

Esto no funciona porque

Supongamos que configuro FileName en Logger-k para el componente k, se registra en Logger-k, luego configuro el nombre de archivo en Logger-k + 1 para compoent k + 1, luego ambos componentes k, y k + 1 registra el mismo loggerk + 1 archivo. Parece anulaciones de último nombre de archivo o efectos todos los otros ...

Y

Todo compenent compoenent 1, ... k compoeent, componentk + 1, .... componentes N están en la misma aplicación ...

Respuesta

2

crear cada uno de los registradores de la forma habitual, y luego para cada registrador de añadir un FileAppender establece en el archivo deseado a través del método Logger.addAppender().

+0

No funciona ... Puse una actualización sobre mi pregunta ... ¿Puedo hacer algo mal ... Así que puse un código ... – Novalis

+0

está intentando restablecer el archivo del registrador de nivel raíz nombre y por lo tanto, donde todo se registra. Debe agregar un FileAppender separado a cada componente para iniciar sesión en el archivo especificado. – diverscuba23

+0

Puede dar un código de muestra ... ¿Cómo separar FileAppender? – Novalis

1

Necesita crear apéndices independientes para sus registradores. En mi ejemplo, he creado afile1 y afile2 appenders. También creé dos registradores: my.logger1 y my.logger2. Cuando se utiliza my.logger1 registra a archivo mylog1, cuando se utiliza my.logger2 registra a mylog2 archivo.

Aquí está mi log.properties archivo:

log4cplus.appender.afile1.layout=log4cplus::PatternLayout 
log4cplus.appender.afile1.layout.ConversionPattern=%d [ %c{1} ] [ %-5p ] %m%n 
log4cplus.appender.afile1=log4cplus::RollingFileAppender 
log4cplus.appender.afile1.File=mylog1.log 
log4cplus.appender.afile1.MaxFileSize=5MB 
log4cplus.appender.afile1.MaxBackupIndex=2 

log4cplus.appender.afile2.layout=log4cplus::PatternLayout 
log4cplus.appender.afile2.layout.ConversionPattern=%d [ %c{1} ] [ %-5p ] %m%n 
log4cplus.appender.afile2=log4cplus::RollingFileAppender 
log4cplus.appender.afile2.File=mylog2.log 
log4cplus.appender.afile2.MaxFileSize=5MB 
log4cplus.appender.afile2.MaxBackupIndex=2 

log4cplus.logger.my.logger1=INHERIT, afile1 
log4cplus.additivity.my.logger1=false 
log4cplus.logger.my.logger2=INHERIT, afile2 
log4cplus.additivity.my.logger2=false 

Aquí es un ejemplo Programm:
example.cpp:

#include <iostream> 
#include <log4cplus/logger.h> 
#include <log4cplus/loglevel.h> 
#include <log4cplus/configurator.h> 
#include <log4cplus/fileappender.h> 

#define MYLOG1_INFO(logEvent) LOG4CPLUS_INFO (log4cplus::Logger::getInstance("my.logger1"), logEvent) 
#define MYLOG2_INFO(logEvent) LOG4CPLUS_INFO (log4cplus::Logger::getInstance("my.logger2"), logEvent) 

int main(int argc, char**argv) 
{ 
    try 
    { 
     log4cplus::PropertyConfigurator::doConfigure("log.properties"); 
    } 
    catch(...) 
    { 
    std::cerr<<"Exception occured while opening log.properties\n"; 
    return -1; 
    } 
    MYLOG1_INFO("hello world!"); 
    MYLOG2_INFO("hello world!"); 
    return 0; 
} 

Aquí está Makefile (supongo que mi log4cplus es construido en el dirrectory primario):

CXXFLAGS+=-I$(abspath ../log4cplus-1.0.4/include) 
all: example.o 
    $(CXX) $^ $(abspath ../log4cplus-1.0.4/src/.libs/liblog4cplus.a) -lpthread -o test 

Pruebe con este ejemplo y debe entender cómo funcionan los appenders

Log4cplus es en su mayoría como log4j.para que pueda leer los principios básicos log4j. Y Para obtener los nombres de las clases, debe visitar log4cplus.sourceforge.net

Acerca del formato de registro. La documentación para log4cplus está disponible solo en doxygen. por lo que aquí se puede leer sobre formating in pattern layout
Y si desea registrar identificador de proceso, de lo que debe utilizar% i en su patrón de conversión de diseño
ejemplo:

... 
log4cplus.appender.afile2.layout.ConversionPattern=[%i] %m%n 
... 

Se registrará identificador de proceso y el mensaje

+0

lo siento, escribió sobre log4cplus. Pero créanme, es mejor que log4cxx – 2r2w

+0

Parece que log4cplus está "Muerto". [Última versión de enero de 2011] y también adolece de falta de documentación. Puedo elegir log4cplus si puedo hacer con esto: Verifique mi pregunta: http://stackoverflow.com/questions/9082413/add-process-id-to-log-file-name-in-log4cxx – Novalis

+0

última versión de log4cxx fue en 2008-04-03 http://logging.apache.org/log4cxx/changes-report.html y la última versión de log4cplus fue en 2011. Más log4cxx tiene versión 0.10 y log4cplus tienen versión 1.04 Parece que log4cxx es mucho más proyecto muerto – 2r2w

1

Para los componentes dinámicos probar esto:

#include <boost/foreach.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind.hpp> 
#include <boost/lexical_cast.hpp> 

#include <log4cxx/Logger.h> 
#include <log4cxx/LogManager.h> 
#include <log4cxx/xml/domconfigurator.h> 
#include <log4cxx/FileAppender.h> 
#include <log4cxx/SimpleLayout.h> 
#include <log4cxx/helpers/transcoder.h> 


void func(int k) { 
    std::string strName = "Log." + boost::lexical_cast<std::string>(k); 
    log4cxx::LoggerPtr log = log4cxx::Logger::getLogger(strName); 
    LOG4CXX_DECODE_CHAR(fileName, strName + ".log"); 
    log4cxx::FileAppenderPtr appender(new log4cxx::FileAppender(new log4cxx::SimpleLayout, fileName, false)); 
    log->addAppender(appender); 

    LOG4CXX_INFO(log, strName); 

    log->removeAppender(appender); 
} 

int main(int argc, char * argv[]) { 
    log4cxx::xml::DOMConfigurator::configure("trace.xml"); 
    if(log4cxx::Logger::getLogger("Log")->getAllAppenders().empty()) { 
     std::cout << "failed to config log4cxx" << std::endl; 
     return 1; 
    } 
    log4cxx::LoggerPtr log = log4cxx::Logger::getLogger("Log"); 

    boost::thread_group threadGroup; 
    for(int k = 0; k != 3; ++k) { 
     threadGroup.create_thread(boost::bind(func, k)); 
    } 
    threadGroup.join_all(); 
    return 0; 
} 

con trace.xml sencilla

Cuestiones relacionadas