Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何配置nlog.config以包含asp.net core 2 web api请求自定义标头信息?_C#_Asp.net Core_Nlog - Fatal编程技术网

C# 如何配置nlog.config以包含asp.net core 2 web api请求自定义标头信息?

C# 如何配置nlog.config以包含asp.net core 2 web api请求自定义标头信息?,c#,asp.net-core,nlog,C#,Asp.net Core,Nlog,我有一个简单的asp.net核心web api应用程序(使用Visual Studio 2017中的默认web api模板),使用nlog以JSON格式将消息记录到控制台 ASP.NET核心2:2.0.5 NLog版本:4.5.0-rc07 NLog.Web.AspNetCore: 4.5.0-rc03 以下是NLog配置文件: ** ** 在Startup.cs中,Configure方法包含以下两行: env.ConfigureNLog("nlog.config");

我有一个简单的asp.net核心web api应用程序(使用Visual Studio 2017中的默认web api模板),使用nlog以JSON格式将消息记录到控制台

  • ASP.NET核心2:2.0.5
  • NLog版本:4.5.0-rc07
  • NLog.Web.AspNetCore: 4.5.0-rc03
以下是NLog配置文件:


**
**
在Startup.cs中,Configure方法包含以下两行:

        env.ConfigureNLog("nlog.config");
        loggerFactory.AddNLog();
我将JSON格式的日志消息输出到控制台。但是,我无法接收tid,它是HTTP请求标头中的自定义标头

如何提取HTTP请求头并将其输出到控制台


我感谢你的评论/回答/指导。谢谢。

您可以像这样使用
actionfilteratAttribute

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
执行日志操作。

${aspnet request}
取决于
HttpContextAccessor
。请更新您的代码,以便在IWebHostBuilder上使用
UseNLog
(参见本例中的program.cs)


UseNLog
将自动注册
HttpContextAccessor
(请记住删除
ConfigureNLog
AddNLog
的任何用法,但仅使用
UseNLog
LogManager.LoadConfiguration
,如上例所示)

我按照URL链接设置NLog。非常感谢。但是,我的主要挑战是如何配置nlog.config条目以显示自定义头,而不显式地提取请求处理管道中的信息,并在可能的情况下设置日志上下文。如果可能,nlog.config中的以下行是否正确@PaulS
UseNLog
将提供对
HttpContextAccessor
的访问权限,该访问权限将提供对HttpRequest.Headers的访问权限,可以使用
${aspnet request:header=tid}
记录这些头。但我不是你解决问题的专家。听起来好像你把一些不符合维基推荐的东西随机组合在一起了。可能您需要检查NLog内部记录器是否存在任何警告。感谢您在检查NLog内部记录器方面提供的帮助和建议。我在nlog.config中遗漏了以下内容。问题在于NLog.config中缺少NLog.Web.AspNetCore扩展。