.Net Core 5项目中日志组件Serilog将日志信息输出到ElasticSearch,然后可以在Kibana里查看。这个是比较常见的 *** 作。今天就来讲解下具体的代码实现。
前提:搭建好elk相关应用。
一、 代码实现
1、Nuget添加包:
Serilog.AspNetCoreSerilog.Extensions.LoggingSerilog.Sinks.Elasticsearch
2、Program里添加代码:
using Serilog;using Serilog.Sinks.Elasticsearch;
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog((ctx, config) => { config .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://121.12.13.28:9200")) { IndexFormat = "muxue-{0:yyyy.MM}", EmitEventFailure = EmitEventFailureHandling.RaiseCallback, FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate), AutoRegisterTemplate = true, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, //ModifyConnectionSettings = // conn => // { // conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true); // conn.BasicAuthentication("elastic", "U3G44HpM33316TyV74"); // return conn; // } }) .WriteTo.Console(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); }
-
Entich.FromLogContext 这里的作用将一些环境信息写入日志中
-
new ElasticsearchSinkOptions设置了ES的地址;
-
IndexFormat 默认是到天(logstash-{0:yyyy.MM.dd}),我修改成到月。不同IndexFormat的日志会存储在不同索引中 ;
-
EmitEventFailure 设置了当失败时调用FailureCallback
-
ModifyConnectionSettings这里需要设置了2个地方,一个是忽略证书,一个是设置了 BasicAuthentioncation,也就是账号密码 。若没有设置密码,则无需要配置。
这里需要动态配置的值,可以放配置文件里。
3、记录日志:
[ApiController] [Route("[controller]")] public class WeatherForecastController : Controllerbase { private readonly ILogger_logger; public WeatherForecastController(ILogger logger) { _logger = logger; } [HttpGet] public string Get() { _logger.LogInformation("我是info日志"); try { int xx = 0; int y = xx / xx; } catch (Exception ex) { _logger.LogError(ex, $"出现异常日志:{ex.Message}"); } return "ok"; } }
4、在Kibana中查看
4.1创建索引
若该索引没有创建,则需要创建一下;若已创建好,则不需要该 *** 作。
路径:Stack Management--》Index Patterns--》Create index pattern
选择Index patterns选项卡,点击Create Index patterns d出如下界面 。
(1)输入我们代码里设置的IndexFormat 值,如muxue-*作为 Index pattern name,这里我们使用了通配符。输入的同时,右边也会自动筛选出系统里已存在的数据,若这里出不来数据,则说明代码有问题。
(2)Time fieId选择了@timestamp,然后选择Create index pattern按钮。
4.2查看日志
选择Kibana左侧菜单中的Discover。
选择刚才我们创建了muxue-*
右侧就有详细的日志记录。
二、代码封装成组件
为了让业务项目代码更加简洁,我们一般将该代码封装成一个公共组件;可以供多个项目共同使用,并且后期的组件修改升级,业务代码只需要升级组件版本即可,而无需关注代码细节。
1、将serilog的3个引用添加:
2、创建一个静态类:
////// Serilog 日志拓展 /// public static class SerilogHostingExtensions { ////// 添加默认日志拓展-1 /// /// /// ///IWebHostBuilder public static IWebHostBuilder UseSerilogDefault(this IWebHostBuilder builder) { builder.UseSerilog((context, config) => { string WriteToname = context.Configuration.GetSection("Serilog:WriteTo:0:Name").Value; if (string.IsNullOrWhiteSpace(WriteToName) || WriteToname != "Elasticsearch") { config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{newline}{Exception}") .WriteTo.File(Path.Combine(AppContext.baseDirectory, "logs", "application.log"), LogEventLevel.Verbose, rollingInterval: RollingInterval.Day, retainedFileCountLimit: null, encoding: Encoding.UTF8); } else { var esAgr = context.Configuration.GetSection("Serilog:WriteTo:0:Args"); string esUri = esAgr.GetSection("nodeUris").Value; string indexFormat = esAgr.GetSection("indexFormat").Value; config .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .MinimumLevel.Override("System", LogEventLevel.Warning) .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esUri)) { IndexFormat = indexFormat, EmitEventFailure = EmitEventFailureHandling.RaiseCallback, FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate), AutoRegisterTemplate = true, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, //ModifyConnectionSettings = // conn => // { // conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true); // conn.BasicAuthentication("elastic", "U3G44HpMwQv3Y5tq916TyV74"); // return conn; // } }) .WriteTo.Console(); } }); return builder; } ////// 添加默认日志拓展-2 /// /// /// ///public static IHostBuilder UseSerilogDefault(this IHostBuilder builder) { builder.UseSerilog((context, config) => { string WriteToname = context.Configuration.GetSection("Serilog:WriteTo:0:Name").Value; if (string.IsNullOrWhiteSpace(WriteToName) || WriteToname != "Elasticsearch") { config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{newline}{Exception}") .WriteTo.File(Path.Combine(AppContext.baseDirectory, "logs", "application.log"), LogEventLevel.Verbose, rollingInterval: RollingInterval.Day, retainedFileCountLimit: null, encoding: Encoding.UTF8); } else { var esAgr = context.Configuration.GetSection("Serilog:WriteTo:0:Args"); string esUri = esAgr.GetSection("nodeUris").Value; string indexFormat = esAgr.GetSection("indexFormat").Value; config .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esUri)) { IndexFormat = indexFormat, EmitEventFailure = EmitEventFailureHandling.RaiseCallback, FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate), AutoRegisterTemplate = true, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, //ModifyConnectionSettings = // conn => // { // conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true); // conn.BasicAuthentication("elastic", "U3G44HpMwQv3Y5tq916TyV74"); // return conn; // } }) .WriteTo.Console(); } }); return builder; } }
将一些值放配置文件里。
3、配置文件内容:
{ "Serilog": { "WriteTo": [ { "Name": "Elasticsearch", "Args": { "nodeUris": "http://110.120.130.140:9200/", "indexFormat": "muxue-api-{0:yyyy.MM}" } } ] } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)