我曾经通过FileBeat-LogStash管道将数据发送到Elasticsearch。处理了我通过log4net创建的日志,对其进行了变异,并将必填字段发送给了elastic。
现在,我想通过删除FileBeat和Logstash并使用Serilog及其elasticsearch sink来代替逻辑。
为了扩大图片的范围,我有一个API端点,该端点可以接收需要记录到文本文件中的请求,因此我需要一个File接收器。在代码的更深处,我的业务逻辑将利用接收到的数据,并创建一个对象,然后我需要将该对象提取为具有 flex 的索引。
最好的方法是什么,拥有一个Serilog实例并使用某种过滤或拥有两个Serilog实例?我更倾向于装饰(丰富)我的案例,然后通过过滤(一个Serilog实例)使用接收器,但是由于我是Serilog的新手,所以我不知道如何设置整个内容。
缩写的代码是这样的,
我的 Controller 类:

public class RequestController : ControllerBase
{
    private readonly BLService _service = new BLService(Log.Logger);

    [Route("Test")]
    [HttpPost]
    public IActionResult Test([FromBody]SampleRequest request)
    {
        var logId = Guid.NewGuid().ToString();
        using (LogContext.PushProperty("LogId", logId))
            Log.Information("{@request}", request);

        var tran = new SampleTran
        {
            SampleTranType = "Test",
            SampleTranId = request.Id,
            EventTime = DateTime.Now
        };

        _service.ProcessTransaction(tran);

        return new OkResult();
    }
}

在我的服务中,我要添加具有恒定值"Type""ElkData"属性,然后可以对其进行过滤:
public class BLService
{
    private readonly ILogger _log;

    public BLService(ILogger logger)
    {
        _log = logger.ForContext("Type", "ElkData");
    }

    public void ProcessTransaction(SampleTran transaction)
    {
        var elkData = DoSomeStuffAndReturnElkTransactionToStore(transaction);
        _log.Information("{@ElkData}", elkData );
    }
}
值得注意的是,我的文本文件应仅包含原始请求(没有elasticsearch数据)。到目前为止,我正在将所有内容写入文件,我的appsettings.json看起来像这样:
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\DEV\\Logs\\mylog-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-ddTHH:mm:ss.fff zzz} [{Level:u3}] {Message:j}{NewLine}{Exception}"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ]
  },
  "AllowedHosts": "*"
}
我需要使用过滤来添加 flex 部分,对吗?任何帮助,将不胜感激。

最佳答案

这是我设法完成所需工作的方式:
我使用ForContext丰富了我的日志项目。因此,在 Controller 中,我使用了:

var requestLog = Log.ForContext("Type", "Request");
requestLog.Information("Request: {@request}", request);//this needs to go to the log file
BLservice中的代码保持不变,并且在appsettings.json中将过滤描述为:
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByExcluding",
                "Args": {
                  "expression": "Type = 'ElkData'"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "C:\\DEV\\Logs\\mylog-.txt",
                  "rollingInterval": "Day",
                  "outputTemplate": "{Timestamp:yyyy-MM-ddTHH:mm:ss.fff zzz} [{Level:u3}] {Message:j}{NewLine}{Exception}",
                  "shared": true
                }
              }
            ]
          }
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByIncludingOnly",
                "Args": {
                  "expression": "Type = 'ElkData'"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "Elasticsearch",
                "Args": {
                  "nodeUris": "<your elastic url>",
                  "TypeName": "_doc",
                  "IndexFormat": "serilog_data",
                  "InlineFields":  true,
                  "BufferBaseFilename": "C:\\DEV\\Logs\\elk_buffer"
                }
              }
            ]
          }
        }
      }
    ]
  }
}
因此,该文件将包含所有已注销的内容,但带有"Type = 'ElkData'"扩充功能的日志除外,这些最终将以elasticsearch索引结尾。
希望这种简单的方法有一天能帮助一些serilog新手

关于elasticsearch - Serilog输出到文件和Elasticsearch的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63886412/

10-12 17:43