Журнал
LogMonitorWidget показывает журнал работы: слева дерево источников, справа таблица сообщений выбранного источника и всего его поддерева. Сообщение хранится один раз и несёт идентификатор написавшего его источника, а число хранимых строк ограничено.

Создание и обновление
import {
LogLevels,
LogMonitorWidget,
type TradingHost,
} from '@stocksharp/trading-controls';
declare const host: TradingHost;
const log = LogMonitorWidget.create(
document.querySelector<HTMLElement>('#log')!,
{},
{
host,
maxMessages: 20_000,
},
);
log.setSources([
{ id: 'connector', name: 'Connector' },
{ id: 'strategy-1', name: 'SMA', parentId: 'connector' },
]);
log.append([{
id: 1,
time: Date.now(),
level: LogLevels.Warning,
sourceId: 'strategy-1',
message: 'Order rejected: not enough funds',
}]);
log.select('connector');
Из зависимостей обязателен только host: журнал пишут, а не действуют по нему, поэтому обработчиков контрол не требует. Остальные необязательны:
| Зависимость | Умолчание | Назначение |
|---|---|---|
maxMessages |
5000 |
Сколько сообщений хранить. Лишние отбрасываются с начала списка. |
chrome |
true |
Рисовать ли собственный заголовок с кнопкой закрытия. Хост, который сам подписывает панель и закрывает её (например, вкладкой дока), передаёт false. |
sources |
true |
Показывать ли дерево источников при создании. Это только начальное состояние: дерево возвращается из контекстного меню таблицы или вызовом showSources. |
setSources передаёт список источников целиком: исчезнувший источник пропадает из дерева, а выделение при этом сбрасывается на «все источники». append добавляет только что записанное, clear забывает все сообщения, оставляя дерево источников на месте.
Статическое свойство LogMonitorWidget.TYPE содержит идентификатор контрола logMonitor.
Источники и фильтры
Источник объявляет своего родителя (parentId), а не потомков, и может появиться раньше родителя. Дерево собирается из того, что уже пришло: источник с неизвестным родителем становится корнем, цикл разрывается по первому узлу. Строки дерева плоские, вложенность показана отступом; верхняя строка выбирает все источники сразу.
Одновременно действуют три фильтра: набор включённых уровней, строка поиска по тексту сообщения (без учёта регистра) и выбранное поддерево источников. Уровни переключаются кнопками панели инструментов — error, warning, info, debug, verbose из объекта LogLevels; в узкой колонке уровень показан буквой E, W, I, D, V. Метод visible возвращает то, что осталось после всех фильтров.
Таблица состоит из колонок источника, времени, уровня и сообщения, отсортирована по времени по возрастанию и поддерживает множественное выделение, сортировку, скрытие колонок, фильтры и контекстное меню. В меню добавлен пункт показа дерева источников. Кнопка панели инструментов выгружает видимые строки в XLSX; в выгрузку попадают время, отформатированное host.presentation.timeText, и полное имя уровня, а не буква.
Что делает хост
Контрол берёт у хоста переводы (host.t), формат времени (host.presentation.timeText) и обработку закрытия панели (host.close), а также регистрируется через host.register и снимается с регистрации в dispose. Собственных настроек в host.preferences он не хранит и состояние экземпляра не сохраняет: второй аргумент create принимается ради единообразия, но не читается. Сбор сообщений, их доставку и восстановление положения панели обеспечивает хост.
Публичные методы
setSources(sources)— заменить список источников.append(messages)— добавить сообщения с учётом ограниченияmaxMessages.clear()— очистить сообщения.select(sourceId)— показать поддерево источника;nullпоказывает все.visible()— сообщения, оставшиеся после всех фильтров.sourcesShown()— показано ли дерево источников.showSources(on)— показать или скрыть дерево; выбранный фильтр по источнику при этом сохраняется.dispose()— освободить ресурсы.