Какие есть удобные инструменты для логирования? для С

yolki

Есть проект, хочется прикрутить логи много где. В версии пре-альфа там самописный велосипед.
Хочется
- очень желательно чистый С
- настройка по крайней мере на 4 уровня (DEBUG, INFO, WARNING, ERROR)
- возможность настроить куда писать лог - в файл и/или в журнал (EventLog в винде, сислог в линуксах)

bleyman

Вместо очевидного "ну нагугли же" вставлю неочевидный кусок практического знания:
Loglevel creep is a real problem. Как только клиенты осознают, что они могут избавиться от "поставьте логлевел 6, попробуйте ещё раз и пошлите нам логи" через установку логлевела в 6 сразу, они это делают. Поэтому появляются логлевелы 7-9, но точно так же клиенты у которых что-то не работает постоянно тупо ставят логлевел 9, чтобы быстрее фиксенье багов происходило. И так далее.
Мне кажется что правильным подходом должно быть условное логгирование, с использованием C++ RAII. Типа, ты пишешь "LOG_CONTEXT(some_input_value);", и оно попадает в лог только если дальше случился эксепшен, пока то место где ты это сделал живо в смысле лайфтайма локальной переменной.
Мы это ещё не сделали хотя дичайше думаем, так что может там есть неожиданные проблемы.

PITACHOK

оно попадает в лог только если дальше случился эксепшен, пока то место где ты это сделал живо в смысле лайфтайма локальной переменной
а не проще ли в таком случае сбрасывать кору и просить клиентов прислать ее?

Dimon89

а не проще ли в таком случае сбрасывать кору и просить клиентов прислать ее?
Проще. Мы так и делаем. Логи, зачастую, нужны в тех случаях, когда эксепшена не было, а что-то все равно пошло не так.

yolki

ну я нагуглил - log4c и pantheios кажутся наиболее подходящими.
log4c слегка отпугивает LGPL, pantheios слегка монструозен и С++.
Лады, напишу свой велосипед.

tokuchu

А syslog (3) чем не устраивает? Хочется не только в сислог уметь?

yolki

ну на винде им проблематично пользоваться. хочется и на винду тоже

tokuchu

А это не часть POSIX, случайно? В венде оно точно не работает? А то вдруг в системный журнал всё же пишет.

Werdna

Есть проект, хочется прикрутить логи много где.
http://github.com/bachan/coda
Используй logger.h:
1. Чистый Си
2. Из коробки сразу работает в stderr, сразу log_info log_notice и прочие log_XXX удобный printf-like формат
3. логи красивые ДАТА ВРЕМЯ ТРЕД СООБЩНИЕ
4. простые функции управления, чтобы инициализироваться и настроиться в файл писать
Из бонусов фич. Если настроил логгер в файл, то стандартный fprintf(stderr, ...) будет писать в этот же файл.
Рекомендуется каждый тред при запуске чтобы задавал своё имя через log_thread_name_set например, так:
 
log_thread_name_set("TH_BACKGROUND_TASK_XXX");

Тогда лог можно грепать по строке и фильтровать только сообщения одного треда.
Если есть вопросы ещё — пиши!

Werdna

Лады, напишу свой велосипед.
Если надумаешь писать таки, то посмотри код моего логгера.
Там всё сделано максимально гибко, буквально каждая мелочь важна для удобства, т.е. там опыт 3-4 лет минимум.

zya369

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

bleyman

а не проще ли в таком случае сбрасывать кору и просить клиентов прислать ее?

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