eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2020-07-03 10:12 am
Entry tags:

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

Задал вопрос на SO.
С логами я уже давно вожусь: много демонов требуют ведения журналов, но все у меня сделано, как обычно, через одно место! В моей сниппетобиблиотеке ведется учет времени с момента создания лога, и если файл старше суток, он автоматически ротируется. Но это: а) лишает возможности работы, если сначала открыл лог, а потом сделал fork() (один из процессов продолжит писать после ротации логов в старый лог), б) не очень-то это атомарно (хотя пока что прецедентов, когда логи портятся из-за одновременной записи в нескольких потоков не было; но это, скорей всего, из-за того, что логи пишутся редко).
Другой вариант продемонстрирован в коде на SO. И здесь тоже полная фигня с fork() и атомарностью.

Как вариант — вообще убрать openlog, а в putlog сразу делать все: открывать файл в режиме добавления данных, писать туда, закрывать файл. Для надежности можно добавить мьютекс. Но это чревато раздуванием аргументов putlog'а (либо структуру придется передавать): помимо уровня сообщения и собственно самого сообщения, надо будет каждый раз передавать уровень лог-файла и его имя, если захотеть иметь возможность одновременного ведения нескольких журналов.

Использовать жирные библиотеки вроде log4c не хочу.

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