LINUX.ORG.RU

как правильно вести логи в С++?


0

0

Есть С++ проект с несколькими классами (многопоточный демон).

Как красиво и аккуратно каждый класс научить вести логи ф файл?

Есть ли у кого полезные ссылки?

Текущее состояние - глобальный объект Logger. Из-за того, что есть возможность его переконфигурировать он не адекватно себя ведет. Как это всё архитектурно переделать ?

★★★

всмысле переконфигурировать?

пример логгера из Александреску не покатит? (шаблон проектирования Singleton)

Reset ★★★★★
()
Ответ на: комментарий от Onanim

без примеров - тяжело. с виду очень навороченный. у меня проек не очень большой - но уже запутанный

sf ★★★
() автор топика
Ответ на: комментарий от Reset

Еще не читал но чувствую что это ближе лежит к глобальным переменным чем к стандартным системам логгинга. Но заинтересовало. Спасибо

sf ★★★
() автор топика
Ответ на: комментарий от Reset

Вообще все проблемы с переконфигурацией из-за того что этот логгер еще и таймер (при помещении запили в лог проверяется не сменился ли день - и производит реконфигурацию всей системы, процесс которой пишется в лог - в некоторых местах бесконечная рекурсия - нервируют такие грабли), ясно, что это нужно вырезать из логгера, но не знаю во что подгледеть, чтобы сделать просто и "как у всех".

sf ★★★
() автор топика

printf(""); -> печатает в 'stdout'.
Преопределяете:'stderr' и 'stdout' в file_name.log и 
Ваша программа всю информацию выводит в файл: file_name.log

anonymous
()

у меня так:

enum log_message_type{
Err_Message = 0x01,
Warn_Message= 0x02,
Inf_Message = 0x04
};

class GLoger {

public:
GLoger();
~GLoger();
void addMessage(log_message_type type,std::string message);
}

protected:
std::ofstream Err_Stream;
std::ofstream Warn_Stream;
std::ofstream Inf_Stream;
};

в функции addMessage взависимости от type формируется окончательный вид сообщения помещаемого в соответствующий std::ofstream. Все std::ofstream открываются в конструкторе.

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

а это-то в логере зачем? особенно бесконечная рекурсия?

ale ★★
()
Ответ на: комментарий от anonymous

Этого не достаточно. имя файла постоянно меняется. прблема в том, что имя файла меняется - то есть там уже полунаписанный logrotate, да и логгер швыряет мессаги не только в файл(но это не страшно - там гадостей нету). да и всё равно для приличной работы придётся сделать wrap этой фигни в многопоточный класс. а то при закрытии файла нехорошести будут. я уже подумываю выкинуть всю эту функциональность и рубить файлики каким нибудь logrotate :]

sf ★★★
() автор топика
Ответ на: комментарий от ale

Сейчас у меня практически такая же шляпа.

>а это-то в логере зачем? особенно бесконечная рекурсия?

наследие :].Собираюсь выкосить.

sf ★★★
() автор топика

Таймер - в отдельный класс по любому.
С остальным не совсем понятно в чём проблема.
В каждый класс-овнер потока добавить мембер - идентификатор лога (сгодится имя файла-лога/префикс имени).
В метод логгера "ВывестиВЛог" добавить параметр "идентификатор_лога"

gpg
()
Ответ на: комментарий от gpg

Спасибо - как и сделаю :]

sf ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.