1.日志信息源
ILogging
ILogging
//nuget包
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
//控制器
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<string> _logger;
public WeatherForecastController(ILogger<string> logger)
{
_logger = logger;
}
public void ILogger()
{
//_logger.LogInformation("f");
_logger.LogDebug("连接数据库成功");
_logger.LogDebug("开始查找数据");
_logger.LogWarning("查找失败..重试第一次");
_logger.LogWarning("查找失败..重试第二次");
_logger.LogError("失败");
// _logger.LogCritical("byby");
try
{
System.IO.File.ReadAllText("G:/f.txt");
}
catch (Exception ex)
{
_logger.LogError(ex,"异常对象");
_logger.LogWarning(ex, "异常对象");
}
}
}
//ILogger<WeatherForecastController> T为一个引用类型的对象如string等,int不行,一般写当前类名,会出现在日志中方便定位
//并且已经自动添加了服务,无需自己再写,框架中已经写好并在Program的Host.CreateDefaultBuilder(args)引用appsettings.Development.json文件启动。并且再写也不会生效,会被框架覆盖,无法设置最小输出水平
services.AddLogging(logbuilder => {
logbuilder.AddConsole();
logbuilder.SetMinimumLevel(LogLevel.Debug);
});
//所以输出水平只能由appsettings.Development.json文件决定
{
"Logging": {
"LogLevel": {
"Default": "Information", //修改为Debug即可
"Microsoft": "Warning", //Microsoft指的是类的命名空间
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
//不仅可以输出文字,还可以输出异常对象和描述
_logger.LogError(ex, "异常对象");
//可以配合logBuilder.AddEventLog()使用实现输入到本机windows事件查看器上
2.日志处理
Nlog
Serilog
Nlog
//nuget包
NLog.Extensions.Logging
//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(logbuilder => {
logbuilder.AddNLog();
});
}
//创建nlog.config文件(https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-5)
<?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-AspNetCore.txt">
.......
.......
</nlog>
//控制器
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<string> _logger;
public WeatherForecastController(ILogger<string> logger)
{
_logger = logger;
}
public void ILogger()
{
//_logger.LogInformation("f");
_logger.LogDebug("连接数据库成功");
_logger.LogDebug("开始查找数据");
_logger.LogWarning("查找失败..重试第一次");
_logger.LogWarning("查找失败..重试第二次");
_logger.LogError("失败");
// _logger.LogCritical("byby");
try
{
System.IO.File.ReadAllText("G:/f.txt");
}
catch (Exception ex)
{
_logger.LogError(ex,"异常对象");
_logger.LogWarning(ex, "异常对象");
}
}
}
// 需要安装nuget包NLog.Extensions.Logging
// 新建nlog.config文件看官网https://github.com/dotnet/aspnetcore/issues/27307
// nlog.config中会通过
// target:定义日志输出到哪个日志txt文本, 它的layout指定该文本的内容模板,archiveAboveSize指定每个文件的大小,maxArchiveFiles指定这个类型的文本最多同时存在几份
// rules:匹配每个日志文本中每条日志的格式规则,它的name指的是被记录日志的类的namespace+类名,minlevel指的是日志级别,writeTo指的是记录到哪个日志txt文本中,final指的是是否继续往下匹配
// target中的lifetimeConsole就是指往控制台输出,由于正常启动就已经会在控制台输出,所以使用了这个将在控制台看到两份输出
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:5000
Serilog
//nuget包
Serilog.AspNetCore
//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(logbuilder => {
Serilog.Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)// 日志调用类命名空间如果以 Microsoft 开头,覆盖日志输出最小级别为 Information,像是重写方法
.WriteTo.Console(new JsonFormatter()) //json格式
.WriteTo.File(Path.Combine(@"..\LogFiles\log.txt"), rollingInterval: RollingInterval.Day) //配置日志输出到文件,文件输出到LogFiles\log.txt中并且日记的生成周期为每天
.WriteTo.Exceptionless()//输出日志到Exceptionless对其进行集中化管理
.CreateLogger();
logbuilder.AddSerilog();
});
}
//控制器
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<string> _logger;
public WeatherForecastController(ILogger<string> logger)
{
_logger = logger;
}
public void ILogger()
{
User user = new User { Name = "admin", Email = "111qq.com" };
_logger.LogDebug("注册一个用户{@persopn}",user);
_logger.LogDebug("用户名:" + user.Name, "邮箱:" + user.Email);
}
}
https://gitee.com/zhang-yifei2020/class-2-web-api-class-notes/blob/master/%E5%BC%A0%E7%9B%8A%E9%A3%9E/2022-6-06-serilog%E6%97%A5%E5%BF%97%E5%92%8C%E8%AF%B7%E6%B1%82%E4%BC%A0%E5%8F%82%E8%A1%A5%E5%85%85/serilog%E6%97%A5%E5%BF%97.md
https://zhuanlan.zhihu.com/p/263815555
https://blog.csdn.net/Upgrader/article/details/88323907
3.各自优缺
# ILogging是NLog和Serilog的信息源,先由ILogging获取日志,再发送给NLog或Serilog进行整理、存储等操作。可以理解为NLog和Serilog只是对日志进行处理而已
# ILogging、NLog、Serilog的很多功能重合,不建议混用。
# NLog支持控制写入日志文本的最大字节和最多副本,并且有丰富的日志匹配规则,Serilog不清楚
# Serilog能对日志进行结构化,能够以json对象输出内容。NLog虽然也能但是配置太繁琐。
# 在分布式部署下,日志需要集中化管理方面,通常可以专门把日志放在共有的数据库、MongDB等地方,它们三者都可以实现。但更高效的是用Serilog输出到Exceptionless分析站点上