我有一个许可证日志文件(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仅作为示例显示。许可证文件维护的许多此类用户和一些其他应用程序。以后的要求包括从许可证文件中找出连接到每个应用程序的用户。
答案 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数据库上也很复杂),而'拒绝'要求只是另一个计数,但这次只是与您的模式匹配的消息。