这里简单整理一下,NETCore 3.0 + NLog工程移植过程中遇到的问题。
以下代码才能编译通过using Microsoft.Extensions.Hosting;
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory){
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
}
使用 IWebHostEnvironment 替换原来的 IHostEnvironment
比较的详细的可以参考:
https://blog.csdn.net/sd7o95o/article/details/81350638
NetCore新版本需要使用新的ILoggingBuilder对Log进行构建,3.0以前是从ILoggerFactory开始构建。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
namespace Microsoft.Extensions.Logging{ // // An interface for configuring logging providers. public interface ILoggingBuilder { // // Gets the Microsoft.Extensions.DependencyInjection.IServiceCollection where Logging // services are configured. IServiceCollection Services { get; } }}
[Obsolete("Instead use ILoggingBuilder.AddNLog() or IHostBuilder.UseNLog()")]public static ILoggerFactory AddNLog(this ILoggerFactory factory);
其中可以在
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((ILoggingBuilder logBuilder) =>
{
logBuilder.AddNLog();
logBuilder.AddConsole();
//logBuilder.confi
NLog.LogManager.LoadConfiguration("mynlog.config");
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:5012");
webBuilder.UseStartup<Startup>();
});
可以看出,这里的Host是通用的了,不一定只用于WebApp,可以用到Console App的开发中。
可以看到Log的配置文件应该是没有变化的,在Bin目录下也可以到看如下的Log文件输出
过时的IHostingEnvironment与IApplicationLifetime对象从.NET Core 3.0开始,IHostingEnvironment与IApplicationLifetime已被标记为“过时(Obsolete)”,这意味着在后续的.NET版本中,将不再继续支持这两个接口。如果我们在Startup的Configure方法中使用了这两个对象,那么最好也将这两个接口分别替换为:IWebHostEnvironment和IHostApplicationLifetime。
支持3.0之后,通过以下构建一个LoggerFactory 用于非WebApp的Log输出。之前的方法在3.0中,没有提供了AddConsole的定义了
var myfactory = new LoggerFactory(); myfactory.AddConsole(); myfactory.AddNLog();
分析IWebHostBuilder 与IHostBuilder的关系,两者没有继承关系。两者还有一定的相似之处,前者的保留更多的是为了兼容NetCore2.0 的构建过程。
这里的Build是否应该会删除了呢?还是在内部还会调用?
可以参考WebHost,写一个针对Console App的构建封装。
可以看到在Host Build的过程中已经加入了很多的Service,如下有Config、Lifetime、IOptions、Logger等其中,比较重要是IHost也能获取到。
如下代码可以看到Log的配置过程,以及Service配置的地方,注意在这里是获取不到对应的Service的实例的。这里还没有进行构建。要Build之后才能获取到。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((ILoggingBuilder logBuilder) =>
{
logBuilder.AddNLog();
logBuilder.AddConsole();
//logBuilder.confi
NLog.LogManager.LoadConfiguration("mynlog.config");
})
.ConfigureAppConfiguration((contex, builder) =>
{
//IHostApplicationLifetime
})
.ConfigureServices(services =>
{
Console.WriteLine("ConfigureServices In a Task");
var lifeTime = services.ToList().Find(a => typeof(IHostApplicationLifetime).IsAssignableFrom(a.ServiceType))
?.ImplementationInstance as IHostApplicationLifetime;
lifeTime?.ApplicationStarted.Register(() =>
{
Task.Run(() =>
{
Console.WriteLine("Hello World! In a Task");
});
});
})
.UseConsoleLifetime();
//.ConfigureWebHostDefaults(webBuilder =>
//{
// webBuilder.UseUrls("http://*:5012");
// webBuilder.UseStartup(); /
/});
Main函数里的代码,Build后注册一ApplicationStarted 消息,对应也有Stopped的消息。这里可以封装起来。
static void Main(string[] args) {
CancellationToken cancellationToken = new CancellationToken();
cancellationToken.Register(() =>
{
Console.WriteLine("App Stopped");
});
var dd = CreateHostBuilder(args).Build();
var lifeTime = dd.Services.GetService(typeof(IHostApplicationLifetime)) as IHostApplicationLifetime; lifeTime.ApplicationStarted.Register(() =>
{
Task.Run(() =>{
console.WriteLine("Hello World! In a Task");
});
});
dd.StartAsync(cancellationToken);
Console.WriteLine("Hello World!");
}
<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-nlog.txt">
<targets>
<target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
<target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /> <target xsi:type="Null" name="blackhole" />
targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="allfile" />
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
rules>
nlog>
https://www.cnblogs.com/runningsmallguo/p/11617165.html