Как иметь разные типы журналов, используя Serilog и ElasticSearch - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я пытаюсь изменить конфигурацию нашей системы для работы с Serilog ( вместо работы с FileBeat в качестве отправителя в LogStash )

Мы также работаем с полем log type (которое легко настроить в файле конфигурации 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())));

Как мне изменить тип журнала?

EDIT

После некоторого расследования я обнаружил, что я предполагаю изменить typeName , хранящийся в LoggerConfiguration , и кажется, что я могу сделать это только через файл AppConfig, который снова происходит, если я изменит его, изменение коснется всех экземпляров регистратора.

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Просто используйте другую перегрузку для раковины 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");

, поэтому вам не нужно указывать typeName в настройках приложения, и это также не повлияет на все экземпляры.

0 голосов
/ 13 мая 2018

Обновленный ответ

Чтобы добавить свойства и значения в ваш регистратор, вы можете использовать Контекстное ведение журнала и обогащение

Контекстный регистратор

Самый простой и прямой способ присоединения контекстных свойств к событию журнала

Сначала инициализировал ваш логгер:

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 предоставляет Enrich.WithProperty () на уровне Конфигурация Logger для этого:

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

Использование конфигурации из AppSettings (требуется Serilog.Settings.AppSettings в дополнение к serilog.sinks.elasticsearch)

Таким образом, вы помещаете все свои настройки в файл 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()

См .: Настройка приложений и ElasticSearch Configure Sink

Я не уверен, к какому типу событий журнала вы обращаетесь? В моем случае я передаю тип объекта во время регистрации ошибок:

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