无法在NLog中设置我的连接字符串 [英] Unable to set my connectionstring in NLog

查看:68
本文介绍了无法在NLog中设置我的连接字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

NLog.config文件未设置连接字符串.

The NLog.config file does not set the connection string.

<?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>

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

I put a breakpoint and the connection string is null;

我的启动方法如下;

    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");
    }
}

编辑-我将记录器规则更改为<logger name="*" minlevel="Trace" writeTo="db" />,但仍然没有输出任何内容.但是,我寻找了c:\ temp \ internal-nlog.txt,但它尚未创建.因此,似乎nlog.config文件被忽略了.但这是在我的项目中Startup.cs文件旁边.

EDIT - I change the logger rule to <logger name="*" minlevel="Trace" writeTo="db" /> but still it didn't output anything. However I looked for the c:\temp\internal-nlog.txt and it had not been created. So it appears the nlog.config file is being ignored. But it is in my project next to the Startup.cs file.

-可以通过将复制到输出目录"设置为始终复制"来解决空配置. 从下面的评论中,我现在可以正常工作了.

- the null configuration can be solved by setting "Copy to output directory" to "copy always". From the comments underneath I have now got this working.

推荐答案

更新的答案

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

Updated answer

Since NLog.Web.AspNetCore 4.8 (NLog.Extensions.Logging 1.4 for .NET Core console programs) you could directly read from your appSettings.json

${configsetting:name=MyConnectionString}

请参见文档

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

Unfortunately reading connectionstrings/settings from appSettings.json / app.config is not yet supported in NLog for .NET core.

两个选项:

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

  1. Set the connectionstring programmatically, by using variables. In your nlog.config:

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

和代码:(例如,在Configure中)

and in code: (e.g. in Configure)

LogManager.Configuration.Variables["myConnectionstring"] = "...."; //read config here

  • 或者,在nlog.config中设置连接字符串.

  • Or, set the connectionstring in nlog.config.

    在您的nlog.config中:

    In your nlog.config:

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

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

    and using in your target in nlog.config:

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

  • 这篇关于无法在NLog中设置我的连接字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