Serilog MSSQL Sink не записывает логи в базу данных - PullRequest
0 голосов
/ 23 октября 2018

Я создал библиотеку классов .Net (4.6.2) и создал реализацию serilog, которая вызывается другими интерфейсами, такими как консольное приложение.Теперь, когда я использую тип приемника файлов, журналы записываются в файлы, но с приемником MSSQL этого не происходит.Таблицы журналов создаются с опциями столбцов, которые предоставляются с опциями autoCreateTable

ILogger logger = new LoggerConfiguration()
      .WriteTo.MSSqlServer(connectionString,
                           tableName,
                           autoCreateSqlTable: autoCreateSqlTable,
                           restrictedToMinimumLevel: LogEventLevel.Verbose,
                           columnOptions: GetSQLSinkColumnOptions(),
                           batchPostingLimit: batchPostingLimit)          
      .CreateLogger();

Я еще включил самозавершение журнала serilog, но никакие исключения не отображаются.Не найдено ни одного полезного решения для того же.

Однако создается таблица журнала.Я проверил разрешения для пользователя, и он также имеет правильные разрешения.

Ниже приведен снимок кода.

public static class GenericLogger
{

    private static ILogger _usageLogger;
    private static ILogger _errorLogger;

    static GenericLogger()
    {
        var logTypes = LogConfigurationHelper.GetLogTypes();
        if (logTypes != null && logTypes.Count > 0)
        {
            foreach (var logType in logTypes)
            {
                ConfigureLogger(logType.Id); // Intitalizes logs based on  
//configuration.


            }
        }

        Serilog.Debugging.SelfLog.Enable(msg =>
        {
            Debug.Print(msg);
            Debugger.Break();
        });

    }

    ///The write log function
    ///
    public static void WriteError(LogDetail infoToLog)
    {
        if (infoToLog.Exception != null)
        {
            infoToLog.Message = GetMessageFromException(infoToLog.Exception);
        }

        _errorLogger.Write(LogEventLevel.Information,
                 "{Timestamp}{Product}{Layer}{Location}{Message}" +
                "{Hostname}{UserId}{UserName}{Exception}{ElapsedMilliseconds}" +
                "{CorrelationId}{CustomException}{AdditionalInfo}",
               infoToLog.TimeStamp, infoToLog.Product, infoToLog.Layer, infoToLog.Location, infoToLog.Message,
               infoToLog.Hostname, infoToLog.UserId, infoToLog.UserName, infoToLog.Exception?.ToCustomString(),
               infoToLog.ElapsedMilliseconds, infoToLog.CorrelationId, infoToLog.CustomException,
               infoToLog.AdditionalInfo);
            // To add ((IDisposable) _errrorLog).Dispose();
    }

}

1 Ответ

0 голосов
/ 24 октября 2018

Ниже приведены некоторые идеи, которые могут помочь вам устранить неполадки:


Вы тестируете только с событиями Verbose или Debug?Это может быть причиной.Вы не указали глобальный минимальный уровень для Serilog (вы указали только минимальный уровень для приемника, который действует как фильтр), а минимальный по умолчанию равен Information, что означает Verboseи Debug игнорируются ... Укажите глобальный MinimumLevel для Serilog:

ILogger logger = new LoggerConfiguration()
      .MinimumLevel.Verbose()
      .WriteTo.MSSqlServer(connectionString,
                           tableName,
                           autoCreateSqlTable: autoCreateSqlTable,
                           restrictedToMinimumLevel: LogEventLevel.Verbose,
                           columnOptions: GetSQLSinkColumnOptions(),
                           batchPostingLimit: batchPostingLimit)          
      .CreateLogger();

Вы утилизируете свой регистратор?Serilog.Sinks.MSSqlServer - это «периодический приемник дозирования», поэтому вам нужно убедиться, что вы расположили регистратор в конце, чтобы заставить его сбрасывать журналы в базу данных.См. Жизненный цикл регистраторов .

((IDisposable) logger).Dispose();

Даже если вы используете 1 для batchPostingLimit, , по умолчанию 5 секунд перед отправкой журналов вбаза данных .Если ваше приложение закрывается до этого периода, и вы не утилизируете регистратор, сообщения теряются.


Для устранения неполадок используйте AuditTo вместо WriteTo (и удалите batchPostingLimit, что не применимо для аудита).WriteTo безопасен и будет есть любые исключения, в то время как AuditTo позволит исключениям всплыть.

ILogger logger = new LoggerConfiguration()
    .AuditTo.MSSqlServer(
        connectionString,
        tableName,
        restrictedToMinimumLevel: LogEventLevel.Verbose,
        autoCreateSqlTable: true)
    .CreateLogger();

Конечно, когда вы поймете, что не так, вернитесь к WriteTo.


...