单个进程中的多个 log4cxx Dom 配置器

Multiple log4cxx Dom Configurator in single process

本文关键字:log4cxx Dom 配置 进程 单个      更新时间:2023-10-16

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

我希望这 2 个 COM 组件日志将位于单独的文件中。如何实现这一点?

如果您使用相同的进程或线程,则 logcxx 尝试覆盖前一个进程或线程。因此,最好启动另一个线程并分配logcxx执行下一个日志记录。然后一切都会好起来的。

组件 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
//

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

干杯。

我意识到这个线程已经有几年的历史了......但不要觉得它得到了回答。

您的问题是如何将日志记录输出到每个组件的不同文件。 这个问题的标题"单个进程中的多个 DOM 配置器"...不是您要做的事情的正确答案。

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

<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>

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

<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");

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