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
()
Ответ на: комментарий от pfg

Ну да...перенаправить...из пустого в порожнее

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

Ну, большая часть сервисов все же умеет нормально в syslog.

А для самописных костылей на bash тоже пара строк добавить тэги с уровнем.

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

Поэтому если приложение само не озаботилось нормальным логгированием

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

gobot ★★★★
() автор топика

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

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

goingUp ★★★★★
()

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

eternal_sorrow ★★★★★
()
Ответ на: комментарий от 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

настрой syslog как надо. обычно настроены еще фильтры для kernel.log и daemons.log, можешь и свой запилить.

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

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

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

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

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

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

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

gobot ★★★★
() автор топика
Ответ на: комментарий от 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

Ну как это не нужно? Простой пример console.log() console.error()

Надо тупо ошибки посмотреть в логе

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

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

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

Блин. В PR из сообщений выше даже есть решение без костылей.

Есть systemd-cat.

В юните можно просто обернуть команду.

ExecStart=systemd-cat --priority info --stderr-priority err /usr/bin/test.sh
Belkrr
()
Ответ на: комментарий от ALiEN175

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

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

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

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

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

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

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

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

Тему читай лучше, там всё указано про раньше.

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

Фичреквест на то что тебе нужно открыт

Афигеть, уже 8 лет как.

anc ★★★★★
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от Belkrr

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

Простите. Не так понял. Каюсь.

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

Все ок) Немного токсичности в ответе было исключительно ради поддержания традиций форума. Нельзя дать ЛОРу загнить)

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

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

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

Да, не создается, проверил. И раскраска есть и фильтр. Но все равно позорно и весь фасад портит этот костылек

gobot ★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.