rsyslog 中的 #012 和 #015 是什么?如何处理?
#012 与 #015 是 rsyslog 日志中的 ASCII 控制字符转义:#012 是换行符 LF、#015 是回车符 CR。Windows 风格 CRLF 日志或消息内换行会以这种形式出现。本文给出规范化处理方法。
#012 = 换行符 LF(\n),#015 = 回车符 CR(\r)——rsyslog 在输出模板里遇到消息中的控制字符时,默认用这种八进制转义形式写出,所以你会在日志文件里看到字面量 #012#015。
为什么会出现
- 日志来自 Windows 系统(行尾 CRLF);
- 应用日志消息里本身含换行(如多行堆栈被打平);
- 网络设备/Syslog 源的换行习惯不同。
处理方法
1. 模板中替换掉(推荐):用 RainerScript 的 replace 属性:
template(name="cleanfmt" type="list") {
property name="msg" format="string" \
position.from="1" position.to="2048"
constant(value="\n")
}
# 或用 RainerScript 表达式处理
set $.clean = replace($msg, "#015#012", " ");
实际更常用的做法是在模板属性上加控制选项,把控制字符转为空格或删除。
2. 全局转义控制:rsyslog 的 $EscapeControlCharactersOnReceive off(或对应 RainerScript 参数 escapeCC="off")让 rsyslog 不再把 CR/LF 转义成 #015/#012——收到的原始字符直接写盘(注意这会真的产生换行,可能把一条日志拆成多行)。
3. 下游处理:转给 Logstash/Fluentd/观测云 DataKit 后,在解析层用替换函数统一清理。
观测云对照
观测云 DataKit 采集日志时按行切分,CR/LF 行尾自动规整;消息内的控制字符可在 Pipeline 中用 replace() 函数统一替换,规则集中管理。
常见问题(FAQ)
Q:#012#015 连着出现是什么? 就是 Windows 的 CRLF 行尾。
Q:关了转义后日志被拆行? 是的,这是双刃剑——消息内含真换行的场景建议保持转义、下游再处理。