3

如何使用NLog完全记录HTTP 请求

这是Fiddler捕获它的方式,我需要这样的东西:

POST http://localhost/api/places/add HTTP/1.1
User-Agent: Fiddler
Host: localhost
Authorization: 375DF933413
Content-Length: 78
Content-Type: application/json

{ "location": { "lon": 35.005577, "lat": 48.435533}, "name": "n1" } 

我相信应该可以编写一些“神奇”的 NLog 布局表达式。

4

2 回答 2

2

一个简单的方法:

public class LogHttpRequestAttribute : ActionFilterAttribute
{
    private static Logger _logger = LogManager.GetCurrentClassLogger();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _logger.Debug("action executing");

        base.OnActionExecuting(filterContext);
    }
}

用法:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // Register global filter
    GlobalFilters.Filters.Add(new LogHttpRequestAttribute ());


}

要记录 URL, ${aspnet-request:serverVariable=HTTP_URL}请在您的配置中使用 for,请参阅wiki。为这些布局渲染器安装 NLog.Web。

NLog 维基

于 2016-06-09T12:39:57.280 回答
1

我正在使用一个ActionFilterAttribute来实现类似的东西:

public class LogHttpRequest : ActionFilterAttribute
{
    private readonly Logger _log = LogManager.GetCurrentClassLogger();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var sb = new StringBuilder();

        sb.Append(request.RequestType + " " + request.Url + "\n");

        var parsed = HttpUtility.ParseQueryString(request.Headers.ToString());

        foreach (string key in parsed)
        {
            sb.Append(key + ": " + parsed[key] + "\n");
        }

        var inputStream = request.InputStream;
        inputStream.Position = 0;

        using (var reader = new StreamReader(inputStream))
        {
            var body = reader.ReadToEnd();
            sb.Append("\n" + body);
        }

        _log.Log(LogLevel.Info, sb.ToString());

        base.OnActionExecuting(filterContext);
    }
}

如果你真的想使用 NLog 布局表达式,你可以在下面做这样的事情ActionFilter

var logEventInfo = new LogEventInfo(LogLevel.Info, null, null);
var parsed = HttpUtility.ParseQueryString(request.Headers.ToString());

foreach (string key in parsed)
{
    logEventInfo.Properties.Add(key, parsed[key]);
}

var inputStream = request.InputStream;
inputStream.Position = 0;

using (var reader = new StreamReader(inputStream))
{
    var body = reader.ReadToEnd();
    logEventInfo.Properties.Add("Body", body);
}

_log.Log(logEventInfo);

${event-context:item=Key}然后在您的 NLog 布局中,您可以使用其中 Key 是要包含在输出中的标头名称的名称来访问这些属性 。

于 2014-03-10T17:39:44.717 回答