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

时间:2015-02-17 10:06:45

标签: parsing logging logparser

我有一个许可证日志文件(TEXTLINE),其中包含用户的详细信息以及他们何时接收或发放许可证的时间戳。它看起来如下:

对于Ex:

9:43:58(app_d)IN:" LICENSE_APP1_NAME" A123456 @ ABCDEFG
9:44:12(app_d)OUT:" LICENSE_APP1_NAME" A123456 @ ABCDEFG

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

9:12:41(lmgrd)TIMESTAMP 2/6/2015

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

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

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

Logparser -i:textline -rtp:-1"从' [LOGFILEPATH]'中选择文字。其中的文字类似于'%许可的用户数已达到%'"

Logparser -i:textline -rtp:-1"从' [LOGFILEPATH]'中选择文字。其中包含'%TIMESTAMP%'"

的文字

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

我想结合这两个选择。我试过了UNION'但没有工作。我想要的输出是,我需要打印所有行显示日期和许可拒绝行的行,如下所示。(根据索引)

对于Ex :(如果有,则Plz忽略行间隙)

9:12:41(lmgrd)TIMESTAMP 2/6/2015

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

15:12:42(lmgrd)TIMESTAMP 2/6/2015

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

如果我只能在日期行显示日期,那就更好了。我们可以修剪其余部分吗?

此外,我未来的要求将包含一个带有表格的输出,该表格显示了一列用户'所有用户详细信息(例如:A123456 @ ABCDEFG),列'会话'根据用户进行会话的次数(根据" IN"" OUT"在日志中)的数量,列'总小时数'使用时间戳的差异来计算他使用许可证的时间和一栏“拒绝”#39;它显示了用户因已经获得许可的用户数而被拒绝许可的次数"错误。如果不是整个代码,我是否可以帮助理解如何实现这一目标的想法?提前谢谢。

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

1 个答案:

答案 0 :(得分:0)

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

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

然后,您只能在匹配TIMESTAMP的行上使用EXTRACT_TOKEN(参见http://logparserplus.com/Functions)保留“...... TIMESTAMP ...”行中的日期:

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

最后,您的最后一组要求可能有点过分了LogParser的功能。首先,我建议您切换到TSV输入格式,该格式假设您的日志是空格分隔的,并且应该能够在其自己的列中返回用户ID。请在LogParser文档中阅读。

一旦实现了这一点,就可以开始对用户ID使用GROUP BY并聚合SELECT子句中的各种计数器。例如,假设TSV格式为您提供“Field3”列中的IN / OUT指示符和“Field5”列中的用户ID,则以下查询将返回每个用户的IN总数:

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

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