HTTP日志
HTTP日志分为2大块:
- 当次HTTP请求的 Request/Response 日志
- 当次HTTP请求执行过程中,由 HttpClient 发起的HTTP请求及响应的日志
注意:记录日志都是需要耗费性能以及增加内存占用的,
所以 ClownFish 设计了8个参数来控制日志记录哪些内容
参数名 | 默认值 | 参数含意 |
---|---|---|
ClownFish_Log_Http_LogRequest | 0 | 是否必须记录 Request 到日志中 |
ClownFish_Log_Http_LogRequestBody | 1 | 是否必须记录 Request-Body 到日志中 |
ClownFish_Log_Http_LogResponse | 0 | 是否必须记录 Response 到日志中 |
ClownFish_Log_Http_LogResponseBody | 1 | 是否必须记录 Response-Body 到日志中 |
ClownFish_Log_HttpClient_LogRequest | 1 | 是否必须记录 HttpClient-HttpRequestMessage 到日志中 |
ClownFish_Log_HttpClient_LogRequestBody | 0 | 是否必须记录 HttpClient-HttpRequestMessage-Body 到日志中 |
ClownFish_Log_HttpClient_LogResponse | 1 | 是否必须记录 HttpClient-HttpResponseMessage 到日志中 |
ClownFish_Log_HttpClient_LogResponseBody | 0 | 是否必须记录 HttpClient-HttpResponseMessage-Body 到日志中 |
重要说明:
- 以上8个参数,可分为4组
- LogXxx: 是否记录 Request 或者 Request 的 “开始行”和“请求头/响应头”
- LogXxxBody: 是否记录 请求体 或者 响应体
- 当 LogXxx = 0 时,会忽略 LogXxxBody 的设置。
- 如果当前HTTP请求执行时间超出性能阀值,则 强制记录请求,
- 可认为此时(当前请求) ClownFish_Log_Http_LogRequest=1
- HttpClient相关日志仅在 当前HTTP请求执行时间超出性能阀值时有效
- 此处没有参数可控制,因为没有性能问题的执行过程是不记录性能日志的
- 如果确实需要记录执行过程,可修改 性能阀值
- 记录 “请求体或者响应体” 有许多限制,例如:
- 必须有 Body
- Content-Type 必须为常见的文本类型
- Body 不能过大,必须小于 RequestBodyBufferSize 的设置
- Body stream 可重复读取
Body stream 可重复读取
.NET 出于性能以及内存占用的原因,默认的行为是不允许 多次 读取 Request.Body
请求体的第一次读取通常发生在Action方法的参数赋值的时候,
请求执行过程中,就不能再次读取了,因此无法在日志中记录请求体内容,
如果需要让ClownFish在日志中记录请求体内容,则需要按以下步骤来操作。
开启请求缓冲区
可以在 ClownFish.App.config 或者环境变量在设置参数 ClownFish_Aspnet_RequestBufferSize
例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ClownFish_Aspnet_RequestBufferSize" value="2048"/>
</appSettings>
</configuration>
2048 这个数字就是缓冲区的大小,单位: byte
注意: 这个数字不能过大,否则会占用大量内存,甚至影响程序稳定!
建议值: 2048
请求缓冲区启用条件
请求缓冲区的开启需要几个条件:
- ClownFish_Aspnet_RequestBufferSize 的设置值 大于 0
- 存在请求体,例如: POST 是支持的,GET请求就不支持
- 请求体内容是文本格式,这里主要分析 Content-Type
- 请求体长度小于 ClownFish_Aspnet_RequestBufferSize 的设置值
以上4个条件必须全部满足才会启用。
确认请求缓冲区已开启
可以查看响应头,例如:
HTTP/1.1 200 OK
x-EnableBuffering: 2048
当存在 x-EnableBuffering 这个响应头时,就表示请求缓冲区已开启。
查看日志
例如: