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 не хочу.

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

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org