我正在使用一个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 是要包含在输出中的标头名称的名称来访问这些属性
。