it-roy-ru.com

Регистрация демонов в Linux

Итак, у меня есть демон, работающий в системе Linux, и я хочу иметь отчет о его действиях: журнал. Вопрос в том, каков "лучший" способ сделать это?

Моя первая идея - просто открыть файл и написать в него.

FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s\n", (char*)bar);
/* ...all done, close the file */
fclose(log);

Есть ли что-то не так с регистрацией таким образом? Есть ли лучший способ, например, какой-нибудь фреймворк, встроенный в Linux?

65
codemonkey

В Unix долгое время существовала специальная среда ведения журналов, называемая syslog . Введите свой Shell

man 3 syslog

и вы получите помощь для интерфейса C к нему.

Некоторыепримеры

#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(void) {

 openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
 syslog(LOG_INFO, "A different kind of Hello world ... ");
 closelog();

 return 0;
}
97
Vinko Vrsalovic

Это вероятно будет это были скачки, но да, средство системного журнала, которое существует в большинстве, если не во всех Un * x производных, является предпочтительным способом. Нет ничего плохого в том, чтобы войти в файл, но это оставляет на ваших плечах ряд задач:

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

Системный журнал заботится обо всем этом, и больше, для вас. API похож на клан printf, поэтому у вас не должно возникнуть проблем с адаптацией кода.

23
Richard

Еще одно преимущество syslog в больших (или более защищенных) установках: демон syslog может быть настроен на отправку журналов на другой сервер для записи там вместо (или в дополнение к) локальной файловой системы.

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

11
Dave Sherohman

Я выкладываю много сообщений от daemon в daemon.info и daemon.debug, когда я тестирую модули. Строка в вашем syslog.conf может вставить эти сообщения в любой файл, который вы хотите.

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html объясняет API C лучше, чем справочная страница, imo.

8
phreakre

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

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

Если у него высокоскоростной сжатый двоичный формат журнала, который не тратит время на операции форматирования во время ведения журнала и некоторые инструменты синтаксического анализа и отображения журналов Nice, то это бонус.

Я бы дал ссылку на хороший код для этого, но у меня его нет. Я просто хочу один. :)

2
Zan Lynx

Как указано выше, вы должны посмотреть в системный журнал. Но если вы хотите написать свой собственный код регистрации, я бы посоветовал вам использовать режим "a" (написать приложение) fopen.

Несколько недостатков написания собственного кода регистрации: обработка ротации журналов, блокировка (если у вас несколько потоков), синхронизация (вы хотите дождаться записи журналов на диск?). Одним из недостатков системного журнала является то, что приложение не знает, были ли журналы записаны на диск (они могли быть потеряны).

2
Mathias Brossard

Системный журнал - хороший вариант, но вы можете рассмотреть возможность просмотра log4c. Платформы log4 [что-то] хорошо работают в своих реализациях Java и ​​Perl и позволяют вам - из файла конфигурации - выбирать запись в системный журнал, консоль, плоские файлы или определенные пользователем средства записи журнала. Вы можете определить конкретные контексты журнала для каждого из ваших модулей, и иметь каждый контекстный журнал на различном уровне, как определено вашей конфигурацией. (трассировка, отладка, информация, предупреждение, ошибка, критическое состояние), и пусть ваш демон на лету перечитывает этот файл конфигурации, перехватывая сигнал, позволяя вам манипулировать уровнями журнала на работающем сервере.

2
Jon Topper

В нашей встроенной системе нет системного журнала, поэтому демоны, которые я пишу, выполняют отладку в файл, используя режим открытия "a", аналогичный описанному вами. У меня есть функция, которая открывает файл журнала, выплевывает сообщение, а затем закрывает файл (я делаю это только тогда, когда происходит что-то неожиданное). Однако мне также пришлось написать код для обработки ротации журналов, как упоминали другие комментаторы, который состоит из 'tail -c 65536 logfile> logfiletmp && mv logfiletmp logfile'. Он довольно грубый и, возможно, его следует называть "журналом фронтального усечения", но он не дает нашей маленькой файловой системе RAM заполнить файл журнала.

1
MattSmith

До сих пор никто не упомянул Boost Log Log Library , которая имеет хороший и простой способ перенаправить ваши сообщения журнала в файлы или приемник syslog или даже журнал событий Windows.

1
alexkr

Есть много потенциальных проблем: например, если диск заполнен, вы хотите, чтобы ваш демон вышел из строя? Кроме того, вы будете перезаписывать свой файл каждый раз. Часто кольцевой файл используется для того, чтобы на вашем компьютере было выделено место для файла, но вы можете сохранить достаточно истории, чтобы быть полезной, не занимая слишком много места. Есть инструменты, такие как log4c, которые вы можете помочь вам. Если ваш код c ++, то вы можете рассмотреть log4cxx в проекте Apache (apt-get install liblog4cxx9-dev в ubuntu/debian), но похоже, что вы используете C.

0
David Nehme