日志级别:Trace
< Debug
< Information
< Warning
< Error
< Critical
1、NuGet:Microsoft.Extensions.Logging
、Microsoft.Extensions.Logging.Console
。
2、DI注入:
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
logBuilder.AddConsole();
logBuilder.SetMinimumLevel(LogLevel.Debug);
});
3、需要记录日志的代码,注入ILogger<T>
即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误。然后调用LogInformation()
、LogError
等方法输出不同级别的日志,还支持输出异常对象。
完整代码:
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
logBuilder.AddConsole();
logBuilder.SetMinimumLevel(LogLevel.Debug);
});
services.AddScoped<LoginService>();
using (var sp = services.BuildServiceProvider())
{
LoginService loginService = sp.GetRequiredService<LoginService>();
loginService.Login();
}
}
}
internal class LoginService
{
private readonly ILogger<LoginService> _logger;
public LoginService(ILogger<LoginService> logger)
{
this._logger = logger;
}
public void Login()
{
_logger.LogInformation("info");
_logger.LogWarning("warning");
_logger.LogError("error");
_logger.LogError(new DirectoryNotFoundException(), "异常");
}
}
1、.NET没有内置文本日志提供者。第三方有Log4Net、NLog、Serilog等。
2、NuGet安装:NLog.Extensions.Logging
(using NLog.Extensions.Logging; )。项目根目录下建nlog.config
,注意文件名的大小写(考虑linux)。也可以是其他文件名,但是需要单独配置。约定大于配置。
nlog.config:
<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
<!--不指定绝对路径则打印到项目当前目录下-->
internalLogFile="console-example-internal.log"
internalLogLevel="Info" >
<!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="logfile" fileName="console-example.log"
layout="${longdate}|${level}|${message} |${all-event-properties} ${exception:format=tostring}" />
<target xsi:type="Console" name="logconsole"
layout="${longdate}|${level}|${message} |${all-event-properties} ${exception:format=tostring}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile,logconsole" />
</rules>
</nlog>
设置nlog.config
文件 如果较新则复制
3、增加logBuilder.AddNLog()
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
logBuilder.AddConsole();
//用了NLog之后不建议在这里设置日志级别
//logBuilder.SetMinimumLevel(LogLevel.Debug);
logBuilder.AddNLog();
});
services.AddScoped<LoginService>();
using (var sp = services.BuildServiceProvider())
{
LoginService loginService = sp.GetRequiredService<LoginService>();
loginService.Login();
}
}
}
运行结果:
结构化日志:比普通文本更利于日志的分析。 集中化日志:集群化部署环境中需要把日志保存到 集中化 的日志服务器中。
1、NuGet安装:Serilog.AspNetCore
2、编写代码:
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
logBuilder.AddSerilog();
});
运行结果:
3、要记录的结构化数据通过占位符来输出:
_logger.LogWarning("新增用户 {@person}", new { Id = 3, Name = "yyhh" });
Exceptionless提供了现成的云服务,也提供了自己部署(Self Hosting)的模式。由于网速等原因,云服务不符合开发的要求,不过可以试用一下,看是否满足要求,再自己部署。
1、登录https://exceptionless.com,选择对于的项目
我选择的是控制台应用。
2、项目NuGet安装Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless
3、在程序的最开始加上一句ExceptionlessClient.Default.Startup("拿到的apiKey")
,然后Serilog的配置中加上一句:.WriteTo.Exceptionless()
ExceptionlessClient.Default.Startup("1yZuP8PwQi9VV9U9AaCPkoujS9M1uRJN0EBxb6tG");//增加了这里
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.WriteTo.Exceptionless()//增加了这里
.CreateLogger();
logBuilder.AddSerilog();
});
services.AddScoped<LoginService>();
运行后结果: