无法在 NLog 中设置我的连接字符串
Unable to set my connectionstring in NLog
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");
}
}
编辑 - 我将记录器规则更改为 <logger name="*" minlevel="Trace" writeTo="db" />
但它仍然没有输出任何内容。但是我查找了 c:\temp\internal-nlog.txt 并且它还没有被创建。所以 nlog.config 文件似乎被忽略了。但它在我的项目中 Startup.cs 文件旁边。
EDIT2:- 可以通过将 "Copy to output directory" 设置为 "copy always" 来解决空配置。
从下面的评论中,我现在已经开始工作了。
更新答案
自 NLog.Web.AspNetCore 4.8(NLog.Extensions.Logging 1.4 用于 .NET Core 控制台程序)您可以直接从 appSettings.json
中读取
${configsetting:name=MyConnectionString}
见docs
原回答
不幸的是,NLog for .NET core 尚不支持从 appSettings.json/app.config 读取 connectionstrings/settings。
两个选项:
使用变量以编程方式设置连接字符串。
在你的 nlog.config 中:
<target ... connectionString="${var:myConnectionstring}" ... />
并在代码中:(例如在 Configure
中)
LogManager.Configuration.Variables["myConnectionstring"] = "...."; //read config here
或者,在nlog.config中设置连接字符串。
在你的 nlog.config:
<variable name="myConnectionstring" value="...." />
并在 nlog.config 的目标中使用:
<target ... connectionString="${var:myConnectionstring}" ... />
另一种选择是创建并注册自定义 NLog 布局渲染器 (startup.cs):
https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
从您最喜欢的配置位置读取 ConnectionString 后输出它。那么你的 nlog.config 中没有连接字符串,而只是参考你的自定义布局渲染器。
也许为这个悬而未决的问题欢呼:
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");
}
}
编辑 - 我将记录器规则更改为 <logger name="*" minlevel="Trace" writeTo="db" />
但它仍然没有输出任何内容。但是我查找了 c:\temp\internal-nlog.txt 并且它还没有被创建。所以 nlog.config 文件似乎被忽略了。但它在我的项目中 Startup.cs 文件旁边。
EDIT2:- 可以通过将 "Copy to output directory" 设置为 "copy always" 来解决空配置。 从下面的评论中,我现在已经开始工作了。
更新答案
自 NLog.Web.AspNetCore 4.8(NLog.Extensions.Logging 1.4 用于 .NET Core 控制台程序)您可以直接从 appSettings.json
中读取${configsetting:name=MyConnectionString}
见docs
原回答
不幸的是,NLog for .NET core 尚不支持从 appSettings.json/app.config 读取 connectionstrings/settings。
两个选项:
使用变量以编程方式设置连接字符串。 在你的 nlog.config 中:
<target ... connectionString="${var:myConnectionstring}" ... />
并在代码中:(例如在
Configure
中)LogManager.Configuration.Variables["myConnectionstring"] = "...."; //read config here
或者,在nlog.config中设置连接字符串。
在你的 nlog.config:
<variable name="myConnectionstring" value="...." />
并在 nlog.config 的目标中使用:
<target ... connectionString="${var:myConnectionstring}" ... />
另一种选择是创建并注册自定义 NLog 布局渲染器 (startup.cs):
https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
从您最喜欢的配置位置读取 ConnectionString 后输出它。那么你的 nlog.config 中没有连接字符串,而只是参考你的自定义布局渲染器。
也许为这个悬而未决的问题欢呼: