Другие источники логов
В предыдущих топиках источниками логов выступали объекты встроенных в S# классов. В S# предусмотрены возможности для случаев, когда источником логов должен служить Ваш собственный класс или же источник не должен быть связан с определенным классом, а обслуживать всё приложение. Для первого случая необходимо реализовать в Вашем классе интерфейс ILogSource или наследовать его от BaseLogReceiver. Во второй ситуации можно использовать источник TraceSource, использующий систему трассировки .NET. Как это сделать показано в примере Samples/Misc/SampleLogging.
Пример SampleLogging
Создаем пользовательский класс, наследующий от BaseLogReceiver.
private class TestSource : BaseLogReceiver { }
Создаем LogManager и декларируем переменную пользовательского класса.
private readonly LogManager _logManager = new LogManager(); private readonly TestSource _testSource;
Добавляем источники логов.
// пользовательский класс в качестве источника _logManager.Sources.Add(_testSource = new TestSource()); // система трассировки .NET в качестве источника _logManager.Sources.Add(new StockSharp.Logging.TraceSource());
Добавляем "слушателей" логов.
// выводим логи в окно Monitor _logManager.Listeners.Add(new GuiLogListener(Monitor)); // выводим логи в файл _logManager.Listeners.Add(new FileLogListener { FileName = "logs", });
Добавляем сообщения логирования пользовательского класса. Уровень логирования выбирается случайным образом.
var level = RandomGen.GetEnum<LogLevels>(); switch (level) { case LogLevels.Inherit: case LogLevels.Debug: case LogLevels.Info: case LogLevels.Off: _testSource.AddInfoLog("{0} (source)!!!".Put(level)); break; case LogLevels.Warning: _testSource.AddWarningLog("Warning (source)!!!"); break; case LogLevels.Error: _testSource.AddErrorLog("Error (source)!!!"); break; default: throw new ArgumentOutOfRangeException(); }
Добавляем сообщения трассировки.
var level = RandomGen.GetEnum<LogLevels>(); switch (level) { case LogLevels.Inherit: case LogLevels.Debug: case LogLevels.Info: case LogLevels.Off: Trace.TraceInformation("{0} (trace)!!!".Put(level)); break; case LogLevels.Warning: Trace.TraceWarning("Warning (trace)!!!"); break; case LogLevels.Error: Trace.TraceError("Error (trace)!!!"); break; default: throw new ArgumentOutOfRangeException(); }
Результат работы примера.