← 戻る

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

Добрый день! Пытаюсь разобраться с логированием. А точнее как сделать что бы в окне 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 устанавливает родителя дочернему объекту? Помогите реализовать такую задачу. Примеров по логированию нет.

コメント (7)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Support
Support

Добрый день.

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

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

Константин
Константин 著者

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

    /// <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();
        }
    }

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

Support
Support

Добрый день

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

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

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

Константин
Константин 著者

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

Support
Support

Добрый день

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

Константин
Константин 著者

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

Support
Support

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