Agent Skills
› lichtblick-suite/lichtblick
› panel-log
panel-log
GitHub高性能日志面板技能,基于react-window实现虚拟滚动与动态行高缓存。支持ROS1/2及Foxglove格式归一化,提供按级别和文本的高效过滤,具备智能自动滚动功能,适用于大规模日志数据展示。
Trigger Scenarios
查看或调试系统日志
分析ROS或Foxglove格式的日志数据
需要高性能渲染大量日志条目
对日志进行级别筛选或关键词搜索
Install
npx skills add lichtblick-suite/lichtblick --skill panel-log -g -y
SKILL.md
Frontmatter
{
"name": "panel-log",
"description": "Deep Log panel knowledge: react-window VariableSizeList virtualization, dynamic measured row heights, autoscroll\/tail behavior, multi-format log normalization, and level\/text filtering."
}
Panel Log Skill
A high-performance log viewer with virtualized rendering and filtering.
Structure
panels/Log/
├── index.tsx # main panel, filter state, topic selection, settings
├── LogList.tsx # react-window VariableSizeList, dynamic heights, autoscroll
├── filterMessages.ts # level + text filtering
└── conversion.tsx # normalize ROS1/ROS2/Foxglove log formats
Virtualized Rendering (react-window)
<VariableSizeList
height={containerHeight}
itemCount={filteredMessages.length}
itemSize={getItemSize} // dynamic: cached height per row
ref={listRef}
>
{LogRow}
</VariableSizeList>
Dynamic Row Heights
- Each entry can differ (multi-line messages, stack traces)
- Heights are measured after first render and cached
resetAfterIndex()is called when content changes (recalculates from that point)- Cache is invalidated on resize or filter change
Autoscroll (tail)
- At bottom → auto-scroll to new messages
- Scrolled up → autoscroll disabled (reading history)
- Scroll-to-bottom button re-enables it
Message Normalization (conversion.tsx)
Unifies multiple formats into one structure:
interface NormalizedLogMessage {
level: LogLevel; // DEBUG, INFO, WARN, ERROR, FATAL
message: string;
name?: string; // logger name
timestamp: Time;
file?: string;
line?: number;
}
Supported inputs: rosgraph_msgs/Log (ROS 1), rcl_interfaces/msg/Log (ROS 2), foxglove.Log.
Filtering (filterMessages.ts)
function filterMessages(
messages: NormalizedLogMessage[],
minLevel: LogLevel,
searchTerm: string,
): NormalizedLogMessage[];
- Level filter: messages at or above the selected level
- Text search: case-insensitive substring match (no regex by default)
- Runs on every new batch — must stay fast for 10k+ messages
Performance Notes
- Only visible rows are rendered (react-window)
- Measured heights are cached to avoid layout thrashing
- Messages are accumulated and filtered in batches (250ms debounce)
scrollToItemis only called when actually at the bottom
Key Files
packages/suite-base/src/panels/Log/index.tsxpackages/suite-base/src/panels/Log/LogList.tsxpackages/suite-base/src/panels/Log/filterMessages.tspackages/suite-base/src/panels/Log/conversion.tsx
Version History
- cab9317 Current 2026-07-24 12:17


