【问题标题】:Log Parser 2.2 Can we combine two select statements to get a combined outputLog Parser 2.2 我们可以组合两个 select 语句来得到一个组合输出吗
【发布时间】:2015-02-19 04:09:08
【问题描述】:

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

例如:

9:43:58 (app_d) IN: "LICENSE_APP1_NAME" A123456@ABCDEFG
9:44:12 (app_d) 输出:“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 "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%'"

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

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

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

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

9:25:32 (app_d) 输出:“LICENSE_APP1_NAME”A123456@ABCDEFG
10:36:40 (app_d) IN: "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) IN: "LICENSE_APP1_NAME" A123456@ABCDEFG

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

15:27:41 (app_d) 输出:“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) 输出:“LICENSE_APP1_NAME”A123456@ABCDEFG
18:30:51 (app_d) 输出:“LICENSE_APP1_NAME”A123456@ABCDEFG

如果我可以只在日期行中显示日期,那就更好了。我们可以修剪剩下的部分吗?

此外,我未来的要求将包含一个带有表格的输出,该表格显示包含所有用户详细信息的“用户”列(例如:A123456@ABCDEFG),一个包含用户会话次数的“会话”列(基于日志中“IN”和“OUT”的数量),“总小时数”列使用时间戳的差异来计算他使用许可证的时间,以及“拒绝”列,显示数量由于“已达到许可的用户数量”错误,用户被拒绝许可的次数。如果不是整个代码,我能否获得一些帮助来理解如何实现这一点的想法?提前致谢。

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

【问题讨论】:

    标签: parsing logging logparser


    【解决方案1】:

    你的第一个问题是用 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 数据库上也很复杂),而“拒绝”要求只是另一个计数,但这次只计算与您的模式匹配的消息。

    【讨论】:

    • 感谢您的解决方案,我的问题的第一部分已使用 OR 解决。
    • 关于提取标记部分,如果我为一行添加提取标记,即带有日期的那一行,它是否也不适用于第二个 where 子句,因为我提到了 from '[ LOGFILEPATH]' 一次。我可以为那条线单独提取它。但我需要单独显示日期,其他行保持不变。有没有办法在选择中使用两个单独的 where 子句?我试过了,但我无法构建查询。谢谢。
    • 等一下,当你说你只想保留日期时,你的意思是从 TIMESTAMP 行开始,对吗?如果是这样的话,我就犯了一个错误。更新答案。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2013-05-31
    • 2022-11-30
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多