HTTP日志

HTTP日志分为2大块:

  • 当次HTTP请求的 Request/Response 日志
  • 当次HTTP请求执行过程中,由 HttpClient 发起的HTTP请求及响应的日志

注意:记录日志都是需要耗费性能以及增加内存占用的
所以 ClownFish 设计了8个参数来控制日志记录哪些内容

参数名默认值参数含意
ClownFish_Log_Http_LogRequest0是否必须记录 Request 到日志中
ClownFish_Log_Http_LogRequestBody1是否必须记录 Request-Body 到日志中
ClownFish_Log_Http_LogResponse0是否必须记录 Response 到日志中
ClownFish_Log_Http_LogResponseBody1是否必须记录 Response-Body 到日志中
ClownFish_Log_HttpClient_LogRequest1是否必须记录 HttpClient-HttpRequestMessage 到日志中
ClownFish_Log_HttpClient_LogRequestBody0是否必须记录 HttpClient-HttpRequestMessage-Body 到日志中
ClownFish_Log_HttpClient_LogResponse1是否必须记录 HttpClient-HttpResponseMessage 到日志中
ClownFish_Log_HttpClient_LogResponseBody0是否必须记录 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 这个响应头时,就表示请求缓冲区已开启。



查看日志

例如:

xx


xx