目录
结构化日志
Serilog使用
集中化日志
集中日志服务
Exceptionless
控制台项目
总结
结构化日志
结构化日志比普通文本更利于日志的分析,比如统计“邮件发送失败”错误发生了多少次。
NLog也可以配置结构化日志,不过配置麻烦,推荐用Serilog。
Serilog使用
- NuGet安装:Serilog.AspNetCore。
-
static void Main(string[] args) {ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder =>{Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().Enrich.FromLogContext().WriteTo.Console(new JsonFormatter()).CreateLogger();logBuilder.AddSerilog();});services.AddScoped<Test2>();using (ServiceProvider sp = services.BuildServiceProvider()){Test2 test2 = sp.GetRequiredService<Test2>();test2.Test();} }
- 要记录的结构化数据通过占位符来输出:logger.LogWarning("新增用户 {@person}",new { Id=3,Name="zack"});
-
class Test2 {private readonly ILogger<Test2> logger;public Test2(ILogger<Test2> logger){this.logger = logger;}public void Test(){User user = new User { Name = "admin", Email = "123@qq.com" };logger.LogDebug("注册用户{@person}", user);logger.LogDebug("注册用户", user);} }class User {public string Name { get; set; }public string Email { get; set; } }
- 同样可以输出到文件、数据库、MongoDB等。
集中化日志
集群化部署环境中,有N个服务器,如果每个服务器都把日志记录到本地文件,不便于查询、分析。需要把日志保存到集中化的日志服务器中。
集中日志服务
- 使用NLog、Serilog等可以把日志记录到数据库、MongoDB等地方,就可以实现“结构化、集中日志服务”,不过需要自己编写日志分析程序。
- 公有云厂商一般都提供了日志云服务,都带分析功能,都有对应Serilog插件,即使没有提供,开发一个插件也不麻烦。
- 如果没有用云平台或者想自己控制日志服务,可以使用Exceptionless或者ELK等。
- Exceptionless、ELK即提供了现成的云服务,也提供了自己部署(Self Hosting)的模式。由于网速等原因,云服务不符合中国的要求,不过可以试用一下,看是否满足要求,再自己部署。
Exceptionless
控制台项目
- 到Exceptionless官网注册、登录后,新建一个项目,按照向导输入公司名字、项目名字后,网站就会给出一个apiKey。
- 项目NuGet安装Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless。
- 在程序的最开始加上一句ExceptionlessClient.Default.Startup("拿到的apiKey"),然后Serilog的配置中加上一句:.WriteTo.Exceptionless()
总结
- 普通项目用NLog输出到文本文件即可,根据需要设定过滤、分类规则。
- 集群部署的项目用Serilog+“集中式日志服务”。如果需要记录结构化日志,再进行结构化输出。
- 如果用云服务的就够了,就用云服务的,免得自己部署;如果想自己控制日志数据就用自部署Exceptionless或者ELK(难度大)等。