Как мне восстановить `/ dev / log` на хосте systemd + rsyslog?

Edit: Этот ответ был подготовлен до того, как вопрос был пересмотрен. Оригинальная форма вопроса включала:

Когда я пытался найти некоторый шаблон с помощью "grep", он выводил только первую строку. Но мне нужно, чтобы она была до конца скобки.

Регулярные выражения не могут считать, но Sed может зацикливать.

Вот фрагмент Sed, который будет переходить от любой строки, содержащей Test_Macro, к строке с соответствующей закрывающей скобкой, даже если есть вложенные скобки:

#n
/Test_Macro/{
  p;
  :rep
  s/([^()]*)//;
  trep
  /^[^(]*$/d;
  h;
  n;
  p;
  x;
  G;
  brep
}

В однострочном виде это выглядит так:

sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}'

Ввод и вывод выглядят так:

$ cat temp 
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
// Some code or text

Test_Macro(asdsadas, "test String1");
// Some code...
$ sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}' temp 
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
Test_Macro(asdsadas, "test String1");
$ 
10
23.09.2017, 22:47
2 ответа

Решение systemctl restart systemd-journald.socket && systemctl restart rsyslog не работало для меня в Ubuntu 16.04.

Вместо этого мне пришлось воссоздать / dev / log как символическую ссылку на / run / systemd / journal / dev-log :

ln -s /run/systemd/journal/dev-log /dev/log
4
27.01.2020, 20:00

Для меня это оказалось проблемой, связанной с тем, как модуль imuxsock, используемый в rsyslog, работал с systemd.

В документации imuxsock рассказывается, как модуль должен работать для systemd. На шаге 1 я заметил проблемы :

.

Step 1: Select name of system socket

  1. If the user has not explicitly chosen to set SysSock.Use="off" then the default listener socket (aka, “system log socket” or simply “system socket”) name is set to /dev/log. Otherwise, if the user has explicitly set SysSock.Use="off", then rsyslog will not listen on /dev/log OR any socket defined by the SysSock.Name parameter and the rest of this section does not apply.

  2. If the user has specified sysSock.Name="/path/to/custom/socket" (and not explicitly set SysSock.Use="off"), then the default listener socket name is overwritten with /path/to/custom/socket.

  3. Otherwise, if rsyslog is running under systemd AND /run/systemd/journal/syslog exists, (AND the user has not explicitly set SysSock.Use="off") then the default listener socket name is overwritten with /run/systemd/journal/syslog.

Система должна была перейти к шагу 3 и изменить путь по умолчанию на «/run/systemd/journal/syslog», но вместо этого он оставался «/var/log». Это означало, что модуль imuxsock пытался (и иногда успешно )создать сокет в /dev/log, где вместо этого должна быть символическая ссылка, созданная журналом systemd -journald -dev -. разъем. В случае, если не удастся создать настоящий сокет, символическая ссылка все равно будет удалена.

Эта документация была результатом этой проблемы , о которой сообщалось на rsyslog github. Если вы хотите пропустить обсуждение и сразу перейти к изменениям, см. PR #1 и PR #2 соответственно.

Мое решение состояло в том, чтобы просто настроить модуль imuxsock для использования пути systemd в моем файле /etc/rsyslog.conf:

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

Это, кажется, решило мою проблему и звучит как хорошее решение, поскольку оно объясняет, почему символическая ссылка может снова исчезнуть после того, как вы создадите ее вручную.

Если вы посмотрите на свою систему, а «/run/systemd/journal/syslog» отсутствует, посмотрите на «syslog.socket», чтобы убедиться, что он запускается успешно, поскольку именно он отвечает за создание сокета.

systemctl status syslog.socket

Возможно, ваша версия rsyslog.service не определяет syslog.service как псевдоним, который необходим, поскольку syslog.socket пытается активировать эту службу. Также возможно, что несколько служб ведения журналов пытаются использовать псевдоним syslog.service, и в этом случае выигрывает последняя включенная служба.

0
27.01.2020, 20:00

Теги

Похожие вопросы