日志编码器¶
uWSGI 1.9.16开始就有了“日志编码”功能。
一个编码器接收一个日志行,然后返回它的一个“转换”。
可以通过插件添加编码器,并可以链式(一个编码器的输出将是随后的编码器的输入,依次递推)启动编码器。
[uwsgi]
; send logs to udp address 192.168.173.13:1717
logger = socket:192.168.173.13:1717
; before sending a logline to the logger encode it in gzip
log-encoder = gzip
; after gzip add a 'clear' prefix to easy decode
log-encoder = prefix i am gzip encoded
...
使用这个配置,日志服务器将会接收 “i am gzip encoded”字符串,后面跟着以gzip编码的真正的日志消息
日志编码器的语法如下:
log-encoder = <encoder>[ args]
而args (如果有的话)由单个空格分隔
请求日志 VS 标准输出/标准错误¶
–log-encoder选项只编码标准输出/标准错误日志。
如果你想要编码请求日志,则使用–log-req-encoder:
[uwsgi]
; send request logs to udp address 192.168.173.13:1717
req-logger = socket:192.168.173.13:1717
; before sending a logline to the logger encode it in gzip
log-req-encoder = gzip
; after gzip add a 'clear' prefix to easy decode
log-req-encoder = prefix i am gzip encoded
...
路由编码器¶
日志路由允许基于正则表达式发送每个日志行到不同的日志引擎。你也可以带编码器使用相同的系统:
[uwsgi]
; by default send logs to udp address 192.168.173.13:1717
logger = socket:192.168.173.13:1717
; an alternative logger using the same address
logger = secondlogger socket:192.168.173.13:1717
; use 'secondlogger' for the logline containing 'uWSGI'
log-route = secondlogger uWSGI
; before sending a logline to the 'secondlogger' logger encode it in gzip
log-encoder = gzip:secondlogger
...
Core
编码器¶
在uwsgi的’core’中,由以下可用的编码器:
prefix
添加一个原始前缀到每个日志消息
suffix
添加一个原始后缀到每个日志消息
nl
添加一个换行符字符到每个日志消息
gzip
用gzip压缩每个消息 (需要zlib)
compress
用zlib压缩每个消息 (需要zlib)
format
应用指定的格式到每个日志消息:
[uwsgi]
...
log-encoder = format [FOO ${msg} BAR]
...
json
像 format
,但是每个变量都是json转义的
[uwsgi]
...
log-encoder = json {"unix":${unix}, "msg":"${msg}"}
...
可用以下变量 (用于format和json):
${msg}
原始日志消息 (移除换行符)
${msgnl}
原始日志消息 (带换行符)
${unix}
当前unix时间
${micros}
当前unix时间,以微秒为单位
${strftime:xxx}
strftime,使用xxx格式:
[uwsgi]
...
; we need to escape % to avoid magic vars nameclash
log-encoder = json {"unix":${unix}, "msg":"${msg}", "date":"${strftime:%%d/%%m/%%Y %%H:%%M:%%S}"}
...
``msgpack`` 编码器
这是官方添加到uWSGI源的第一个日志编码器插件。它允许以msgpack格式来编码日志行 (http://msgpack.org/)。
其语法是相当多变的,因为它被开发来添加任何信息到单一的包中
log-encoder = msgpack <format>
格式相当复杂,因为它是整个包中的单个项列表。
例如,如果你想要编码 {‘foo’:’bar’, ‘test’:17} 字典,那么需要这样读取它:
a map of 2 items | the string foo | the string bar | the string test | the integer 17
总共5项。
一个更复杂的结构 {‘boo’:30, ‘foo’:’bar’, ‘test’: [1,3,3,17.30,nil,true,false]}
将是
a map of 3 items | the string boo | the number 30| the string foo| the string bar | the string test | an array of 7 items | the integer 1 | the integer 3 | the integer 3 | the float 17.30 | a nil | a true | a false
<format>字符串是这种方式的一种表示:
map:2|str:foo|str:bar|str:test|int:17
|是每个项的分隔符。冒号前的字符串是项类型,后面跟着可选的参数
支持以下项类型:
map
一个字典,参数是项个数
array
一个数组,参数是项个数
str
一个字符串,参数是字符串本身
bin
一个字节数组,参数是二进制流本身
int
一个整型,参数是数字
float
一个浮点数,参数是数字
nil
undefined/NULL
true
布尔类型 TRUE
false
布尔类型 FALSE
除了msgpack类型之外,可以用一系列的动态类型:
msg
将日志行转换成移除换行符的msgpack字符串
msgbin
将日志行转换成移除换行符的msgpack字节数组
msgnl
将日志行转换成msgpack字符串 (包含换行符)
msgbin
将日志行转换成msgpack字节数组 (包含换行符)
unix
转换成unix时间的整数格式
micros
转换成unix时间的整数格式,以微秒为单位
strftime
使用strftime语法转换成一个字符串。strftime格式就是参数
下面是一个通过udp发送日志行到logstash服务器的例子:
(logstash调试配置):
input {
udp {
codec => msgpack {}
port => 1717
}
}
output {
stdout { debug => true }
elasticsearch { embedded => true }
}
[uwsgi]
logger = socket:192.168.173.13:1717
log-encoder = msgpack map:4|str:message|msg|str:hostname|str:%h|str:version|str:%V|str:appname|str:myapp
...
这将生成以下结构:
{
"message": "*** Starting uWSGI 1.9.16-dev-29d80ce (64bit) on [Sat Sep 7 15:04:32 2013] ***",
"hostname": "unbit.it",
"version": "1.9.16-dev",
"appname": "myapp"
}
它将被存储到elasticsearch