Логирование дочерних объектов

Логирование дочерних объектов


Добрый день! Пытаюсь разобраться с логированием. А точнее как сделать что бы в окне MonitorWindow выводились дочерние объекты ILogSource? Что бы можно было просматривать их логи отдельно. В конструкторе главного окна делаю следующее:

        public MainWindow()
        {
            InitializeComponent();
            LogLevel = LogLevels.Verbose;
            LogManager = new LogManager();
            LogManager.Sources.Add(this);
            TestLogSourceWindow = new TestLogSourceWindow();
            TestLogSourceWindow.Parent = this;
            TestLogSourceWindow.LogLevel = LogLevel;
            LogManager.Sources.Add(TestLogSourceWindow);
            MonitorWindow = new MonitorWindow();
            LogManager.Listeners.Add(MonitorWindow);
        }

В дочернем окне TestLogSourceWindow вызываю событие Log:

Log?.Invoke(new LogMessage(this, CurrentTime, LogLevels.Info, "Сообщение дочернего окна"));

Но на событие нет подписки. Разве при добавлении ILogSource в LogManager он не подписывается на событие Log? Свойство ILogSource.Parent устанавливает родителя дочернему объекту? Помогите реализовать такую задачу. Примеров по логированию нет.




Спасибо:


Support

Фотография
Дата: 15.02.2018
Ответить


Добрый день.

Пример легирование https://github.com/StockSharp/StockSharp/tree/master/Samples/Common/SampleLogging

Пришлите ваш код для анализа.

Спасибо:

Константин

Фотография
Дата: 17.02.2018
Ответить


Код главного окна

    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, ILogSource
    {
        public TestSourceWindow TestSourceWindow;
        private readonly LogManager _logManager = new LogManager();
        public Guid Id { get; }
        public ILogSource Parent { get; set; }
        public LogLevels LogLevel { get; set; }
        public DateTimeOffset CurrentTime => DateTimeOffset.Now;
        public bool IsRoot { get; }
        public MonitorWindow MonitorWindow { get; private set; }

        public event Action<LogMessage> Log;

        public MainWindow()
        {
            InitializeComponent();
            this.LogLevel = LogLevels.Verbose;
            _logManager = new LogManager();
            _logManager.Sources.Add(this);

            TestSourceWindow = new TestSourceWindow();
            TestSourceWindow.Parent = this;
            TestSourceWindow.LogLevel = LogLevel;
            _logManager.Sources.Add(TestSourceWindow);

            MonitorWindow = new MonitorWindow();
            _logManager.Listeners.Add(MonitorWindow);
            MonitorWindow.Show();

            Loaded += MainWindow_Loaded;
        }

        /// <summary>
        /// Выводим 10 сообщений главного окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            for (var i = 0; i < 10; i++)
            {
                var level = RandomGen.GetEnum<LogLevels>();

                switch (level)
                {
                    case LogLevels.Verbose:
                    case LogLevels.Inherit:
                    case LogLevels.Debug:
                    case LogLevels.Info:
                    case LogLevels.Off:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение главного окна {level}"));
                        break;
                    case LogLevels.Warning:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение главного окна {level}"));
                        break;
                    case LogLevels.Error:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение главного окна {level}"));
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }

            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            TestSourceWindow.Show();
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }

    }

Код дочернего окна:

    /// <summary>
    /// Логика взаимодействия для TestSourceWindow.xaml
    /// </summary>
    public partial class TestSourceWindow : Window, ILogSource
    {
        public Guid Id { get; }
        public LogLevels LogLevel { get; set; }
        public DateTimeOffset CurrentTime => DateTimeOffset.Now;
        public bool IsRoot { get; }
        public ILogSource Parent { get; set; }
        public event Action<LogMessage> Log;

        public TestSourceWindow()
        {
            InitializeComponent();
            Loaded += TestSourceWindow_Loaded;
        }

        /// <summary>
        /// Выводим 10 сообщений дочернего окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TestSourceWindow_Loaded(object sender, RoutedEventArgs e)
        {
            for (var i = 0; i < 10; i++)
            {
                var level = RandomGen.GetEnum<LogLevels>();

                switch (level)
                {
                    case LogLevels.Verbose:
                    case LogLevels.Inherit:
                    case LogLevels.Debug:
                    case LogLevels.Info:
                    case LogLevels.Off:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение дочернего окна {level}"));
                        break;
                    case LogLevels.Warning:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение дочернего окна {level}"));
                        break;
                    case LogLevels.Error:
                        Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение дочернего окна {level}"));
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }

            }
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }

Во вложении проект

WpfApp2.zip 11 KB (375)
Спасибо:

Support

Фотография
Дата: 21.02.2018
Ответить


Добрый день

Вам необходимо добавлять графические слушатели через специальных класс:

_logManager.Listeners.Add(new GuiLogListener(MonitorWindow));

И для каждого источника установить имя.

Спасибо:

Константин

Фотография
Дата: 26.02.2018
Ответить


Здравствуйте. Лог выводится. Еще нужно что бы в правой области выводились ссылки на источники логов как на скриншоте выше. И как их можно сделать вложенными? Код на GitHub

Спасибо:

Support

Фотография
Дата: 27.02.2018
Ответить


Добрый день

Лог выводит только те колонки которые можно выбрать в таблице.

Спасибо:

Константин

Фотография
Дата: 27.02.2018
Ответить


Здравствуйте. Прошу прощения, я не правильно выразился. Не в правой области, а в левой области нужно вывести ссылки на источники логов. И как их можно сделать вложенными?

Спасибо:

Support

Фотография
Дата: 28.02.2018
Ответить


Для этого нужно указать название у источника.

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy