根据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
?
答案1
问题似乎来自内置函数echo
(dash
默认sh
情况下在 Ubuntu 中),它处理\
参数的方式似乎与其他实现(以及Bash 中的/bin/echo
内置函数)不同:echo
$ 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
以 root 身份写入文件而不是sudo sh -c
+ shell 重定向使得命令更清晰,因为字符串只被解析一次(作为 的参数printf
)而不是两次(首先作为 的参数sh -c
,然后作为 的参数echo
)。