Serilog ничего не выводит - PullRequest
1 голос
/ 27 марта 2020

Использование. Net 4.6 У меня есть класс c Вспомогательный класс Serilog - я разобрался с основами следующим образом:

public static class SerilogHelper
    {
        private static ILogger log;

        private static ILogger CreateLogger()
        {
            if (log == null)
            {
                string levelString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
                                    "BizTalk.Common", "serilog.minimum-level");

                SerilogLevel level = (SerilogLevel)Enum.Parse(typeof(SerilogLevel), levelString);

                string conString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
                                    "BizTalk.Common", "serilog.connection-string");

                var levelSwitch = new LoggingLevelSwitch();
                levelSwitch.MinimumLevel = (Serilog.Events.LogEventLevel)level;

                log = new LoggerConfiguration()
                    .MinimumLevel.ControlledBy(levelSwitch)
                    .WriteTo.MSSqlServer(connectionString: conString, tableName: "Serilog", autoCreateSqlTable: true)
                    .WriteTo.RollingFile("log-{Date}.txt")
                    .CreateLogger();
            }

            return log;
        }

        public static void WriteString(string content)
        {
            var logger = CreateLogger();
            logger.Information(content);
        }

У меня есть следующий модульный тест:

        [TestMethod]
        public void UN_TestSerilog1()
        {  
            Common.Components.Helpers.SerilogHelper.WriteString("Simple logging");
        }

Я прошел через отладчик, чтобы убедиться, что переменная «level» установлена ​​правильно - это перечисление с именем «Debug» со значением 1.

Хотя Sql Серверная таблица создана хорошо, я не вижу вставленных строк или какого-либо файла журнала TXT. Я также пытался вызвать logger.Error (content) , но все еще не выводил.

Я уже использовал тот же вспомогательный код ранее на другом сайте / проекте, и он работал нормально. Где я go ошибся на этот раз?

1 Ответ

3 голосов
/ 27 марта 2020

Serilog.Sinks.MSSqlServer является приемником «periodi c batching», а по умолчанию ожидает 5 секунд, прежде чем отправлять журналы в базу данных . Если ваш тест заканчивается до того, как приемник сможет записать сообщения в базу данных, они просто теряются ...

Вы должны убедиться, что утилизировали регистратор до того, как завершится тестовый запуск , чтобы заставить приемник гриппа sh журналы в базе данных в этой точке. См. Жизненный цикл регистраторов .

((IDisposable) logger).Dispose();

Конечно, если вы совместно используете экземпляр журнала stati c в нескольких тестах, вы не можете просто расположить регистратор внутри одного тестирование означает, что следующий тест, который будет запущен, не будет иметь регистратора для записи ... В этом случае вам следует взглянуть на поддержку инфраструктуры тестирования для выполнения кода один раз, до запуска запуска набора тестов и еще раз, когда закончится тестовый набор.

Я предполагаю, что вы используете MSTest (из-за TestMethod), так что вы, вероятно, захотите изучить AssemblyInitialize и AssemblyCleanup, что даст вам возможность инициализировать регистратор для всех тестов и очистить после завершения всех тестов ...


Возможно, вас заинтересуют другие идеи для устранения неполадок в Serilog: Serilog MS SQL Раковина не записывает журналы в базу данных

...