我有一个简单的asp.net核心web api应用程序(使用Visual Studio 2017中的默认web api模板),使用nlog将消息记录到JSON格式的控制台。
这是NLog配置文件:
<!-- the targets to write to -->
<targets>
<target xsi:type="Console" name="console_log" >
<layout xsi:type="JsonLayout">
<attribute name="ts" layout="${date}" />
<attribute name="level" layout="${level:upperCase=true}"/>
**<attribute name="all-events" layout="${all-event-properties}"/>
<attribute name="tid" layout="${aspnet-request:header=tid}"/>**
<attribute name="cn" layout="${callsite}"/>
<attribute name="msg" layout="${message}" />
</layout>
</target>
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Debug" writeTo="console_log" />
</rules>
</nlog>
在Startup.cs中,Configure方法包含以下两行:
env.ConfigureNLog("nlog.config");
loggerFactory.AddNLog();
我将JSON格式的日志消息输出到控制台。但是,我无法在HTTP请求标头中收到自定义标头的tid。
如何提取HTTP请求标头并将其输出到控制台?
感谢您的意见/答案/指导。谢谢。
答案 0 :(得分:2)
${aspnet-request}
取决于HttpContextAccessor
。请更新您的代码以在IWebHostBuilder上使用UseNLog
(请参阅此示例中的program.cs)
https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2#4-update-programcs
UseNLog
会自动注册HttpContextAccessor
(请注意删除对ConfigureNLog
或AddNLog
的任何使用,但仅使用UseNLog
和LogManager.LoadConfiguration
作为{{1}}如上例所示)
答案 1 :(得分:0)
你可以像这样使用ActionFilterAttribute
:
public class HttpHeadersLogger : ActionFilterAttribute
{
private readonly Logger _log = LogManager.GetCurrentClassLogger();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var builder = new StringBuilder();
builder.Append(request.RequestType + " " + request.Url + "\n");
var logEventInfo = new LogEventInfo(LogLevel.Info, null, null);
var parsed = HttpUtility.ParseQueryString(request.Headers.ToString());
foreach (string key in parsed)
{
// Search for 'tid' header here to only log these one
logEventInfo.Properties.Add(key, parsed[key]);
}
_log.Log(logEventInfo);
base.OnActionExecuting(filterContext);
}
}
在此示例中,正在记录所有标题,如果您只想要'tid',则应过滤该标题。
这将使用NLog布局表达式,方法是使用对象LogEventInfo
来执行日志记录操作。