.NET Core3.0 日志 logging

多年的经验,日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用。它可使我们在系统出现问题之后,排查错误提供依据。
.NET Core3.0内置多种日志记录程序,并且有第三方提供的日志记录程序框架如:log4net,NLog,Serilog,elmah.io等。后面会介绍前三种日志框架如何与.NETcore3.0结合起来进行使用。
内置日志记录提供程序
ASP.NET Core 提供以下提供程序:
控制台-可以在控制台查看日志输出
调试-vs工具 -》开始调试-》输出窗口进行查看日志输出
EventSource-可使用PerfView 实用工具收集和查看日志
EventLog-》仅在windows系统下可以使用事件查看器查看日志
TraceSource
AzureAppServicesFile
AzureAppServicesBlob
ApplicationInsights
创建使用日志
通用主机的应用程序和非主机应用程序使用的方式也是不同的。因为通用主机内部封装了 依赖注入、logging、配置、IHostedService的实现;并且默认配置了控制台,调试,EventSource以及EventLog(仅当在windows上运行时)提供程序。源码如下
.ConfigureLogging((hostingContext, logging) =>
{
var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
// the defaults be overridden by the configuration.
if (isWindows)
{
// Default the EventLogLoggerProvider to warning or above
logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
} logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger(); if (isWindows)
{
// Add the EventLogLoggerProvider on windows machines
logging.AddEventLog();
}
})
通用主机
添加提供程序
可自行选择提供程序来替换默认提供程序。在CreateHostBuilder时候 调用ClearProviders(),然后添加所需的提供程序。我们创建一个api项目为例
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();//去掉默认添加的日志提供程序
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
logging.AddEventLog();
//logging.AddTraceSource(); })
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
创建日志
在 Web 应用或托管服务中,由依赖关系注入 (DI) 获取 ILogger。
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger; //可以显示指定类别名称ILoggerFactory logger
//logger.CreateLogger("WebApi.Controllers.WeatherForecastController");
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//内置日志
_logger.LogTrace(, "log Trace msg"); //
_logger.LogDebug(, "log Debug msg"); //
_logger.LogInformation(, "log Information msg"); //
_logger.LogWarning(, "log Warning msg"); //
_logger.LogError(, "log Error msg"); //
_logger.LogCritical(, "log Critical msg"); //
各个端的运行输出:



非主机控制台
添加提供程序
在创建 LoggerFactory 时调用提供程序的 Add{provider name} 扩展方法:
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
.AddConsole()
.AddEventLog();
});
创建日志
在非主机控制台应用中,使用 LoggerFactory 来创建 ILogger。
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("非主机模式输出log message");
运行输出

第三方日志框架
log4net,NLog和Serilog这3种日志记录框架几乎在.NET空间中占主导地位,不需要太多介绍。看看最近6周的下载排名就知道了。如图

log4net 在NET Core 3.0使用

