我已经编写了最基本的log4cpp函数,可以通过FileAppender写入文件。请参阅下面的run_appender.hpp
:
注意:由于我没有log4cpp,因此我无法在其互联网PC上对其进行测试-因此,这是从我在安全PC上制作的一个最小示例中手工复制的,但是有效(除非我输入了o型)。
run_appender.hpp:
#include <chrono>
#include <thread>
#include <string>
#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/OstreamAppender.hh"
#include "log4cpp/PatternLayout.hh"
#include "log4cpp/PropertyConfigurator.hh"
void run_appender(std::string app_name, std::string cat_name, std::string file_name)
{
log4cpp:FileAppender *p_appender = new log4cpp:FileAppender(app_name, file_name);
log4cpp::PatternLayout *p_layout = new log4cpp::PatternLayout();
p_layout->setConverstionPattern("%m%n"); //msg + new line
log4cpp::Category& cat(log4cpp::Category::getInstance(cat_name));
cat.addAppender(p_appender);
cat.setPriority(log4cpp::Priority::DEBUG);
for (unsigned int i = 0; i < 12; i++)
{
cat.infoStream() << app_name << "," << cat_name << ": " << i;
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); //1 sec
}
}
应用1:
#include "run_appender.h"
int main()
{
std::thread t([](){ run_appender("app_alone1", "cat_alone1", "alone1.log"); });
t.join();
}
应用2:
#include "run_appender.h"
int main()
{
std::thread t([](){ run_appender("app_alone2", "cat_alone2", "alone2.log"); });
t.join();
}
因此run_appender()
随即创建了FileAppender并将其添加到类别中并写入几次。这三个参数依次为appender name
,category name
和file name
。
然后我有两个应用程序。两者都可以独立工作,(例如)应用程序1的输出为:
app_alone1,cat_alone1: 0
app_alone1,cat_alone1: 1
:
app_alone1,cat_alone1: 10
app_alone1,cat_alone1: 11
但是,如果我开始运行应用程序1(登录到alone1.log
),然后中途进入运行应用程序2(登录到alone2.log
),则alone1.log
将不复存在。 App 1和App 2似乎很高兴继续运行,除了文件alone1.log
中没有输出,并且alone2.log
似乎填充得很好。
因此,在运行它们的测试结束时,两个结果都是我有一个良好的日志文件,而另一个丢失了。如果我运行该应用程序以运行丢失的日志文件并创建了该日志文件,但是immidiatley会删除其他日志文件。
事实上,如果我只是在同一文件夹中创建一个名为test.log
的不相关日志文件-也会被删除!
另外,如果文件存在,可以说应用程序1运行并生成alone1.log
,然后我再次运行应用程序1,即使{的默认选项为alone1.log
,它也会覆盖append = true
。 {1}}功能...
注意:我不想使用属性文件,我想以编程方式执行此操作,因为它更方便地向我的各种应用程序分发简单的API,并且该API可以执行属性文件的操作不能...
注意:对于此示例,我并不担心代码正确性,只想关注这个问题:)
更新
我运行的应用程序1稍有不同,将日志文件放入名为FileAppender(name, filename, append = true)
的子文件夹中,如下所示:
a1/
现在两个都同时运行...我确定我缺少一些有关log4cpp的重要信息...
我要添加std::thread t([](){ run_appender("app_alone1", "cat_alone1", "a1/alone1.log"); });
标记,以防万一jog4j的人们都知道这一点,因为它们更多了! (而且我假设它们都以类似的方式工作-如果有误,请纠正我)。