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