引用Log4net到项目中,安装NuGet包
Install-Package log4net -Version 2.0.
在项目中添加log4net.config文件,右键改文件属性-》复制到输出目录选择-》始终复制
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="loglog4net.log" />
<appendToFile value="true" />
<maximumFileSize value="50KB" />
<maxSizeRollBackups value="" /> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %message%newline" />
</layout>
</appender> <root>
<level value="ALL" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
在Startup文件中添加log4net配置的文件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseLog4net();
/// <summary>
/// 使用log4net配置
/// </summary>
/// <param name="app"></param>
/// <returns></returns>
public static IApplicationBuilder UseLog4net(this IApplicationBuilder app)
{
var logRepository = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.Config.XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
return app;
}
上面两步的准备完成之后,在Controllers中使用
private readonly ILog log;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
this.log = LogManager.GetLogger(typeof(WeatherForecastController));
} [HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//第三方日志
log.Error("log4net erro msg"); //log4net
运行查看日志文件

NLog 在NET Core 3.0使用

引用NLog到项目中,安装NuGet包
Install-Package NLog.Web.AspNetCore -Version 4.9.
Install-Package NLog -Version 4.6.
添加配置文件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="Info"
internalLogFile="internal-nlog.txt"> <!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions> <!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
</targets> <!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<!-- BlackHole without writeTo -->
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
在Program.cs文件配置 Main方法添加
NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
CreateHostBuilder方法添加
.UseNLog() //NLog: Setup NLog for Dependency injection
使用
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//内置日志
_logger.LogTrace(, "log Trace msg"); //
_logger.LogDebug(, "log Debug msg"); //
_logger.LogInformation(, "log Information msg"); //
_logger.LogWarning(, "log Warning msg"); //
_logger.LogError(, "log Error msg"); //
_logger.LogCritical(, "log Critical msg"); //
输出

Serilog 在NET Core 3.0使用

引用Serilog到项目中,安装NuGet包
Install-Package Serilog.AspNetCore -Version 3.1.
在Program.cs文件进行Logger 初始化
Main方法添加
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()// 配置日志输出到控制台
.WriteTo.File("logserilog.txt", rollingInterval: RollingInterval.Day) //配置日志输出文件,生成周期每天
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
将Serilog设置为日志提供程序,只需在CreateHostBuilder方法后添加一句
.UseSerilog();
注入logger到你的controllers
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;//默认
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//内置日志
_logger.LogTrace(, "log Trace msg"); //
_logger.LogDebug(, "log Debug msg"); //
_logger.LogInformation(, "log Information msg"); //
_logger.LogWarning(, "log Warning msg"); //
_logger.LogError(, "log Error msg"); //
_logger.LogCritical(, "log Critical msg"); //
运行输出:

小结:本文主要讲解NET Core3.0内置的日志提供程序和与第三方日志框架(Log4net,Nlog,Serilog)的使用。
.NET Core3.0 日志 logging的更多相关文章
- EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...
- .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器
目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...
- python 的日志logging模块学习
1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...
- python 的日志logging模块
1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message')logging.info('This is info messag ...
- 兼容 .NET Core3.0, Natasha 框架实现 隔离域与热编译操作
关于 Natasha 动态构建已经成为了封装者们的家常便饭,从现有的开发趋势来看,普通反射性能之低,会迫使开发者转向EMIT/表达式树等构建方式,但是无论是EMIT还是表达式树,都会依赖于反射的 ...
- 日志(logging)与正则(re)模块
logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warn ...
- python中日志logging模块的性能及多进程详解
python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...
- 致远·面向人工智能-逐浪CMS v8.1.2全面发布[全球首个基于dotNET core3.0的中文CMS]
原文:https://www.z01.com/down/3484.shtml 再远, 我都不会停息, 因为技术而生, 因为技术而强, 这是逐浪软件的命与根! 全新打造, 三百多项超级功能, 助你十分钟 ...
- .Net Core3.0 WebApi 项目框架搭建 三:读取appsettings.json
.Net Core3.0 WebApi 项目框架搭建:目录 appsettings.json 我们在写项目时往往会把一些经常变动的,可能会变动的参数写到配置文件.数据库中等可以存储数据且方便配置的地方 ...
随机推荐
- (intellij ieda激活码、CLion激活码、php storm激活码、webstorm激活码、jetbrains全家桶激活码)
中华民族传统美德 下载地址 https://www.jetbrains.com/zh/phpstorm/promo/?utm_source=baidu&utm_medium=cpc&u ...
- 【iOS 】把一些不太重要的任务放在空时执行
-(void)idleNotificationMethod { } -(void)registerForIdleNotification { [[NSNotificationCenter defaul ...
- Salem and Sticks-萨鲁曼的棍子 CodeForce#1105A 暴力
题目链接:Salem and Sticks 题目原文 Salem gave you
- selenium-03-常用操作
基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具. Selenium的核心:browser bot,是用JavaScript编写的. Selenium工具有4种:Seleni ...
- JMeter 压测Server Agent无法监控资源问题,PerfMon Metrics Collector报Waiting for sample,Error loading results file - see file log, Can't accept UDP connections java.net.BindException: Address already in use 各种疑难杂症
如何安装插件此博主已经说得很详细了. https://www.cnblogs.com/saryli/p/6596647.html 但是需注意几点: 1.修改默认端口,这样可以避免掉一个问题.Serve ...
- Docker系列(五):.Net Core实现k8s健康探测机制
k8s通过liveness来探测微服务的存活性,判断什么时候该重启容器实现自愈.比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可能是资源死锁,此时 httpd 进程并没有异常退出 ...
- 高效解决「SQLite」数据库并发访问安全问题,只这一篇就够了
Concurrent database access 本文译自:https://dmytrodanylyk.com/articles/concurrent-database/ 对于 Android D ...
- 魔鬼在细节,理解Java并发底层之AQS实现
jdk的JUC包(java.util.concurrent)提供大量Java并发工具提供使用,基本由Doug Lea编写,很多地方值得学习和借鉴,是进阶升级必经之路 本文从JUC包中常用的对象锁.并发 ...
- 你真的懂Spring Java Config 吗?Full @Configuration vs lite @Bean mode
Full @Configuration和lite @Bean mode 是 Spring Java Config 中两个非常有意思的概念. 先来看一下官方文档关于这两者的相关内容: The @Bean ...
- Solidity 编程实例--投票
Voting 投票 思路是为每张选票创建一个合约,每个投票选项提供一个短名称.合约创建者作为会长将会给每个投票参与人各自的地址投票权. 地址后面的人们可以选择自己投票或者委托信任的代表人替他们投票.在 ...