ASP.Net Core里的LOG系统
• EventSource
• ILogger
• DiagnosticSource
EventSource和DiagnosticSource是ASP.Net Core默认的,它会默认使用这两个,今天主要学习ILogger,它是基于Providers提供商,比如内置的有控制台提供商,等等。当然,我们自己也可以对其扩展,也可以使用第三方的Logger内置的Log Providers
内置的Log Providers
• Console
• Debug
• EventSource
• EventLog
• TraceSource
• Azure App Service
Log等级:
• Trace
• Debug
• Information
• Warning
• Error
• Critical
在进行记录日志的时候,还有一些选项参数,比如,分类,Event Id,格式化字符串
代码示例
先看一下源码,在Program.cs文件里对CreateDefaultBuilder进行反编译,可以看到如下:
可以看到里边已经有一些配置好的,如果我们想自己配置的话,可以在外边调用ConfigureLogging这个方法,来手动添加,比如只想要一个Console,如下:
怎么用Logger呢?比如我需要在HomeController.cs里使用,如下:
先注入:
public readonly IRepository<Student> _repository;
private readonly HostingEnvironment _hostingEnvironment;
private readonly ILogger<HomeController> _logger;
public HomeController(IRepository<Student> repository,HostingEnvironment hostingEnvironment,ILogger<HomeController> logger)
{
_repository = repository;
_hostingEnvironment = hostingEnvironment;
_logger = logger;
}
然后在Index方法里使用一下,如下:
先新建一个类,名为MyLogEventIds.cs,如下:
public class MyLogEventIds
{
public const int HomePage = 1000;
}
然后使用:
public IActionResult Index()
{
_logger.LogInformation(MyLogEventIds.HomePage, "visiting home index......");
return View();
}
可以在控制台看到:
基本格式就是这样,一共就三部分内容,一个是分类,一个是ID,一个是信息,有时候信息里边我们要加一些参数,如下:
int id = 10;
_logger.LogInformation(MyLogEventIds.HomePage, "visiting home index {0}", id);
注意:参数形式建议使用占位符,不建议使用$语法。
再看一下配置文件里的Log配置,先看appsettings.json文件:
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
再看看appsettings.Development.json文件:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
可以表明,Debug级别以上的可以使用Log,一下的就不能了,比如说:
_logger.Trace(MyLogEventIds.HomePage, "visiting home index {0}", id);
这就没什么作用了。
第三方Log Provider
• Serilog
• NLog
• EImah
在ASP.Net Core中用的比较多的就是第一个,所以这里学习一下Serilog,首先安装Serilog,打开Nuget,如下:
搜索Serilog.aspnetcore,如下:
然后搜索Serilog.sinks,这个有很多,主要是用来将日志输出到哪里,比如,输出到控制台,输出在文本文件里等等,如下:
这里安装前两个,可以输出在控制台和文件里。
然后配置Serilog,在Main方法里配置:
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(Path.Combine("logs", "log.txt"), rollingInterval: RollingInterval.Day)
.CreateLogger();
CreateWebHostBuilder(args).Build().Run();
}
最小级别是Debug,如果遇到Microsoft这个命名空间,它的最小级别是Information,下边两个WriteTo属于输出媒介,可以输出到控制台,也可以输出在log.txt文本文件里,rollingInterval: RollingInterval.Day代表每天生成一个文件,可以修改,比如每分钟Minute,下边测试就使用Minute
然后使用:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>();
启动项目,打开控制台:
可以看到,颜色都变了。再看一下目录:
里边就是输出的日志详情。