сделать файл журнала

22

Есть ли способ сделать файл журнала для обслуживания некоторых данных в / var / log / с помощью некоторой библиотечной функции или системного вызова на языке c в linux. И я также хочу знать стандарты, которым мы должны следовать, чтобы писать и обрабатывать журнал. Благодарность

Сушант Джайн
источник
Пожалуйста, обратите внимание, что вопросы программирования здесь вообще не по теме; вы должны спросить их о переполнении стека . Объяснение API здесь хорошо, но объяснения того, как использовать его на C или другом языке программирования, обычно относятся к переполнению стека.
Жиль "ТАК - перестань быть злым"

Ответы:

31

Стандартный способ входа из программы на Си есть syslog.

Начните с включения заголовочного файла:

#include <syslog.h>

Затем в начале вашей программы вы должны настроить syslog, вызвав openlog:

openlog("programname", 0, LOG_USER);

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

Второй аргумент - это параметры, которые вы хотите использовать, или 0для нормального поведения. Полный список опций находится в man 3 syslog. Один из них может оказаться полезным: LOG_PIDсистемный журнал также записывает идентификатор процесса в сообщении журнала.

Затем каждый раз, когда вы хотите написать сообщение журнала, вы звоните syslog:

syslog(LOG_INFO, "%s", "Message");

Первый аргумент является приоритетом. Первоочередная варьируется от DEBUG( не менее важно) до EMERG(только для чрезвычайных ситуаций) с DEBUG, INFOи ERRбудучи наиболее широко используемым. Смотрите man 3 syslogдля ваших вариантов.

Второй и третий аргументы - это формат и сообщение, как и printf.

В каком файле журнала это появляется, зависит от настроек системного журнала.

С настройкой по умолчанию, это, вероятно, входит в /var/log/messages.


Вы можете настроить собственный файл журнала с помощью одного из средств в диапазоне LOG_LOCAL0до LOG_LOCAL7.

Вы используете их, изменяя:

openlog("programname", 0, LOG_USER);

в

openlog("programname", 0, LOG_LOCAL0);

или

openlog("programname", 0, LOG_LOCAL1);

и т.п.

и добавление соответствующей записи /etc/syslog.conf, например, в

local1.info /var/log/programname.log

и перезапуск сервера системного журнала, например

pkill -HUP syslogd

.infoЧасть local1.infoвыше означает , что все сообщения, которые INFOили более важными будут записываться, в том числе INFO, NOTICE, ERR(ошибка), CRIT(критическая) и т.д., но не DEBUG.


Или, если у вас есть rsyslog, вы можете попробовать фильтр на основе свойств , например,

:syslogtag, isequal, "programname:"    /var/log/programname.log

Системный журнал должен содержать «:».

Или, если вы планируете распространять свое программное обеспечение среди других людей, вероятно, не стоит полагаться на использование LOG_LOCALили rsyslogфильтр.

В этом случае вы должны использовать LOG_USER(если это обычная программа) или LOG_DAEMON(если это сервер), писать свои сообщения запуска и сообщения об ошибках, используя syslog, но записывать все свои сообщения журнала в файл за пределами syslog. Например, Apache HTTPd регистрирует /var/log/apache2/*или /var/log/httpd/*, я предполагаю, используя регулярные вызовы open/ fopenи write/ printf.

Mikel
источник
Спасибо. Это довольно полезная информация. Но не могли бы вы объяснить подробнее о параметре log_local0-7. Например, Я хочу записать свои данные (которые содержат слово <self> в строке журнала) в файле self.log. и некоторые журналы в других файлах.
Sushant Jain
@Sushant Jain: На какой дистрибутив и версию Linux вы ориентируетесь? У вас есть старый системный журнал (ksyslogd) или rsyslog? rpm -qa | grep syslogили dpkg -l '*syslog*', вероятно, скажет вам, что.
Микель
log_local * - это, откровенно говоря, реликвии со sysklogdвремен, когда это была единственная игра в городе для программного обеспечения системного журнала. В настоящее время программное обеспечение , как syslog-ng, rsyslogи dsyslogсуществуют и гораздо более сложные возможности фильтрации , чем просто сервис / уровень.
Шадур
Большое спасибо. Моя проблема была решена. У меня есть еще один запрос о разборе данных, хранящихся в файле журнала. Есть ли хороший способ сделать это. На самом деле я пытаюсь сделать инструмент системной статистики. Так что мне это нужно.
Sushant Jain
@ Сушант Джайн. Рад помочь. Пожалуйста, опубликуйте свой вопрос анализа журнала как отдельный вопрос, чтобы люди могли его увидеть и дать правильные ответы.
Микель
2

Вы захотите #include <syslog.h>, а затем используйте syslog()функции для отправки данных в любую активную программу регистрации системы.

Смотрите страницу руководства здесь .

Калеб
источник
Функция syslog () записывает данные в / var / log / syslog. в то время как я хочу писать логи в своем собственном файле.
Sushant Jain
Как объясняет Микел ниже, вы можете пометить свои сообщения журнала таким образом, чтобы системный журнал понимал, что вы из себя представляете, а затем настроить системный журнал для записи сообщений журнала ваших программ в другой файл.
Калеб
1

Есть много возможностей, каков твой план? Вам просто нужна опция для входа в систему из командной строки? Взгляните на logger(включен в bsdutils ). Просто введите:

usr@srv % logger test

и он будет записывать что-то вроде этого на ваш /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

Смотрите также man logger. В зависимости от вашего демона регистрации вы можете сортировать эти сообщения по определенным файлам или фильтровать их по приоритету.

Есть также несколько решений для разных языков программирования, поэтому, пожалуйста, скажите мне, что вы хотите сделать ;-)

binfalse
источник
На самом деле я хочу сделать это с использованием языка C. и у меня есть информация в посте Микеля.
Sushant Jain
1

Фильтрация по имени программы написана не так, как указано выше, для последних версий rsyslog(версия на моем компьютере 5.8.6), как показано ниже:

if $programname == 'popa3d' then /var/log/popa3d.log

Для получения дополнительной информации, смотрите здесь

Суреш
источник