如何使用Serilog和ElasticSearch使用不同的日志类型

时间:2018-05-08 13:30:18

标签: c# elasticsearch serilog elasticsearch-net

我目前正在尝试更改系统配置以使用 Serilog 而不是使用FileBeat作为LogStash的托运人

我们还在各种查询中使用日志类型字段(在FileBeat配置文件中很容易配置)以及在Elastic上索引日志。

问题是当使用Serilog时我们得到默认类型 logevent ,而我找不到我可以配置它的位置。 我想有一个选项来确定每个Serilog实例的特定日志类型。 目前我设法只为所有日志提供了同类型。

我的Serilop配置是:

        var path = GetLogPath();
        var logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .Enrich.WithMachineName()
            .Enrich.WithProperty("RequestId", Guid.NewGuid())
            .WriteTo.RollingFile(
                pathFormat: path,
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}] [{RequestId}] {Message}{NewLine}{Exception}", buffered: false, shared: true);
        logger.WriteTo.Elasticsearch(
                new ElasticsearchSinkOptions(new Uri(this.configurationService.ElasticSearchUrl())));

如何更改日志类型?

修改

经过一些调查后,我发现我想更改LoggerConfiguration中的 typeName 字段,似乎我只能通过AppConfig文件来执行此操作,如果我愿意的话更改它,更改将影响所有记录器实例。

我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

只需为Elasticsearch接收器使用另一个重载:

var path = GetLogPath();
var logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .Enrich.WithMachineName()
    .Enrich.WithProperty("RequestId", Guid.NewGuid())
    .WriteTo.RollingFile(
        pathFormat: path,
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}] [{RequestId}] {Message}{NewLine}{Exception}", buffered: false, shared: true);
logger.WriteTo.Elasticsearch(
        this.configurationService.ElasticSearchUrl(), typeName: "type");

因此您不必在appsettings中指定typeName,也不会影响所有实例。

答案 1 :(得分:1)

更新答案

要向记录器添加属性和值,可以使用Contextual logging and Enrichment

内容记录器

  

将上下文属性附加到日志事件的最简单,最直接的方法

首先初始化您的记录器:

Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings().CreateLogger();

然后您可以创建上下文记录器:

// adding Log Context
var StudentLogger = Log.Logger.ForContext<Student>();

StudentLogger.Error(/* log message */);

或者您可以使用关联日志条目:

// correlation Log Entries
var orderId = "some value";
var corrLog = Log.Logger.ForContext("orderId", orderId)

corrLog.Error(/* log message */);

<强>富集

  

在某些情况下,我们希望记录器创建的每个事件都可以携带   相同的,固定的,财产价值。应用程序示例是其中之一   这些

     

Serilog在a级别提供Enrich.WithProperty()   LoggerConfiguration:

Log.Logger = new LoggerConfiguration()
    .Enrich.WithProperty("Application", "e-Commerce")
    .Enrich.WithProperty("Environment", ConfigurationManager.AppSettings["Environment"])
    // Other logger configuration

原始答案

有两种配置Serilog的方法:

使用API​​ (需要serilog.sinks.elasticsearch包):

var loggerConfig = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200") ){
         AutoRegisterTemplate = true,
 });
var logger = loggerConfig.CreateLogger();

Serilog Documentation

使用AppSettings中的配置(除serilog.sinks.elasticsearch外还需要Serilog.Settings.AppSettings)

这样,您将所有设置都放在AppSetting文件中,例如

<appSettings>
    <add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/>
    <add key="serilog:write-to:Elasticsearch.nodeUris" value="http://localhost:9200;http://remotehost:9200"/>
    <add key="serilog:write-to:Elasticsearch.indexFormat" value="custom-index-{0:yyyy.MM}"/>
    <add key="serilog:write-to:Elasticsearch.templateName" value="myCustomTemplate"/>
  </appSettings>

告诉serilog从appSettigns

读取配置
Log.Logger = new LoggerConfiguration()
  .ReadFrom.AppSettings()
  ... // Other configuration here, then
  .CreateLogger()

请参阅:AppSettingElasticSearch Configure Sink

我不确定您指的是哪种日志事件类型?在我的例子中,我在记录错误的同时传递了对象类型:

catch (Exception ex)
{
    Logger.Error(ex, string.Format("Exception occured in Controller: {0}, Action: Post.", this.GetType()), this.GetType());

答案 2 :(得分:0)

另一种选择是创建一个全局加载器静态类。定义多个 ILogger 字段,一个用于错误,另一个用于诊断等等。配置静态构造函数中的字段。然后创建几个公共方法,WriteError()、WriteDebug()、WriteInfo() 等等。例如,当从 WriteDebug(logDetail) 方法调用 ILogger.Write(LogEventLevel.Debug, logDetail) 时,您将能够决定 LogEventLevel。