代码之家  ›  专栏  ›  技术社区  ›  Jeremy Holovacs

NLog.NET核心aspnet用户标识始终为空

  •  2
  • Jeremy Holovacs  · 技术社区  · 7 年前

    我读过很多类似主题的帖子,似乎没有一个能解决我的问题。

    我的 nlog.config 类似于:

    <?xml version="1.0" encoding="utf-8"?>
    
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xsi:schemaLocation="NLog NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          autoReload="true"
          throwExceptions="true"
          internalLogIncludeTimestamp="true"
          internalLogFile="nlog-internal.log"
          internalLogLevel="Error">
      <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
      <targets>
        <target xsi:type="Database"
                name="database"
                commandType="Text"
                dbProvider="Npgsql.NpgsqlConnection, Npgsql"
                connectionString="${var:appDbConnectionString}"
                commandText="Layout">
          <commandText>
            insert into "logs" ("application", "user", "level", "message", "exception", "logger")
            values (@application, @user, @level, @message, @exception, @logger);
          </commandText>
          <parameter name="@application" layout="My App" />
          <parameter name="@user" layout="${aspnet-user-identity}" />
          <parameter name="@level" layout="${level}" />
          <parameter name="@message" layout="${message}" />
          <parameter name="@exception" layout="${exception:format=tostring}" />
          <parameter name="@logger" layout="${logger}" />
        </target>
      </targets>
      <rules>
        <logger name="MyApp.*" minlevel="Info" writeTo="database" final="true" />
        <logger name="*" minlevel="Error" writeTo="database" final="true"/>
        <logger name="*" minlevel="Warn" writeTo="database" final="true"/>
      </rules>
    </nlog>
    

    Startup.cs ConfigureServices()

    services.AddLogging();
    

    ... 我的 启动.cs Configure() 方法:

    var loggerFactory = app.ApplicationServices.GetService<ILoggerFactory>();
            LogManager.LoadConfiguration("nlog.config");
            LogManager.Configuration.Variables["appDbConnectionString"] =
                config["ConnectionStrings:ApplicationContext"];
            loggerFactory.AddNLog();
    

    ... 我的 BuildWebHost(string[] args) 在我的 Program.cs 有:

    public static IWebHost BuildWebHost(string[] args)
    {
        return WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseNLog()
            .Build();
    }
    

    不能 去拿那个 {aspnet-user-identity} 一片空白。

    我做错什么了?

    我使用的是nlog4.5.10、NLog.Extensions.Logging 1.3.0和NLog.Web.AspNetCore 4.7.0;这些似乎是最新的图书馆。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jeremy Holovacs    7 年前

    因此,NLog在与IoC容器一起使用时实现了自己的服务定位器。我需要加一句这样的话:

    app.ApplicationServices.SetupNLogServiceLocator();
    

    issue in GitHub 但他们几乎立刻做出了反应

        2
  •  1
  •   Cirem    5 年前

    loggerFactory.AddNLog(); 是个问题。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .CaptureStartupErrors(true)
                        .UseIISIntegration()
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .UseStartup<Startup>()
                        .ConfigureLogging((hostingContext, logging) =>
                        {
                            //logging.AddNLog(); //<--- Can remove (NLog.Extensions.Logging)
                        })
                        ;
                })
                .UseNLog(); // <--- Call UseNLog off of IHostBuilder (NLog.Web)
    }
    

    看见 https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3

        3
  •  0
  •   mdickin    7 年前

    调试时 User.Identity.Name 有决心吗?

    我遇到了这个问题,通过添加一个带有 ClaimTypes.Name ClaimsIdentity 正在寻找生成名称的特定声明。