.Net Core 5 使用 Serilog记录日志并输出至ElasticSearch
.Net Core 5项目中日志组件Serilog将日志信息输出到ElasticSearch,然后可以在Kibana里查看。这个是比较常见的操作。今天就来讲解下具体的代码实现。前提:搭建好elk相关应用。一、代码实现1、Nuget添加包:Serilog.AspNetCoreSerilog.Extensions.LoggingSerilog.Sinks.Elasticsearch2、Program里
.Net Core 5项目中日志组件Serilog将日志信息输出到ElasticSearch,然后可以在Kibana里查看。这个是比较常见的操作。今天就来讲解下具体的代码实现。
前提:搭建好elk相关应用。
一、 代码实现
1、Nuget添加包:
Serilog.AspNetCore
Serilog.Extensions.Logging
Serilog.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<Startup>();
});
}
-
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<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> 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 弹出如下界面 。
(1)输入我们代码里设置的IndexFormat 值,如muxue-*作为 Index pattern name,这里我们使用了通配符。输入的同时,右边也会自动筛选出系统里已存在的数据,若这里出不来数据,则说明代码有问题。
(2)Time fieId选择了@timestamp,然后选择Create index pattern按钮。
4.2查看日志
选择Kibana左侧菜单中的Discover。
选择刚才我们创建了muxue-*
右侧就有详细的日志记录。
二、代码封装成组件
为了让业务项目代码更加简洁,我们一般将该代码封装成一个公共组件;可以供多个项目共同使用,并且后期的组件修改升级,业务代码只需要升级组件版本即可,而无需关注代码细节。
1、将serilog的3个引用添加:
2、创建一个静态类:
/// <summary>
/// Serilog 日志拓展
/// </summary>
public static class SerilogHostingExtensions
{
/// <summary>
/// 添加默认日志拓展-1
/// </summary>
/// <param name="hostBuilder"></param>
/// <param name="configAction"></param>
/// <returns>IWebHostBuilder</returns>
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;
}
/// <summary>
/// 添加默认日志拓展-2
/// </summary>
/// <param name="builder"></param>
/// <param name="configAction"></param>
/// <returns></returns>
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)