log4cpp似乎不适用于多种应用程序

时间:2018-09-18 17:35:11

标签: c++ logging log4j log4cpp

我已经编写了最基本的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 namecategory namefile 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}}功能...

  • 为什么在启动log4cpp时会删除所有其他日志文件?
  • 为什么log4cpp总是覆盖文件-而从不追加文件?
  • 如何解决此问题?

注意:我不想使用属性文件,我想以编程方式执行此操作,因为它更方便地向我的各种应用程序分发简单的API,并且该API可以执行属性文件的操作不能...

注意:对于此示例,我并不担心代码正确性,只想关注这个问题:)

更新

我运行的应用程序1稍有不同,将日志文件放入名为FileAppender(name, filename, append = true)的子文件夹中,如下所示:

a1/

现在两个都同时运行...我确定我缺少一些有关log4cpp的重要信息...

我要添加std::thread t([](){ run_appender("app_alone1", "cat_alone1", "a1/alone1.log"); });标记,以防万一jog4j的人们都知道这一点,因为它们更多了! (而且我假设它们都以类似的方式工作-如果有误,请纠正我)。

0 个答案:

没有答案