Log Parser 2.2 我们能否组合两个 select 语句以获得组合输出

Log Parser 2.2 Can we combine two select statements to get a combined output

我有一个许可证日志文件 (TEXTLINE),其中包含用户的详细信息以及他们获得或发放许可证的时间戳。如下所示:

例如:

9:43:58 (app_d) 输入:"LICENSE_APP1_NAME" A123456@ABCDEFG
9:44:12 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG

每六个小时它还会记录如下日期:

9:12:41 (lmgrd) 时间戳 2/6/2015

它还有当用户被拒绝许可时的日志详细信息,如下所示:

6:24:21 (app_d) DENIED: "LICENSE_APP1_NAME" A123456@ABCDEFG (许可用户数已达到。(-4,342:10054 ""))

现在我尝试在 Log Parser 中使用以下命令:

Logparser -i:textline -rtp:-1 "Select text from '[LOGFILEPATH]' where text like '%Licensed number of users already reached%'"

Logparser -i:textline -rtp:-1 "Select text from '[LOGFILEPATH]' where text like '%TIMESTAMP%'"

第一个为我提供了日志显示许可证被拒绝的所有行的列表,第二个为我提供了所有包含日期​​的行。如果我使用 select '*',它会给出三列,即 LogFilename、Index 和 Text。

我想合并这两个 select。我试过 'UNION' 但没有用。我想要的输出是,我需要打印所有显示日期和许可证被拒绝行的行,如下所示。(根据索引)

例如:(如果有,请忽略行间隙)

9:12:41 (lmgrd) 时间戳 2/6/2015

9:25:32 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG
10:36:40 (app_d) 输入:"LICENSE_APP1_NAME" A123456@ABCDEFG
10:36:53 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG
12:38:13 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG
12:43:58 (app_d) 输入:"LICENSE_APP1_NAME" A123456@ABCDEFG

15:12:42 (lmgrd) 时间戳 2/6/2015

15:27:41 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG
16:28:30 (app_d) 输入:"LICENSE_APP1_NAME" A123456@ABCDEFG
16:28:54 (app_d) 输入:"LICENSE_APP1_NAME" A123456@ABCDEFG
18:29:04 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG
18:30:51 (app_d) 输出:"LICENSE_APP1_NAME" A123456@ABCDEFG

如果我能在日期行中只显示日期就更好了。我们可以 trim 剩下的吗?

此外,我未来的需求将包含带有 table 的输出,其中显示包含所有用户详细信息的列 'user'(例如:A123456@ABCDEFG),列 'session' 包含用户进行会话的次数(基于日志中 "IN" 和 "OUT" 的次数),一列 'Total hours' 使用时间戳的差异来计算他的时间使用了许可证和一列 'Denials',该列显示用户因 "Licensed number of users already reached" 错误而被拒绝获得许可证的次数。如果不是整个代码,我能否在理解如何实现这一点的想法方面得到一些帮助?提前致谢。

P.S。 A123456@ABCDEFG 和 LICENSE_APP1_NAME 仅作为示例显示。有许多这样的用户和许可证文件维护的一些其他应用程序。以后的要求包括从许可证文件中找出连接到每个应用程序的用户。

您的第一个问题已通过 OR 解决:

Select text from '[LOGFILEPATH]' 
where text like '%Licensed number of users already reached%' 
OR text like '%TIMESTAMP%'

然后,您可以仅在与 TIMESTAMP:

Select CASE INDEX_OF(text, 'TIMESTAMP') WHEN -1 THEN NULL ELSE EXTRACT_TOKEN(text, 3, ' ') END AS Date FROM ...

最后,您的最后一组要求可能有点超出了 LogParser 的能力。首先,我建议你切换到 TSV 输入格式,它假设你的日志是 space 分隔的,并且应该能够 return 在它自己的列中的用户 ID。请务必阅读 LogParser 文档。

完成后,您可以开始对用户 ID 使用 GROUP BY 并在 SELECT 子句中聚合各种计数器。例如,假设 TSV 格式在 "Field3" 列中为您提供 IN/OUT 指示符,在 "Field5" 列中提供用户 ID,则以下查询将 return 的总数IN:对于每个用户:

SELECT Field5 AS User, COUNT(*) AS NumberOfSessions
FROM '[LOGFILEPATH]' 
WHERE Field3 = 'IN:'
GROUP BY Field5

这就是说,'TotalHours' 要求真的很棘手,因为它需要不同行之间的增量(即使在 real SQL 数据库),而 'Denials' 要求只是另一个计数,但这次只是匹配您的模式的消息。