Согласно graylog2 документам, я должен добавить эту строку к своему rsyslog.conf:
$template GRAYLOGRFC5424,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msg% \n"
Я делаю его программно, когда я вращаю сервер, таким образом, команда, я начинал в настоящее время:
sudo sh -c 'echo "\$template GRAYLOGRFC5424,\"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msg% \\\n\"" >> rsyslog.conf'
Я выхожу из знака доллара, обеих двойных кавычек и обратной косой черты перед n. Однако \n
и \\n
оба пишут фактическую новую строку в файл, но \\\n
записи \n
правильно. Почему не делает \\n
работа?
Проблема, кажется, возникает из встроенного echo
в dash
(который является sh
в Ubuntu по умолчанию), который, кажется, обрабатывает \
аргументы по-другому по сравнению с другими реализациями (/bin/echo
и встроенное echo
в Bash):
$ sh -c "echo '\\n'"
$ sh -c "/bin/echo '\\n'"
\n
$ bash -c "echo '\\n'"
\n
Это не удивительно как использование \
аргументы в echo
нестандартно:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html
Если первый операнд является-n, или если какой-либо из операндов содержит обратную косую черту ('\') символ, результаты определяются реализацией.
Необходимо использовать printf
вместо echo
, как это:
printf '$template GRAYLOGRFC5424,"<%%pri%%>%%protocol-version%% %%timestamp:::date-rfc3339%% %%HOSTNAME%% %%app-name%% %%procid%% %%msg%% \\n"\n' | sudo tee -a rsyslog.conf
Как добавленная премия, с помощью sudo tee
записать в файлы как корень вместо sudo sh -c
+ перенаправления оболочки делают инструмент для очистки команды, так как строка анализируется только однажды (как аргумент printf
) вместо дважды (сначала как аргумент sh -c
и затем как аргумент echo
).