NLog NETCore 3.0 Porting

NLog NETCore 3.0 Porting

这里简单整理一下,NETCore 3.0 + NLog工程移植过程中遇到的问题。

Configuration

以下代码才能编译通过using Microsoft.Extensions.Hosting;

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory){    
	if (env.IsDevelopment())    
	{        
		app.UseDeveloperExceptionPage();    
	}
}

使用 IWebHostEnvironment 替换原来的 IHostEnvironment

NLog 对应

NLog简介

比较的详细的可以参考:
https://blog.csdn.net/sd7o95o/article/details/81350638
NLog NETCore 3.0 Porting_第1张图片

StartUp

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文件输出
NLog NETCore 3.0 Porting_第2张图片

过时的IHostingEnvironment与IApplicationLifetime对象从.NET Core 3.0开始,IHostingEnvironment与IApplicationLifetime已被标记为“过时(Obsolete)”,这意味着在后续的.NET版本中,将不再继续支持这两个接口。如果我们在Startup的Configure方法中使用了这两个对象,那么最好也将这两个接口分别替换为:IWebHostEnvironment和IHostApplicationLifetime。

Console App

支持3.0之后,通过以下构建一个LoggerFactory 用于非WebApp的Log输出。之前的方法在3.0中,没有提供了AddConsole的定义了

var myfactory = new LoggerFactory();    myfactory.AddConsole();    myfactory.AddNLog();

分析IWebHostBuilder 与IHostBuilder的关系,两者没有继承关系。两者还有一定的相似之处,前者的保留更多的是为了兼容NetCore2.0 的构建过程。
NLog NETCore 3.0 Porting_第3张图片NLog NETCore 3.0 Porting_第4张图片
这里的Build是否应该会删除了呢?还是在内部还会调用?

可以参考WebHost,写一个针对Console App的构建封装。

可以看到在Host Build的过程中已经加入了很多的Service,如下有Config、Lifetime、IOptions、Logger等其中,比较重要是IHost也能获取到。
NLog NETCore 3.0 Porting_第5张图片
如下代码可以看到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 配置文件(无变化)


<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

你可能感兴趣的:(NetCore,C#)