log4cpp, похоже, не работает для нескольких приложений - PullRequest
0 голосов
/ 18 сентября 2018

Я написал основную функцию log4cpp, которую я могу записать в файл через FileAppender.См. run_appender.hpp ниже:

Примечание: Я не могу проверить это на своем интернет-ПК, так как на нем нет log4cpp - так что это вручную скопировано из минимального примера.сделано на моем защищенном ПК, но работает (если я не набрал o-type).

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 перестает существовать.Приложение 1 и приложение 2, похоже, благополучно продолжаются, за исключением того, что нет вывода в файл alone1.log, а alone2.log кажется заполненным нормально.

Так что в конце теста, где я запускаю их обаВ результате у меня есть один хороший файл журнала и один отсутствует.Если я запускаю приложение для отсутствующего файла журнала, он запускает и создает файл журнала, но он immidiatley удаляет другой файл журнала.

Фактически, если я просто создаю несвязанный файл журнала с именем test.log в той же папке- это также удаляется!

Кроме того, если файл существует, допустим, приложение 1 запускается и генерирует alone1.log, то я снова запускаю приложение 1, оно перезаписывает alone1.log, хотя по умолчанию установлено значение append = true для функции FileAppender(name, filename, append = true) ...

  • Почему он удаляет все остальные файлы журналов при запуске log4cpp?
  • Почему log4cpp всегда перезаписывает файлы - и никогда не добавляется?
  • Как я могу исправить это поведение?

Примечание: Я не хочу использовать файлы свойств, я хочу сделать это программно, потому что это более удобнораспространять простой API для моих различных приложений, и API может делать то, что файл свойств не может ...

Примечание Меня не беспокоит правильность кода в этом примере, просто хочусосредоточиться на проблеме:)

ОБНОВЛЕНИЕ

Я запустил приложение 1 с небольшим отличием и поместил файл журнала в подпапку с именем a1/ примерно так:

std::thread t([](){ run_appender("app_alone1", "cat_alone1", "a1/alone1.log"); });

Теперь оба работают одновременно ... Я уверен, что мне не хватает важной информации о log4cpp ...

Я добавляю log4j тег в случае, если кто-нибудь из jog4j знает об этом, так как их больше!(и я предполагаю, что все они работают одинаково - поправьте меня, если не прав).

...