LINUX.ORG.RU

Учусь писать в journald

 , ,


2

1

Привет, ЛОР.

Я заинклудил <systemd/sd_journal.h> и попробовал простую запись через sd_journal_print(). В лог попадает, через journalctl отображается (если журнал выводить полностью).

Теперь хочу посмотреть записи только от своей программы. В man journalctl есть пример, в качестве единственного параметра указать, например, /usr/bin/nginx, и journalctl должен показать сообщения от него. Но с моей программой такое не проходит, даже когда я задаю полный путь, он пишет «** No entries **».

Из-за чего такое может быть, и от чего это зависит? Может, это срабатывает только для сообщений, записанных через sd_journal_send()?

(Есть ещё ключ -u, но он для служб, запущенных через systemd, там явно указывается юнит. Может, фокус с путём в качестве единственного параметра работает только для того, что запущено через systemd?)

И второй вопрос. Для sd_journal_send(), как я вижу, требуется MESSAGE_ID. Если моя программа выводит разные сообщения, мне для каждого сообщения надо регистрировать отдельный ID? Или как?

★★★★★

Как помочь с проблемой не знаю, но к размышлению: оно тебе прям точно необходимо, на systemd завязаться? От других демонов логи нормально попадают и в journald в том числе, но не ограничены им, и работают с любым сислогом. Может и тебе лучше просто в stdout, или ещё как, универсально, а не вот это всё?

CrX ★★★★★
()
Ответ на: комментарий от AlexVR

Большое спасибо, -t помог (в мане он есть, но описан немножко устрашающе, я не сразу понял, что SYSLOG_IDENTIFIER и есть имя моего процесса). Записи, сделанные через sd_journal_print(), показывает.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от firkax

Хорошо обернулось. /trollface/

Вот про вяленого я сразу сказал, что будет борода, так и получилось, там я угадал.

wandrien ★★★☆
()
Ответ на: комментарий от seiken

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

Мне бы хотелось, чтобы разработчики любого софта писали в системный лог так, что это работает в любом дистрибутиве с любым инитом, а не только с journald. Даже если у них при использовании journald «всё работает». Без него всё тоже работает, даже проще.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

stdout и stderr - это как раз непереносимый вариант, потому что юниксизм и часть стандартной библиотеки, а её в конкретной реализации сишки может и не быть, потому что не везде есть терминал, даже псевдо.

seiken ★★★★★
()

#include <syslog.h> … } else { if (!validate_and_repair_config()) { syslog(LOG_WARNING, «Не удалось проверить и восстановить конфигурационный файл»); …

anonymous
()
Ответ на: комментарий от seiken

Я не верю в «конкретные реализации сишки», из-за которых в системе нет стандартной библиотеки, но при этом есть journald, извини.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от seiken

У тебя в эмбеддеде journald? :)

Мой поинт был в том, чтобы не завязываться на journald. Писать при этом можно хоть прям в /var/log/servicename/today.log напрямую — решения разные могут быть, я ведь не об этом.

CrX ★★★★★
()
Ответ на: комментарий от seiken

Так я и не говорил, что обязательно. Лишь что даже так и то универсальнее.

CrX ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария