Стандартный способ входа из программы на Си есть 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
.