使用 XQuery 从查询控制台读取 MarkLogic 日志

Posted

技术标签:

【中文标题】使用 XQuery 从查询控制台读取 MarkLogic 日志【英文标题】:Reading MarkLogic logs from Query Console using XQuery 【发布时间】:2019-07-02 19:26:17 【问题描述】:

我想使用 Xquery 从查询控制台读取 MarkLogic 日志(例如:ErrorLog.txt)。我有以下代码,但问题是输出格式不正确。结果如下

xquery version "1.0-ml";
for $hid in xdmp:hosts()
let $h := xdmp:host-name($hid)
return 
xdmp:filesystem-file("file://" || $h || "/" ||xdmp:data-directory($hid) ||"/Logs/ErrorLog.txt")

问题是结果是根据主机来的,比如首先一个主机的所有日志都来了,然后从主机 2 的时间 00:00:01 开始,然后在运行 Xquery 后从主机 3 的 00:00:01 开始。

2019-07-02 00:00:35.668 Info: Merging 2 MB from /cams/q06data02/testQA2/Forests/testQA2-2.2/0002b4cd to /cams/q06data02/testQA2/Forests/testQA2-2.2/0002b4ce, timestamp=15620394303480170
    2019-07-02 00:00:36.007 Info: Merged 3 MB at 9 MB/sec to /cams/q06data02/testQA2/Forests/test2-2.2/0002b4ce
    2019-07-02 00:00:38.161 Info: Deleted 3 MB at 399 MB/sec /cams/q06data02/test2/Forests/test2-2.2/0002b4cd

是否可以获得包含在日志条目中的主机名的输出,以及我们是否可以按时间线对输出进行排序,例如

host 1 : 2019-07-02 00:00:01 : Info Merging ....
host 2 : 2019-07-02 00:00:02 : Info Deleted 3 MB at 399 MB/sec ...

【问题讨论】:

【参考方案1】:

日志文件是文本文件。您可以像任何其他文本文件一样解析和排序它们。 虽然它们可以变得非常大 (GB+),但简单的方法可能不会高效。 另外,您需要能够将文本解析为字段以便按字段排序。 由于每行的前 20 个字节是时间戳,并且该时间戳采用 ISO 格式,在词法上与日期排序相同,因此您可以按行拆分文件并使用基本排序规则进行排序,以获得多个文件的时间排序。

在 V9 中,可以使用 xdmp:logfile-scanxdmp:logmessage-parse 对有效地搜索日志文件(远程和本地),然后将结果转换为文本、XML(属性或元素格式)或 JSON。

同样可以使用 REST API。 见:https://docs.marklogic.com/REST/GET/manage/v2/logs

一旦将日志文件(理想情况下是选定的日志消息子集,小到可以管理)转换为结构化格式(xml、json 或文本行),然后就可以轻松执行排序、搜索、丰富等操作。

如需更好的信息,请查看运营总监https://docs.marklogic.com/guide/opsdir/intro

【讨论】:

REST API docs.marklogic.com/REST/GET/manage/v2/logs 为我们解决了问题。谢谢:)

以上是关于使用 XQuery 从查询控制台读取 MarkLogic 日志的主要内容,如果未能解决你的问题,请参考以下文章

XQuery 如何使用 WHERE 查询获取整个 xml 文档

XPath与Xquery

xQuery,如何从带有孩子的节点获取文本?

eXist DB & XQuery:带有属性的 xml-root 导致没有结果

Marklogic Json Xquery 无法查询

使用 XPath/XQuery 过滤 XML 列上的 SQL 查询