【问题标题】:Unable to set my connectionstring in NLog无法在 NLog 中设置我的连接字符串
【发布时间】:2019-02-02 22:22:54
【问题描述】:

NLog.config 文件没有设置连接字符串。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Warn"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- Load the ASP.NET Core plugin -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore" />
  </extensions>
  <variable name="SirNLogDb" value="data source=SQL_MULALLEY;initial catalog=LogFiles;User ID=xxx;Password=yyy;">
  </variable>
  <!--  providerName="System.Data.SqlClient"-->

  <!-- the targets to write to -->
  <targets>
    <target name="db"
            xsi:type="Database"
            dbProvider="System.Data.SqlClient"
            connectionString="${var:SirNLogDb}"
            commandType="StoredProcedure"
            commandText="[dbo].[NLog_AddEntry_p]">
      <parameter name="@machineName"    layout="${machinename}" />
      <parameter name="@siteName"       layout="${iis-site-name}" />
      <parameter name="@logged"         layout="${date}" />
      <parameter name="@level"          layout="${level}" />
      <parameter name="@username"       layout="${aspnet-user-identity}" />
      <parameter name="@message"        layout="${message}" />
      <parameter name="@logger"         layout="${logger}" />
      <parameter name="@properties"     layout="${all-event-properties:separator=|}" />
      <parameter name="@serverName"     layout="${aspnet-request:serverVariable=SERVER_NAME}" />
      <parameter name="@port"           layout="${aspnet-request:serverVariable=SERVER_PORT}" />
      <parameter name="@url"            layout="${aspnet-request:serverVariable=HTTP_URL}" />
      <parameter name="@https"          layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" />
      <parameter name="@serverAddress"  layout="${aspnet-request:serverVariable=LOCAL_ADDR}" />
      <parameter name="@remoteAddress"  layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" />
      <parameter name="@callSite"       layout="${callsite}" />
      <parameter name="@exception"      layout="${exception:tostring}" />
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="database" />
  </rules>
</nlog>

我放了一个断点,连接字符串为空;

我的启动方法如下;

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvcCore()
            .AddMvcOptions(o => o.OutputFormatters.Add(
                new JsonOutputFormatter(new JsonSerializerSettings(), ArrayPool<char>.Shared)));
        var connectionStringMSurveyV2 = Configuration.GetConnectionString("MSurveyV2Db");
        services.AddScoped<MSurveyV2Db>(_ => new MSurveyV2Db(connectionStringMSurveyV2));
        var connectionStringSir = Configuration.GetConnectionString("SirDb");
        services.AddScoped<SirDb>(_ => new SirDb(connectionStringSir));
        services.AddScoped<IPropertiesRepo, PropertiesRepo>();
        services.AddScoped<ISirUoW, SirUoW>();
        services.AddScoped<Services.IMailService, Services.MailService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();
        loggerFactory.AddDebug();
        loggerFactory.AddNLog();
        //add NLog.Web
        app.AddNLogWeb();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler();
        }

        app.UseMvc();
        AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Exception, OperationStatus>();
            cfg.CreateMap<ViewSelectedContracts, ContractDto>();
        });
        var logger = LogManager.GetCurrentClassLogger();
        logger.Info("Logged in");
    }
}

编辑-我将记录器规则更改为&lt;logger name="*" minlevel="Trace" writeTo="db" /&gt;,但它仍然没有输出任何内容。但是我查找了 c:\temp\internal-nlog.txt 并没有创建它。所以看起来 nlog.config 文件被忽略了。但它在我的项目中 Startup.cs 文件旁边。

EDIT2: - 可以通过将“复制到输出目录”设置为“始终复制”来解决空配置。 从下面的 cmets 我现在已经开始工作了。

【问题讨论】:

  • “不起作用”非常模糊,如果您需要帮助使其工作。您是否使用 NLog Internal-Log 验证了连接字符串已被拾取?也许是其他东西阻止您登录到数据库。
  • 嗨 Rolf,我的意思是没有任何东西输出到数据库。我已经编辑了我的问题以显示记录器对象的监视值。
  • 只能重复我自己。您是否使用 NLog Internal-Log 验证了连接字符串已被拾取?
  • 我再次认为问题在于您的日志记录规则正在写入“数据库”,但您的目标被称为“db”。更改您的日志记录规则以写入“db”(或者您是否忘记更新/删除调试器的屏幕截图?)

标签: c# asp.net-core nlog appsettings


【解决方案1】:

更新答案

由于 NLog.Web.AspNetCore 4.8(用于 .NET Core 控制台程序的 NLog.Extensions.Logging 1.4),您可以直接从您的 appSettings.json 中读取

${configsetting:name=MyConnectionString}

docs


原答案

不幸的是,NLog for .NET core 尚不支持从 appSettings.json / app.config 读取连接字符串/设置。

两种选择:

  1. 使用变量以编程方式设置连接字符串。 在你的 nlog.config 中:

    <target ... connectionString="${var:myConnectionstring}"  ... />
    

    在代码中:(例如在Configure

    LogManager.Configuration.Variables["myConnectionstring"] = "...."; //read config here
    
  2. 或者,在 nlog.config 中设置连接字符串。

    在你的 nlog.config 中:

    <variable name="myConnectionstring" value="...." />  
    

    并在 nlog.config 中的目标中使用:

    <target ... connectionString="${var:myConnectionstring}" ... />
    

【讨论】:

  • 这是正确答案。我遇到的真正问题是,在我的开发数据库上,它使用的是美国日期设置,而在登台和实时服务器上,它是英国日期设置。这导致 Nlog 在我发现问题所在之前无法工作。
  • @Julian:您是否也有使用 asp.net core 2.0 的解决方案?
  • 使用点表示法的更新答案对我很有用:connectionString="${configsetting:name=ConnectionStrings.Logs}" 这让我可以摆脱 Startup.cs 中对 GlobalDiagnosticsContext 的调用
【解决方案2】:

另一种选择是创建和注册自定义 NLog 布局渲染器 (startup.cs):

https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer

从您最喜欢的配置位置读取 ConnectionString 后输出。然后你的 nlog.config 中没有连接字符串,只是参考你的自定义布局渲染器。

也许为这个悬而未决的问题欢呼:

https://github.com/NLog/NLog.Web/issues/107

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多