英文:
rsyslog generate uuid as rfc4122
问题
我有以下的 rsyslog 配置和接收到的日志信息。我想为每条日志消息添加一个 UUID。
我目前生成 UUID 如下。然而,该 UUID 没有按照我想要的 rfc4122 格式进行格式化。我是不是做错了什么,还是有更好的方法可以实现这个目标?
当前:F2GCCB4C390142A4B9DBVBD8B9FD0ED2
。我想要的:f2gccb4c-3901-42a4-b9db-vbd8b9fd0ed2
英文:
I've got the following rsyslog conf and the below log message I'm receiving. I would like to add an uuid to each log message.
I'm currently generating a uuid as follows. However, the uuid is not being formatted as rfc4122 which I would like to do. Am I doing something wrong, or could this be achieved in a better way?
Currently: F2GCCB4C390142A4B9DBVBD8B9FD0ED2
. What I would like: f2gccb4c-3901-42a4-b9db-vbd8b9fd0ed2
/path/to/log/file.log
11955 - [Mon Apr 6 20:40:03 2023] [Info ] This message can contain anything [d54d13fa-4657-4891-f99d08674ee]
/etc/rsyslog.d/mylog.conf
template(name="jsonFormat" type="list") {
property(outname="id" name="uuid" format="jsonf")
}
答案1
得分: 1
使用property replacer在模板中将字符串转换为小写的唯一方法。有3种使用方式。可能最易读的方式是使用一些RainerScript首先构建rfc4122 uuid格式的方式:
set $.uuid = substring($uuid, 0, 8) & "-" & substring($uuid, 8, 4);
template(name="myformat" type="list") {
property(name="$.uuid" outname="uuid" caseconversion="lower" format="jsonf")
}
这将变量$.uuid
设置为uuid属性的适当子串(从0索引开始,指定长度)的连接(&
)。我只展示了前两部分,其余部分需要类似处理。然后,模板只是应用小写操作。
另一种方法是在模板中完成所有操作,但这非常冗长:
template(name="myformat" type="list") {
constant(value=" \"uuid\":\"")
property(name="uuid" position.from="1" position.to="8" caseconversion="lower")
constant(value="-")
property(name="uuid" position.from="9" position.to="12" caseconversion="lower")
...
}
请注意,位置从1开始,并且"to"是包含的。
最后,您可以使用更简洁的字符串模板并"执行"它,以将生成的字符串捕获到变量中:
template(name="myuuid" type="string" string="%uuid:1:8:lowercase%-%uuid:9:12:lowercase%")
set $.uuid = exec_template("myuuid");
这里的子串起始和结束都是包含的,从1开始。
英文:
The only way to lowercase a string is within a template using a property
replacer.
There are 3 ways to use this. Probably the most readable is to use some
RainerScript to build up the rfc4122 uuid format first:
set $.uuid = substring($uuid,0,8) & "-" & substring($uuid,8,4);
template(name="myformat" type="list") {
property(name="$.uuid" outname="uuid" caseconversion="lower" format="jsonf")
}
This sets variable $.uuid
to the concatenation (&
) of the appropriate
substrings (index from 0, length) of the uuid property. I have just shown
the first 2 parts; the rest needs to be done similarly.
The template then just applies the lowercasing.
Alternatively, it can all be done in the template, but it is very verbose:
template(name="myformat" type="list") {
constant(value=" \"uuid\":\"")
property(name="uuid" position.from="1" position.to="8" caseconversion="lower")
constant(value="-")
property(name="uuid" position.from="9" position.to="12" caseconversion="lower")
...
}
Note that positions start from 1, and the to
is inclusive.
Finally, you can use a terser string template and "execute" it, to capture
the resulting string in a variable:
template(name="myuuid" type="string" string="%uuid:1:8:lowercase%-%uuid:9:12:lowercase%")
set $.uuid = exec_template("myuuid");
Here the substring is start and end inclusive, starting from 1.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论