LINUX.ORG.RU
ФорумAdmin

journalctl не умеет фильтровать ошибки?

 ,


0

3

Решил тут перейти с supervisord на systemd unit... И...решил посмотреть логи ошибок

Судя по
https://github.com/systemd/systemd/pull/6599

Если так, то я в шоке. Как такое может быть?? Как я могу ошибки смотреть? По сути это самое насущное что требуется в основном... Грепать? Заводить для каждой блохи свои логи?

★★★★

Не совсем так.

Есть у journalctl параметр -p --priority.

Проблема в том, что нет возможности назначить для stdout и stderr разные дефолтные priority level. Поэтому если приложение само не озаботилось нормальным логгированием, то сконфигурировать юнит для него не получится.

Есть, конечно костыли вроде прописывания уровня через sed:

service 2| sed 's/^/<3>/g'

<3> - это error

Belkrr ★★
()

Как я могу ошибки смотреть?

Если нужны только ошибки, а stdout писать не нужно, перенаправь его в /dev/null. Баг о том, что systemd сохраняет и то и то вместе как текст.

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

А что это значит, «нормальным»? Это что нужно сделать?

Что-нибудь вроде этого ?

#include <stdio.h>
#include <syslog.h>

int main() {
    // Open a syslog connection
    openlog("MyProgram", LOG_PID, LOG_USER);

    // Log messages at different levels
    syslog(LOG_EMERG, "System crash!");
    syslog(LOG_ALERT, "Critical error detected.");
    syslog(LOG_CRIT, "Firewall dropping traffic.");
    syslog(LOG_ERR, "Authentication failed.");
    syslog(LOG_WARNING, "Low disk space.");
    syslog(LOG_NOTICE, "System reboot complete.");
    syslog(LOG_INFO, "User logged in.");
    syslog(LOG_DEBUG, "Debugging information.");

    // Close the syslog connection
    closelog();

    return 0;
}
alx777 ★★★
()
Ответ на: комментарий от gobot

И что это будет писать в /var/log/syslog? Все в кучу?

Что оно будет писать в /var/log/syslog не так важно, но в нормальной системе можно будет сделать, например

journalctl --unit=your-systemd-unit --priority=err

чтобы получить ошибки сервиса your-systemd-unit

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

А разве существует способ свести stdout/stderr к emerg/alert/crit/err/warning/notice/info/debug?

В крайнем случае можно тупо заюзать logger:

(echo INFO; echo WARN >&2)  > >(logger -p info) 2> >(logger -p warn)
alx777 ★★★
()
Ответ на: комментарий от kaldeon

В юните systemd можно указать

SyslogLevel=error

И тогда сообщения без тэга syslog получат этот уровень.

Еслы бы отдельно еще был StdErrSyslogLevel, то для простых скриптов ушла бы часть гемороя.

А пока можно быквально добавлять <3> в начале сообщения для того, чтоб оно определялось как error.

Или использовать готовые библиотеки для syslog

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

Ну понятно, я конечно не спец, далеко от этой темы, но первый раз думаю сделаю «как надо», типа есть фича в системе стандартная, зачем мне нужон этот supervisord и тут на те такой жирный костыль вылез. Мне казалось очевидно, что если в stderr пишешь то это потом как то отфильтровать можно будет.

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

Авторы (автор) системг вообще не особо что-то предусматривали. Там куда ни глянь везде всё кривое.

Ну, скажем так, стандартные конфигурации они все-таки до минимально юзабельного состояния допинали

Но вот если понадобится что-то минимально отклоняющееся от линии партии - как в этом случае - но начинаются удивительнейшие приключения

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

Ну, на безрыбье, как говориться и рак рыба, попробую, спасибо брат. Без костылей в мире linux никуда с этим надо смириться ))

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

Нет этого недостатка - редиректится вывод и заменяется процесс execvp.

Недостаток выше по цепочке https://www.linux.org.ru/forum/admin/17972825?cid=17973044 (комментарий) описал gobot

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

То, что exec* замещает один процесс другим.

systemd-cat настраивает файловые дескрипторы, после чего замещает себя на другой процесс, который эти дескрипторы унаследует.

Поэтому он не становится родительским процессом.

Дерево процессов для юнита с systemd-cat и без него одинаковые.

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

systemd-cat настраивает файловые дескрипторы, после чего замещает себя на другой процесс, который эти дескрипторы унаследует.

Какая разница как называется то, что будет висеть?

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

Ок, если вы не смогли понять что написано в 4 строчках моего сообщения, то понятно почему man страница execvp не сняла вопрос.

Ответ одной строкой:

Дерево процессов для юнита с systemd-cat и без него одинаковые.

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

Щито?
По-твоему не пишет что ли? Да это и неважно, пишет или нет (пишет, в реп загляни), толку никакого, он ничего до конца доделать не может. Шипящий пшпшаудио наконец-то отовсюду выпиливают в пользу трубопровода, авахи никогда нормально не работал, в сюстемд элементарных вещей, например как ТС описал, до сих пор нет, а 15 лет уж прошло.

anon8
()