[Type:错误
NLog版本:4.7.2
NLog.Web / NLog.Web.AspNetCore版本:4.9.2
NLog.Extensions.Logging版本:N / A
平台 :. NET Core 3.1
当前NLog配置(xml或C#,如果相关)
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="internal.txt">
<extensions>
<!--enable NLog.Web for ASP.NET Core-->
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- define various log targets -->
<targets>
<target xsi:type="File"
name="allOutput"
fileName="${startupdir}\logs\SkyJack-Agent-All-${shortdate}.log"
layout="${longdate} ${logger} ${uppercase:${level}} ${message} ${exception}" />
<target xsi:type="File"
name="ourOutput"
fileName="${startupdir}\logs\SkyJack-Agent-OurOutput-${shortdate}.log"
layout="${longdate} ${logger} ${uppercase:${level}} ${message} ${exception}" />
<target xsi:type="File"
name="errorsOnly"
fileName="${startupdir}\logs\SkyJack-Agent-ErrorsOnly-${shortdate}.log"
layout="${longdate} ${logger} ${uppercase:${level}} ${message} ${exception}" />
<target name="console" xsi:type="ColoredConsole" layout="${longdate} ${pad:padding=5:inner=-${level}-} ${message}"
useDefaultRowHighlightingRules="false" >
<highlight-row condition="level==LogLevel.Trace" foregroundColor="Gray" />
<highlight-row condition="level==LogLevel.Debug" foregroundColor="DarkGray" />
<highlight-word text="-Info-" foregroundColor="DarkGreen" />
<highlight-word text="-Warn-" foregroundColor="DarkYellow" />
<highlight-word text="-Error-" foregroundColor="DarkMagenta" />
<highlight-word text="-Fatal-" foregroundColor="DarkRed" backgroundColor="White"/>
</target>
</targets>
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Debug" writeTo="console" />
<logger name="*" minlevel="Trace" writeTo="allOutput" />
<logger name="*" minlevel="Error" writeTo="errorsOnly" />
<!--Skip Microsoft logs - no writeTo attribute-->
<logger name="Microsoft.*" minlevel="Trace" final="true" />
<logger name="*" minlevel="Trace" writeTo="ourOutput" />
</rules>
</nlog>
我正在以单个文件发布的.NET Core Web服务中使用NLog,并尝试将其安装为服务。当我正常运行NLog时,它可以正常工作,但是当作为服务运行时,则需要告知它在哪里可以找到配置文件,这是我完成的:
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(Path.Combine(pathToContentRoot, "nlog.config"));
var logger = NLog.Web.NLogBuilder.ConfigureNLog(NLog.LogManager.Configuration).GetCurrentClassLogger();
内容的根源为:
builder.UseWindowsService().UseContentRoot(pathToContentRoot);
这似乎至少在开始时起作用,并且生成了一些日志输出,足以证明我已成功设置内容根目录:
2020-05-28 15:42:20.5932 SkyJack.Agent.Program INFO ... Initializing SkyJack Agent with content root G:\MSGPS2\SkyJack\SkyJack\src\SkyJack.Agent\bin\Release\netcoreapp3.1\publish...
2020-05-28 15:42:20.6373 SkyJack.Agent.Program TRACE Entering CreateWebHostBuilder()
2020-05-28 15:42:20.8023 SkyJack.Agent.Program TRACE Returned from CreateWebHostBuilder()
2020-05-28 15:42:20.8023 SkyJack.Agent.Program TRACE Entering builder.Build()
2020-05-28 15:42:20.9446 SkyJack.Agent.Program TRACE Returned from builder.Build()
但是最终,它将引发异常:
Log Name: Application
Source: ServerManagerAgent
Date: 5/28/2020 3:54:04 PM
Event ID: 6
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: HPZEE.redmond.corp.microsoft.com
Description:
Category: Microsoft.AspNetCore.Hosting.Diagnostics
EventId: 6
Application startup exception
Exception:
System.IO.FileNotFoundException: Failed to load NLog LoggingConfiguration. Searched the following locations:
- C:\WINDOWS\TEMP\.net\ServerManagerAgent\31dyvwga.rkl\nlog.config
File name: 'nlog.config'
at NLog.LogFactory.LoadConfiguration(String configFile, Boolean optional)
at NLog.LogFactory.LoadConfiguration(String configFile)
at NLog.LogManager.LoadConfiguration(String configFile)
at NLog.Web.NLogBuilder.ConfigureNLog(String configFileName)
at WebAppService.Startup.Configure(IApplicationBuilder app)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
at Microsoft.Extensions.DependencyInjection.AutoRegisterMiddleware.<>c__DisplayClass4_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="ServerManagerAgent" />
<EventID Qualifiers="0">6</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2020-05-28T22:54:04.0041305Z" />
<EventRecordID>61154</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>Application</Channel>
<Computer>HPZEE.redmond.corp.microsoft.com</Computer>
<Security />
</System>
<EventData>
<Data>Category: Microsoft.AspNetCore.Hosting.Diagnostics
EventId: 6
Application startup exception
Exception:
System.IO.FileNotFoundException: Failed to load NLog LoggingConfiguration. Searched the following locations:
- C:\WINDOWS\TEMP\.net\ServerManagerAgent\31dyvwga.rkl\nlog.config
File name: 'nlog.config'
at NLog.LogFactory.LoadConfiguration(String configFile, Boolean optional)
at NLog.LogFactory.LoadConfiguration(String configFile)
at NLog.LogManager.LoadConfiguration(String configFile)
at NLog.Web.NLogBuilder.ConfigureNLog(String configFileName)
at WebAppService.Startup.Configure(IApplicationBuilder app)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
at Microsoft.Extensions.DependencyInjection.AutoRegisterMiddleware.<>c__DisplayClass4_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
</Data>
</EventData>
</Event>
WebAppService.Startup.Configure()再次调用NLog.Web.NLogBuilder.ConfigureNLog(),大概只是使用“ nlog.config”而不是我最初传入的位置或LoggerConfiguration对象。
有没有办法让它使用我已经指定并加载的位置或配置?
我能够使用:
NLog.LogManager.LogFactory.SetCandidateConfigFilePaths(new List<string> { $"{Path.Combine(pathToContentRoot, "nlog.config")}" });
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();