gpt4 book ai didi

go - golang中高效的日志解析

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:51 25 4
gpt4 key购买 nike

解析日志文件中的行并提取兴趣点的效率(性能和可读性)如何?

例如:

*** Time: 2/1/2019 13:51:00
17.965 Pump 10 hose FF price level 1 limit 0.0000 authorise pending (Type 00)
17.965 Pump 10 State change LOCKED_PSTATE to CALLING_PSTATE [31]
38.791 Pump 10 delivery complete, Hose 1, price 72.9500, level 1, value 100.0000, volume 1.3700, v-total 8650924.3700, m-total 21885705.8800, T13:51:38

我需要提取的东西是 10(对于泵 10),价格水平。限制_PSTATE 更改交付完成行等的值。

目前我正在使用正则表达式来捕获每一个并使用捕获组。但是感觉效率低下,而且有相当多的重复。

例如,我有一堆:

reStateChange := regexp.MustCompile(`^(?P<offset>.*) Pump (?P<pump>\d{2}) State change (?P<oldstate>\w+_PSTATE) to (?P<newstate>\w+)_PSTATE`)

然后在 while 循环中

if match := reStateChange.FindStringSubmatch(text); len(match) > 0 {
matched = true
for i, name := range match {
result[reStateChange.SubexpNames()[i]] = name
}
} else if match := otherReMatch.FindStringSubmatch(text); len(match) > 0 {
matched = true
for i, name := range match {
result[reStateChange.SubexpNames()[i]] = name
}
} else if strings.Contains(text, "*** Time:") {

}

感觉可以有更好的方法来做到这一点。我会用一些性能换取可读性。日志文件最大只有 10MB。通常更小。

我正在寻求一些关于如何在 golang 中改进它的建议。

最佳答案

如果您的所有日志行都与您发布的示例相似,那么它们看起来结构化得很好,因此正则表达式可能有点矫枉过正并且难以概括。

另一种选择是使用 strings.Fields 将这些行中的每一行转换为一段字符串 ([]string) ,甚至 strings.FieldFunc这样您就可以去掉空格和逗号。

然后你可以设计一个界面:

type LogLineProcessor interface {
CanParse(line []string)
GetResultFrom(line []string) LogLineResult
}

其中 LogLineResult 是一个包含提取信息的结构。

然后,您可以使用实现 LogLineProcessor 的方法定义多个结构(每个实现都会查看该 []string 上的特定位置,以了解它是否是一条线处理与否,比如在它希望找到的位置寻找单词“软管”、“FF”和“价格”)。

GetResultFrom 实现也会从 []string 中的特定位置提取每个数据点(如果它已经确定它是一个,它可以依赖那里的信息它可以处理的行数)。

您可以创建一个 var processors []LogLineProcessor,将所有处理器放在那里,然后只迭代该数组:

line := strings.Fields(text)
for _, processor := range processors {
if processor.CanParse(line) {
result := processor.GetResultFrom(line)
// do whatever needed with the result
}
}

关于go - golang中高效的日志解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57048181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com