在日志中搜索时间间隔
介紹
這篇文章與我有關(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暖暖手游下载(暖暖安卓攻略)
- 下一篇: 具有JDK 12精简数字格式的自定义精简