多个log4cxx Dom Configurator在单个进程中

时间:2012-05-03 07:32:22

标签: c++ process log4cxx

我有2个不同的com组件,它们在同一个进程中实例化。这两个组件都使用Log4cxx DomConfigurator并配置不同的log4cxx config xml文件。每个都指定日志的不同路径。但是日志是在最新实例化的com组件指定的路径中创建的。

我希望这两个COM组件日志将在单独的文件中。怎么做到这一点?

3 个答案:

答案 0 :(得分:0)

如果您使用相同的进程或线程,则logcxx会尝试覆盖之前的进程或线程。所以最好启动另一个线程并分配logcxx来进行下一次日志记录。那一切都会好的。

答案 1 :(得分:0)

具有此代码的组件1或者您可以在任何组件可以使用的logcxx包装器公共类中编写。

strPath = "AppLog1.dat";
log4cxx::BasicConfigurator::configure();
log4cxx::File cfgFile(strPath);
log4cxx::PropertyConfigurator::configureAndWatch(cfgFile, 60000);

组件2具有相同的代码,具有不同的AppLog2.dat文件

示例dat文件。

#Log4cxx configuration file . 
#Final version of log4cxx config 
#Author - Sri  4/5/2012

# Root logger set to DEBUG using the A2 apender defined above. 
# Set options for appender named 'DT' 
# DT's layout is TTCC, using the 
# ISO8061 date format with context printing enabled. 

log4j.appender.DT=RollingFileAppender 
log4j.appender.DT.layout=TTCCLayout
log4j.appender.DT.File=.\\log\\log.log
log4j.appender.DT.layout.ContextPrinting=enabled
log4j.appender.DT.layout.DateFormat=ISO8601
log4j.appender.DT.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.DT.rollingPolicy.FileNamePattern=.\\log\\log-%d.log.zip




# Set options for appender named 'RawAppender' 
# RawAppender's layout is PatternLayout

log4j.appender.RawAppender=RollingFileAppender 
log4j.appender.RawAppender.layout=TTCCLayout
log4j.appender.RawAppender.File=.\\log\\Raw.log
log4j.appender.RawAppender.layout.ContextPrinting=enabled
log4j.appender.RawAppender.layout.DateFormat=ISO8601
log4j.appender.RawAppender.rollingPolicy=org.apache.log4j.rolling.
TimeBasedRollingPolicy
log4j.appender.RawAppender.rollingPolicy.FileNamePattern=.\\log\\RawData-%d.log.zip


# Set options for appender named 'ErrorAppender' 
# ErrorAppender's layout is TTCC, using the 
# ISO8061 date format with context printing enabled. 

log4j.appender.ErrorAppender=RollingFileAppender 
log4j.appender.ErrorAppender.MaxBackupIndex=10 
log4j.appender.ErrorAppender.layout=TTCCLayout
log4j.appender.ErrorAppender.File=.\\log\\Error.log
log4j.appender.ErrorAppender.layout.ContextPrinting=enabled
log4j.appender.ErrorAppender.layout.DateFormat=ISO8601
log4j.appender.ErrorAppender.rollingPolicy=org.apache.log4j.rolling.
TimeBasedRollingPolicy
log4j.appender.ErrorAppender.rollingPolicy.FileNamePattern=.\\log\\Error-%d.log.zip


# Root logger set to DEBUG using the A2 apender defined above. 

log4j.rootLogger=DEBUG, DT


# The logger 'DTError' inherits its level from the 
# logger hierarchy. Output will go to the appender's of the root 
# logger, DT in this case. 

log4j.logger.DTError=INHERIT,ErrorAppender

/////////////////////////////////////////////// ///////////////////////// 编写第二个组件的配置文件时,只需更改日志路径或文件名。

欢呼。

答案 2 :(得分:0)

我意识到这个帖子已经有几年了......但是不觉得它得到了回答。

您的问题是如何将每个组件的日志记录输出到不同的文件。这个问题的标题是“单个进程中的多个DOM配置器”......对于您正在尝试做的事情而言,这不是正确的答案。

如果您使用的是DOM配置,则可以轻松定义多个将写入不同文件的Appender。

<appender name="LogFileA" class="org.apache.log4j.FileAppender">
    <param name="file" value="/tmp/logs/logA.log"/>
    <param name="append" value="true"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %c %-5p (%F:%L) - %m%n"/>
    </layout>
</appender>

<appender name="LogFileB" class="org.apache.log4j.FileAppender">
    <param name="file" value="/tmp/logs/logB.log"/>
    <param name="append" value="true"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %c %-5p (%F:%L) - %m%n"/>
    </layout>
</appender>

然后为每个组件定义一个使用相应Appender的记录器。

<logger name="componentA">
    <priority value="all"/>
    <appender-ref ref="LogFileA"/>
</logger>

<logger name="componentB">
    <priority value="all"/>
    <appender-ref ref="LogFileB"/>
</logger>

配置并检索指向相应记录器的指针:

log4cxx::xml::DOMConfigurator::configure("xml_config_file");
log4cxx::LoggerPtr componentA = log4cxx::Logger::getLogger("componentA");
log4cxx::LoggerPtr componentB = log4cxx::Logger::getLogger("componentB");

虽然我怀疑这个答案会对你有所帮助......我希望它会帮助其他有类似问题的人。