Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261

Как создать два логера для одного и того-же файла, но с разными форматными строками?

10.10.2024, 04:09. Показов 860. Ответов 4

Студворк — интернет-сервис помощи студентам
Может из названия не ясно. Попробую еще раз объяснить проблему.
Вобщем есть программа, которая при логировании выводит кучу "попутных" данных: дату, время, имя компьютера, имя логера, первую букву типа выводимой информации. И только в конце то, что я хочу напечатать. Да удобно, пусть так и остается.
Но мне понадобилось некоторую информацию выводить без всех этих "попутных" данных, в этот-же файл.
Попробовал задать два разных логера с/без "попутных" данных. Программа работает нормально, пока используется только один из логеров, как только пытаюсь вывести инфу через другой логер, сразу валится в исключение. Причем не имеет значение, каким из логеров пользоваться в начале, и каким логером потом "увалить" прогу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define FILE_LOG  "app.log"
 
#include "Poco/Logger.h"
#include "Poco/PatternFormatter.h"
#include "Poco/FormattingChannel.h"
#include "Poco/FileChannel.h"
#include "Poco/Message.h"
 
using Poco::Logger;
using Poco::PatternFormatter;
using Poco::FormattingChannel;
using Poco::FileChannel;
using Poco::Message;
 
FormattingChannel* pFCFileShort;
Logger* logShort;
FormattingChannel* pFCFile;
Logger* log;
 
pFCFileShort = new FormattingChannel(new PatternFormatter("%t"));
pFCFileShort->setChannel(new FileChannel(FILE_LOG));
pFCFileShort->open();
Logger::create("FileLogShort", pFCFileShort, Message::PRIO_DEBUG);
logShort = Logger::has("FileLogShort"); 
 
pFCFile = new FormattingChannel(new PatternFormatter("%Y-%m-%d %H:%M:%S.%c %N[%P]:%s:%q:%t"));
pFCFile->setChannel(new FileChannel(FILE_LOG));
pFCFile->open();
Logger::create("FileLog", pFCFile, Message::PRIO_DEBUG);
log = Logger::has("FileLog");
 
log->information("11111111111"); // эта строка срабатывает
logShort->information("22222222222"); // на этой получаем исключение
Понимаю, что это происходит из-за того, что в момент первого вызова любого логера, он "захватывает" файл, и "держит" до освобождения (конца проги). А в момент когда файл пытается захватить второй логер, ему это не дает сделать первый.
Как тогда можно "настроить" один логер, чтобы с помощью него можно было выводить два вида строк в лог файл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2024, 04:09
Ответы с готовыми решениями:

Сохранение одного и того же файла с разными именами
у меня есть файл gth.jpg мне нужно подгружать список имен из 1.txt допустим там: колобок лисенок мухомор

