日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在日志中搜索时间间隔

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在日志中搜索时间间隔 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

這篇文章與我有關(guān)日志分析的迷你系列文章間接相關(guān)。 最好閱讀兩個(gè)主要部分,以更好地理解我在說什么。 第1 部分 , 第2部分 。

這篇文章描述了我在實(shí)現(xiàn)IDE方法時(shí)遇到的一個(gè)重要問題。

任務(wù)描述

當(dāng)某人使用日志時(shí),通常只需要調(diào)查一個(gè)時(shí)間間隔。 可用日志通常跨越幾天,但是必須調(diào)查的時(shí)間間隔是1-2小時(shí)。 任務(wù)是選擇該時(shí)間間隔內(nèi)的所有日志記錄。

基本日志記錄正則表達(dá)式

為了選擇日志記錄,我們需要一個(gè)與任何日志記錄匹配的正則表達(dá)式。 對(duì)于簡(jiǎn)單的log4j格式,例如

2018-08-10 11:00:56,234 DEBUG [Thread-1] package1.pkg2.Class1 Text Message

我發(fā)現(xiàn)以下正則表達(dá)式:

TIME_REGEX((?!(TIME_REGEX)).*\r?\n)*

此正則表達(dá)式匹配單行和多行日志記錄。 時(shí)間正則表達(dá)式可能是

\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d

因此,如果有人想將所有日志加載到文本窗口中,則可以一個(gè)一個(gè)地打開日志文件,并使用帶有此正則表達(dá)式的Matcher.find()來獲取所有日志記錄。

此正則表達(dá)式基于以下事實(shí):時(shí)間正則表達(dá)式模式永遠(yuǎn)不會(huì)在日志消息的正文中重復(fù),這在所有情況下的99%中都是正確的。

日志記錄的日期時(shí)間

為了搜索特定時(shí)間間隔并使用其他功能,有必要從日志記錄中提取dtaetime信息。 幸運(yùn)的是,JDK已使用DateTimeFormatter解決了該任務(wù)。 指定日志類型的格式就足夠了,可以提取日期。 例如,對(duì)于上面的日志記錄,格式為

yyyy-MM-dd HH:mm:ss,SSS

一旦我們可以提取日期時(shí)間信息,就可以將間隔指定為日期時(shí)間值,而不是某些特定格式的字符串。

搜索時(shí)間

現(xiàn)在,我們找到了一種選擇任何日志記錄并從中提取日期信息的方法,前進(jìn)的道路似乎很明確:

  • 指定間隔,
  • 一一選擇記錄
  • 從日志記錄中提取日期信息
  • 比較日期時(shí)間和間隔
  • 如果日期時(shí)間在間隔內(nèi),則將此記錄添加到找到的記錄列表中
  • 搜索所有文件后,顯示找到的記錄

這種方法存在一個(gè)大問題:
時(shí)間 。 對(duì)于每個(gè)50 MB的50個(gè)日志文件,將需要花費(fèi)數(shù)小時(shí)來掃描所有日志文件,以找到間隔中的10 MB記錄。

我們可以使用一種技巧來過濾掉間隔中不包含單個(gè)記錄的文件。 我們使用以下事實(shí):日志文件中的日志記錄是一個(gè)接一個(gè)地寫入的。 這意味著下一條記錄的時(shí)間等于或晚于該記錄的時(shí)間。 例如,只有兩種情況是可能的:

2018-08-10 11:00:56,234 DEBUG [Thread-1] package1.pkg2.Class1 Text Message 2018-08-10 11:00:56,234 DEBUG [Thread-1] package1.pkg2.Class1 Msg 2

要么

2018-08-10 11:00:56,234 DEBUG [Thread-1] package1.pkg2.Class1 Text Message 2018-08-10 11:00:56,278 DEBUG [Thread-1] package1.pkg2.Class1 Msg 2

我很少看到一些示例,這些示例在高負(fù)載下日志記錄可以反向顯示,但差值以毫秒為單位。 對(duì)于我們的目的,我們可以認(rèn)為這種差異微不足道。

這意味著,如果文件中的第一個(gè)記錄和最后一個(gè)記錄都不不在間隔中,則文件中的所有記錄都不在間隔中,并且可以將該文件過濾掉。 Java正則表達(dá)式具有特殊的結(jié)構(gòu)來查找第一條和最后一條記錄。

第一條記錄:

\A TIME_REGEX((?!(TIME_REGEX)).*\r?\n)*

最后一條記錄:

TIME_REGEX((?!(TIME_REGEX)).*\r?\n)*\Z

\ A表示文本的開頭,\ Z表示文本的結(jié)尾。 您可以在javadocs.java.util.regex.Pattern中找到更多詳細(xì)信息。

解決方案是使用特殊的預(yù)掃描技術(shù)。 在掃描日志文件的全文之前,請(qǐng)找到第一條和最后一條記錄,如果不在間隔中,請(qǐng)?zhí)^該文件。 在50個(gè)文件中,可能需要掃描1-2個(gè)文件。

結(jié)論

REAL使用此技術(shù)來加快對(duì)日期時(shí)間間隔的搜索。 我發(fā)現(xiàn)大約需要5到10秒鐘來決定是否必須跳過該文件。 大多數(shù)情況下,如果花費(fèi)最后一條記錄執(zhí)行Matcher.find()。 發(fā)現(xiàn)第一條記錄要快得多。 我認(rèn)為可以通過選擇50 MB文件中的最后5 MB來搜索最后一條記錄來進(jìn)一步加快速度。 但是即使在當(dāng)前狀態(tài)下它也足夠快。

翻譯自: https://www.javacodegeeks.com/2018/11/search-time-interval-logs.html

總結(jié)

以上是生活随笔為你收集整理的在日志中搜索时间间隔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。