Unix имел долгое время специальную платформу журналирования, названную системный журнал . Введите в своей оболочке
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;
}
Этот <забастовка>, вероятно, будет , забастовка> была гонками, но да средство системного журнала, которое существует в большинстве, если не все производные Un*x предпочтительный способ пойти. Нет ничего неправильно с входом в файл, но он действительно оставляет на Ваших плечах количество задач:
Системный журнал заботится обо всем этом, и больше, для Вас. API подобен printf клан, таким образом, у Вас не должно быть проблем при адаптации кода.
Еще одно преимущество системного журнала в большем (или более сознательный безопасность) установки: демон системного журнала может быть настроен для отправки журналов в другой сервер для записи туда вместо (или в дополнение к) локальная файловая система.
намного более удобно иметь все журналы для Вашей фермы сервера в одном месте вместо того, чтобы иметь необходимость считать их отдельно на каждой машине, особенно когда Вы пытаетесь коррелировать события на одном сервере с теми на другом. И когда каждый взламывается, Вы не можете доверять его журналам больше..., но если лог-сервер остался безопасным, Вы знаете, что ничто не будет удалено из ее журналов, таким образом, любая запись проникновения будет неповреждена.
Я выложил много сообщений демона к daemon.info и daemon.debug, когда я - поблочное тестирование. Строка в Вашем syslog.conf может прикрепить те сообщения в любой файл, который Вы хотите.
http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html имеет лучшее объяснение API C, чем страница справочника, imo.
Системный журнал является хорошим вариантом, но можно хотеть рассмотреть рассмотрение log4c. log4 [что-то] платформы работают хорошо в их Java и реализациях Perl, и позволяют, Вы к - от конфигурационного файла - принимаете решение зарегистрироваться или к системному журналу, консоли, плоским файлам или к пользовательским писателям журнала. Можно определить определенные контексты журнала для каждого из модулей и иметь каждый журнал контекста на другом уровне, как определено конфигурацией. (трассировка, отладка, информация, предупреждает, ошибка, очень важная), и перечитайте Вашего демона что конфигурационный файл на лету, захватив сигнал, позволив Вам управлять уровнями журнала на рабочем сервере.
Как указано выше необходимо изучить системный журнал. Но если бы Вы хотите записать свой собственный код входа, я советовал бы Вам использовать "a" (запись добавляют), режим fopen.
Несколько недостатков записи Вашего собственного кода входа: обработка вращения Журнала, Блокируя (если у Вас есть несколько потоков), Синхронизация (Вы хотите ожидать журналов, записанных в диск?). Один из недостатков системного журнала - то, что приложение не знает, были ли журналы записаны в диск (они, возможно, были потеряны).
Если Вы будете использовать поточную обработку, и Вы используете вход в качестве средства отладки, Вы захотите искать регистрирующуюся библиотеку, которая использует своего рода ориентированное на многопотоковое исполнение, но разблокировала кольцевые буферы. Один буфер на поток, с глобальной блокировкой только, когда строго необходимый.
Это старается не регистрировать порождение серьезного замедления в Вашем программном обеспечении, и это старается не создавать heisenbugs, которые изменяются, когда Вы добавляете вход отладки.
, Если это имеет высокую скорость, сжал двоичный формат журнала, который не напрасно тратит время с операциями форматирования во время входа и некоторого хорошего парсинга журнала и отображает инструменты, который является премией.
я обеспечил бы ссылку на некоторый хороший код для этого, но у меня нет того самого. Я просто хочу тот.:)
Наша встроенная система не имеет системного журнала так демоны, которых я пишу, делают отладку в файл с помощью "a" открытый режим, подобный тому, как Вы описали его. У меня есть функция, которая открывает файл журнала, выкладывает сообщение и затем закрывает файл (я только делаю это, когда что-то неожиданное происходит). Однако я также должен был записать код для обработки вращения журнала, как другие комментаторы упомянули, который состоит из 'файла журнала-c 65536 хвоста> logfiletmp & & mv logfiletmp файл журнала'. Это довольно грубо и возможно должно быть названо "журналом лобовыми усечениями", но это мешает нашей маленькой основанной на псевдодиске файловой системе заполниться файлом журнала.
Существует много потенциальных проблем: например, если диск полон, Вы хотите, чтобы Ваш демон перестал работать? Кроме того, Вы будете перезаписывать свой файл каждый раз. Часто корзина для бумаг используется так, чтобы у Вас было место, выделенное на машине для Вашего файла, но можно сохранить достаточно истории, чтобы быть полезными, не занимая слишком много места. Существуют инструменты как log4c, что можно помочь Вам. Если Ваш код является C++, то Вы могли бы рассмотреть log4cxx в проекте Apache (склонный - получают установку liblog4cxx9-dev на ubuntu/debian), но похоже на использование C.