Как правильно обеспечить два сеанса remoteapp с разными настройками для одного пользователя?
Доброго времени суток. Нужно поднять на одном физическом железе. Windows server 2008R2 - TS + 1c77(файловая) + ворд-эксель. (2008R2...

Обеспечение доступа к хранилищу с разными правами для одного и того же пользователя
Имеется домен на win srv 2012R2, 3 терминальных сервера и брокер, установленный на одном из 3 серверов. Задача: создать подключаемое...

4
Заблокирован
10.10.2024, 10:36
On Windows it is not possible with the current POCO implementation because POCO opens the log file for exclusive write access. So trying to create another POCO logger instance in another process will throw an exception. So it is a POCO limitation in a way.
Как то так...
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
10.10.2024, 11:22  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как то так...
Про запуск двух логеров, для одного файла, я уже понял, что не получится. Я уже размышляю в сторону одного логера, но в котором "на лету", можно сменить форматную строку. Можно, каким-то образом, использовать так эту библиотеку?
0
Заблокирован
10.10.2024, 11:50
Logger::setChannel ?
Никогда с POCO не работал.
И насколько это будет быстро, я хз.

Добавлено через 15 минут
Какая интересная PDF-ка https://pocoproject.org/slides/110-Logging.pdf

Добавлено через 1 минуту
И не одна : https://pocoproject.org/slides/
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
14.10.2024, 20:29  [ТС]
Епрст. Да что-же я делаю не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#define FILE_LOG  "app.log"   
 
#include "Poco/Logger.h"
#include "Poco/PatternFormatter.h"
#include "Poco/FormattingChannel.h"
#include "Poco/FileChannel.h"
#include "Poco/Message.h"
 
using Poco::Logger;
using Poco::PatternFormatter;
using Poco::FormattingChannel;
using Poco::FileChannel;
using Poco::Message;
 
class global_data;
extern global_data *g;
 
class global_data
{
public:
  global_data() :
  // тут список инициализации(в нем нет ничего, что может повлиять на логер)
  {
    pFCFile = new FormattingChannel(new PatternFormatter("%Y-%m-%d %H:%M:%S.%c %N:%s:%q:%t"));
    pFCFile->setChannel(new FileChannel(FILE_LOG));
    pFCFile->open();
    Logger::create("FileLog", pFCFile, Message::PRIO_DEBUG);
    log = Logger::has("FileLog"); 
    pFCFileShort = new FormattingChannel(new PatternFormatter("%t"));
  }
  ~global_data()
  {
    pFCFileShort->close();
    pFCFile->close();
  }
  FormattingChannel* pFCFile;
  FormattingChannel* pFCFileShort;
  Logger* log;
  // тут тоже список переменных, в том числе и тех, которые я инициализирую выше, нет ни одной переменной для логера.
}
 
int main(int argc, char **argv) { 
    g = new global_data();
    g->log->information("####### 1111111 #######");  // Эта строка ВЫВОДИТСЯ в файл
    g->log->setChannel(g->pFCFileShort); // Смена формата
    g->log->information("####### 2222222 #######"); // А эта строка НЕ ВЫВОДИТСЯ в лог-файл ????????????????????????????????????
    g->log->setChannel(g->pFCFile); // Возврат к старому формату
    g->log->information("####### 3333333 #######"); // Эта строка ВЫВОДИТСЯ в файл
    delete g;
}
Ну ладно, может нельзя так "на лету" использовать эту функцию, "setChannel()".
Тогда вроде есть функция
C++
1
g->log->setProperty("channel", /*??? что сюда вписать ????*/)
должно быть вписано какое-то строковое значение для параметра "channel", а как его получить из "pFCFileShort"?
Функция
C++
1
string sVal = pFCFileShort->getProperty("channel");
валится на исключении Poco::PropertyNotSupportedException.
Вобщем какой-то замкнутый круг получается.
Вроде должно быть все просто, но что-то не получается. Да еще на эти параметры для функций из Poco, описания "с гулькин нос".
Может кто уже решал такую задачу, подскажите как сделать?
Не обязательно с помощью моих функций. Я думаю, может еще в решении поможет функция Logger::format() или функции из класса "LoggingConfigurator".
Просто как использовать последние функции, я вообще запутался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2024, 20:29
Помогаю со студенческими работами здесь

Даны два бинарных файла одного и того же типа
Помогите, пожалуйста, написать код на Си с подробными пояснениями. Заранее спасибо! Даны два бинарных файла одного и того же типа....

Как можно сделать наследников с разными типами наследования от одного и того же класса?
Здравствуйте. есть три задания, есть родительский класс с методом toString : в первом - создать класс-наследник используя функциональное...

Из одного файла создать два новых
Написать программу, которая по данному файла с целыми числами формирует два новых. Один из них содержит позиции всех чисел, больших 3,...

Как запустить два экземпляра одного и того же приложения с одной JVM?
Мне интересно как запустить два экземпляра одного и того же приложения с одной виртуальной машины. Когда в NetBeans два раза запускаю...

Параллельный вызов одного и того же метода с разными входными данными
Здравствуйте уважаемые форумчане! Помогите решить такую задачу: есть метод, его необходимо вызвать параллельно из двух других методов, но с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru