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
在这里插入图片描述

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文件输出
在这里插入图片描述

过时的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 的构建过程。
在这里插入图片描述在这里插入图片描述
这里的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<Startup>();            /
/});

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 配置文件(无变化)

<?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="internal-nlog.txt">    
	<!--define various log targets-->    
	<targets>        
	<!--write logs to file-->        
	<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>        
        <!--All logs, including from Microsoft-->        
        <logger name="*" minlevel="Trace" writeTo="allfile" />
        <!--Skip Microsoft logs and so log only own logs-->        
        <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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.Net Core2.1+NLog+数据库连接 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="true" internalLogLevel="warn" internalLogFile="logfiles/internal-nlog.txt"> <targets> <target xsi:type="Null" name="blackhole" /> <target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=MiddleData;User ID=lzhu;Password=bl123456;" > <!-- create table NLog ( Id int identity, Application nvarchar(50) null, Logged datetime null, Level nvarchar(50) null, Message nvarchar(512) null, Logger nvarchar(250) null, Callsite nvarchar(512) null, Exception nvarchar(512) null, constraint PK_NLOG primary key (Id) ) --> <commandText> insert into nlog ( Application, Logged, Level, Message, Logger, CallSite, Exception ) values ( @Application, @Logged, @Level, @Message, @Logger, @Callsite, @Exception ); </commandText> <parameter name="@application" layout="NLogTestDemo" /> <parameter name="@logged" layout="${date}" /> <parameter name="@level" layout="${level}" /> <parameter name="@message" layout="${message}" /> <parameter name="@logger" layout="${logger}" /> <parameter name="@callSite" layout="${callsite:filename=true}" /> <parameter name="@exception" layout="${exception:tostring}" /> </target> </targets> <rules> <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="NLogTestDemo.*" minlevel="Info" writeTo="database" /> </rules> </nlog>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值