зробити файл журналу


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:

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

і перезапуск сервера syslog, наприклад

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дзвінки.


Дякую.Це досить корисна інформація. Але будь ласка, поясніть більше про варіант log_local0-7. Наприклад, наприклад. Я хочу записати свої дані (які містять <self> слово в рядку журналу) у файл self.log. і деякі журнали в інших файлах.
Sushant Jain

@Sushant Jain: На який дистрибутив та версію Linux ви орієнтуєтесь? У вас є старий syslog (ksyslogd) чи rsyslog? rpm -qa | grep syslogабо dpkg -l '*syslog*', мабуть, скаже вам, який.
Мікель

log_local *, чесно кажучи, є реліквіями з тих часів, коли це sysklogdбула єдина гра в місті для програмного забезпечення syslog. В даний час програмне забезпечення, як syslog-ng, rsyslogі dsyslogіснує, і має набагато більш складні можливості фільтрації, ніж просто сервіс / рівень.
Шадур

Дуже дякую. Моя проблема вирішена. У мене є ще один запит щодо розбору даних, що зберігаються у файлі журналу. Чи є хороший спосіб це зробити. Насправді я намагаюся зробити інструмент системної статистики. Так мені це потрібно.
Sushant Jain

@Sushant Jain. Радий допомогти. Будь ласка, опублікуйте своє питання аналізу синтаксису як окреме запитання, щоб люди могли його бачити та надавати належні відповіді.
Мікель

2

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

Дивіться сторінку людини тут .


Функція syslog () записує дані в / var / log / syslog. тоді як я хочу писати журнали у свій власний файл.
Sushant Jain

Як Мікель пояснює нижче, ви можете позначати теги повідомленнями таким чином, щоб syslog розумів, яка програма ви є, а потім налаштувати syslog, щоб записувати повідомлення журналу ваших програм у інший файл.
Калеб

1

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

usr@srv % logger test

і він запише щось подібне до вашого /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

Дивіться також man logger. Залежно від демона реєстрації ви можете сортувати ці повідомлення за певними файлами або фільтрувати їх за пріоритетом.

Також є кілька рішень для різних мов програмування, тому, будь ласка, скажіть мені, що ви хочете зробити ;-)


Насправді я хочу це зробити за допомогою мови c. і я отримав інформацію в посаді mikel.
Sushant Jain

1

Фільтрування за назвою програми записується інакше, ніж зазначено вище, для останніх версій rsyslog(версія на моїй машині - 5.8.6), як показано нижче:

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

Для отримання додаткової інформації дивіться тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.