log4cpp, похоже, не работает для нескольких приложений

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

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

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 кажется, заселены нормально.

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

Infact, если я просто создаю несвязанный файл журнала под названием 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 знает об этом, так как их больше! (и я предполагаю, что они все работают одинаково — поправьте меня, если не прав).

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]