Я написал основную функцию 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)
функция …
Замечания: Я не хочу использовать файлы свойств, я хочу сделать это программно, потому что более удобно распространять простой API для моих различных приложений, и API может делать то, что файл свойств не может …
Заметка Я не беспокоюсь о правильности кода для этого примера, просто хочу сосредоточиться на проблеме 🙂
ОБНОВИТЬ
Я запустил приложение 1 с небольшой разницей и поместил файл журнала в подпапку под названием a1/
вот так:
std::thread t([](){ run_appender("app_alone1", "cat_alone1", "a1/alone1.log"); });
Теперь оба работают одновременно … Я уверен, что мне не хватает важной информации о log4cpp …
Я добавляю log4j
тег в случае, если кто-нибудь из jog4j знает об этом, так как их больше! (и я предполагаю, что они все работают одинаково — поправьте меня, если не прав).
Задача ещё не решена.
Других решений пока нет …