日志可视化显示来自支持日志的数据源(如 Elastic、Influx 和 Loki)的日志行。通常情况下,您会在图形可视化旁边使用此可视化来显示相关流程的日志输出。
日志可视化显示在查询选项卡中输入的查询结果。多个查询的结果会合并,并按时间排序。如果数据源返回的行数多于可同时显示的行数,可以在面板内滚动。
要限制显示的行数,可以使用查询选项中的最大数据点设置。如果没有设置,数据源通常会执行默认限制。
该示例使用 mysql 作为数据源,假如我们存在如下数据表格:
该数据库表的 SQL 如下:
CREATE TABLE `logs_data` ( `id` varchar(50) NOT NULL, `time` datetime DEFAULT NULL, `labels` varchar(200) DEFAULT NULL, `line` varchar(200) DEFAULT NULL, `tsNs` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
对应的数据 SQL 语句如下:
INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177000_1000', '2024-05-01 12:30:00', '{\"id\": \"100\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"200\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177000'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177001_1001', '2024-05-02 12:30:00', '{\"id\": \"101\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"201\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177001'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177002_1002', '2024-05-03 12:30:00', '{\"id\": \"102\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"202\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177002'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177003_1003', '2024-05-04 12:30:00', '{\"id\": \"103\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"203\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177003'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177004_1004', '2024-05-05 12:30:00', '{\"id\": \"104\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"204\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177004'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177005_1005', '2024-05-06 12:30:00', '{\"id\": \"105\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"205\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177005'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177006_1006', '2024-05-07 12:30:00', '{\"id\": \"106\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"206\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177006'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177007_1007', '2024-05-08 12:30:00', '{\"id\": \"107\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"207\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177007'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177008_1008', '2024-05-09 12:30:00', '{\"id\": \"108\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"208\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177008'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177009_1009', '2024-05-10 12:30:00', '{\"id\": \"109\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"209\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177009'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177010_1010', '2024-05-11 12:30:00', '{\"id\": \"110\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"210\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177010'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177011_1011', '2024-05-12 12:30:00', '{\"id\": \"111\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"211\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177011'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177012_1012', '2024-05-13 12:30:00', '{\"id\": \"112\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"212\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177012'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177013_1013', '2024-05-14 12:30:00', '{\"id\": \"113\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"213\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177013'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177014_1014', '2024-05-15 12:30:00', '{\"id\": \"114\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"214\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177014'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177015_1015', '2024-05-16 12:30:00', '{\"id\": \"115\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"215\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177015'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177016_1016', '2024-05-17 12:30:00', '{\"id\": \"116\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"216\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177016'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177017_1017', '2024-05-18 12:30:00', '{\"id\": \"117\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"217\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177017'); INSERT INTO `logs_data` (`id`, `time`, `labels`, `line`, `tsNs`) VALUES ('17177018_1018', '2024-05-19 12:30:00', '{\"id\": \"118\",\"title\": \"labels title\",\"summary\": \"labels summary\"}', '{\"id\": \"218\",\"title\": \"line title\",\"summary\": \"line summary\"}', '17177018');
打开 Grafana,创建日志图表,使用如下 SQL 作为图表的数据:
SELECT labels, UNIX_TIMESTAMP(time) as time, line, tsNs, id FROM `logs_data`
然后,点击“”按钮,查询数据,用来渲染图表,渲染后的效果如下图:
对于指定了级别标签的日志,我们会使用标签值来确定日志级别,并相应地更新颜色。如果日志没有指定级别标签,我们会尝试查找其内容是否与任何支持的表达式相匹配。日志级别总是由第一个匹配项决定。如果 Grafana 无法确定日志级别,则会以未知日志级别显示。
提示:如果您使用的是 LOKI 数据源,并且“Level”是日志行的一部分,则可以使用解析器 (JSON、logfmt、regex、..)。将级别信息提取到用于确定级别值的级别标签中。这将允许直方图将各种日志级别显示为单独的条形图。
下表是支持的日志级别以及日志级别缩写和表达式的映射:
日志级别 | 颜色 | 支持的表达式 |
---|---|---|
critical 严重错误日志 | purple 紫色 | emerg, fatal, alert, crit, critical |
error 错误日志 | red 红色 | err, eror, error |
warning 警告日志 | yellow 黄色 | warn, warning |
info | green 绿色 | info, information, informational, notice |
debug 调试日志 | blue 蓝色 | dbug, debug |
trace | light blue 浅蓝色 | trace |
unknown | grey 灰色 | * |
每行日志都有一个可扩展区域,其中包含标签和检测字段,以便进行更强大的交互。每个字段或标签都有一个统计图标,用于显示与所有显示日志相关的临时统计数据。
通过使用数据链接,您可以将日志信息的任何部分转化为内部或外部链接。创建的链接在日志详细信息视图中的链接部分以按钮的形式显示。
使用这些设置完善您的日志可视化:
Time - 显示或隐藏时间列,这是数据源报告的与日志行相关的时间戳。
Unique labels - 显示或隐藏唯一标签列,该列只显示不常用的标签。
Common labels - 显示或隐藏通用标签。
Wrap lines - 切换换行。
Prettify JSON - 将此设置为 "true" 打印出的所有 JSON 日志都是格式化后的,格式良好的。此设置不会影响 JSON 以外的任何格式的日志。
Enable log details - 切换选项以查看每行日志的日志详细信息视图,默认设置为 true。
Order - 按降序或升序时间顺序显示结果。默认为降序,首先显示最新日志。设置为升序则首先显示最旧的日志行。
新闻可视化会显示 RSS 源。默认情况下,它显示来自 Grafana Labs 博客的文章,用户可以通过输入不同的 RSS 源 URL 进行更改。
在 "显示" 部分的 URL 字段中输入 RSS 的 URL。此可视化类型不接受任何其他查询,用户不应期望能够使用此可视化以任何方式过滤或查询 RSS 源数据。
在 8.5 版中,我们停止了 Grafana 新闻可视化的 "Use Proxy" 选项。因此,未配置为由 Grafana 前端请求的 RSS 订阅(带有相应的 CORS 标头)可能无法加载。
如果在加载 RSS 源时遇到困难,可以尝试将 RSS 源重新托管到不同的服务器上或使用 CORS 代理。CORS 代理是一种工具,可让你绕过 CORS 限制,以你的名义向 RSS 源发出请求。你可以在网上找到更多关于使用 CORS 代理的信息。
如果无法使用新闻可视化显示 RSS 源,可以尝试使用社区 RSS/Atom 数据源插件 RSS/Atom 数据源,并结合动态文本社区面板动态文本。这样就能以不同的方式显示 RSS 源。