在 log4net 中,我可以轻松地将进程 ID 设置为从配置中轻松记录文件名
<appender name="LogFileAppender"
type="log4net.Appender.RollingFileAppender,log4net">
<file type="log4net.Util.PatternString" value="Log[%processid]" />
- 我可以对配置文件中的 log4cxx 执行相同的操作吗?
- 如果是,如何?
根据 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 采用。我相信只有在使用 TimeBasedRollingPolicy 或 FixedWindowRollingPolicy 时才能使用 FileNamePattern。
现在,您可以通过在 XML 配置文件的 appender 标签中添加以下参数来将 processid 添加到日志中。
<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"/>
或者您可以通过在 XML 配置文件的 appender 标记中指定以下布局标记来将其包含在模式布局中。
<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 Conversion Pattern Wiki