Skip to content

Simple & fast logging library concept using .net.core 2.0

Notifications You must be signed in to change notification settings

kbacob/LoggingTest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logging lib + test

Ковырясь со своим веб-сервером, полез в мультипоточность, начал оптимизировать, всё нахрен поломал и наткнулся на проблемы с блокировками при протоколировании событий. Тот код, что был написан ранее, оказался вообще не способен как адеватно работать в мультипоточной среде, так и справляться с тысячами запросов на протоколирование в секунду. Конечно, скорее всего, мне такая производительность не понадобится, но ведь хочется попробовать... И, в целом, сотню тысяч строк переварило и скинуло в файл менее чем за 10 секунд.

Идея была следующая - делаем массив строк, одна строка - одно событие. Фоновая задача по мере возможности этот массив обрабатывает, скидывая данные на терминал, консоль debug или в файл. Или всё сразу. После обработки массив обрезается. Таким образом, если даже не успеваем всё показывать или записывать, ничего не теряется. Потом массив строк превратился в List<Tuple<DateTime, RecordType, string>>

Библиотечка умеет не особенно много:

  • вывод сообщений на терминал, в Debug-консоль dotnet/VisualStudio, в файл;
  • категоризация (Verbose, Warning, Error и т.п.) ну и фильтрация на этой основе;
  • выбор формата префикса, указывающего время события;
  • выбор формата префикса, указывающего категорию события
  • раскраска категорий событий при выводе сообщений на терминал;
  • сортировка событий по времени (оказалось нужно, когда в протокол спамит сразу сотня потоков);
  • небольшой возможный тюнинг.

Ну а по сути всё просто:

var Logging logging = new Logging("path/to/file") // достаточно и этого, всё что ниже - пример кастомизации
{
    level = Logging.Level.Verbose,
    receiver = Logging.Receiver.File | Logging.Receiver.Console,
    timeFormat = Logging.TimeFormat.ShortLocalized,
    intBufferLength = 200,
    intFlushSleepInterval = 1000,
    boolColorisedConsoleOutput = true,
    boolSortByTime = false
};
Logging.Debug("Ops");
Logging.Error("I dit it again");
Logging.Dispose(); // оказалось, так что нада. Финализатор ~ClassName автоматом не вызвается, эта хрень тоже.

Поскольку это не совсем библиотека а, скорее, проверка концепции - класс Logging и тестовая програмулина для него, лежат в едином файле Program.cs Обновлять здесь, наверное, не буду, потому что как-бы довёл дело до работающего состояния, а далее скопирую в основную библиотеку и буду править баги уже там.

Если код корявый - извиняйте, только учусь.

About

Simple & fast logging library concept using .net.core 2.0

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages