【问题标题】:How to get error count from logs for last x hour如何从过去 x 小时的日志中获取错误计数
【发布时间】:2021-02-11 17:41:14
【问题描述】:

我正在尝试解析日志文件以获取过去 X 小时内的错误计数。

192.168.0.1 - - [11/Feb/2021:06:42:16 +0000] "POST /a/b/c/d/e HTTP/1.1" 200 28 "-" "-" 9104144117 "example" "http://example:8080" 102ms
192.168.0.1 - - [11/Feb/2021:11:42:16 +0000] "POST /a/b/c/d/e HTTP/1.1" 200 28 "-" "-" 9104144155 "example" "http://example2:8080" 91ms
192.168.0.1 - - [11/Feb/2021:12:42:16 +0000] "POST /a/b/c/d/e HTTP/1.1" 200 28 "-" "-" 9104144155 "example" "http://example3:8080" 91ms

输出:

200 2 http://example:8080
400 3 http://example2:8080
500 10 http://example:8080

我想要日志文件中当前时间和 X 小时时间之间的差异。所以,我可以在最后一小时得到错误。

我尝试使用time.Parse(),但它不接受日志文件中提到的date format

将日志行时间转换为此处提到的特定格式是一个好主意https://golang.org/pkg/time/#pkg-constants 还是应该将其转换为持续时间?

此代码提供了错误的信息。因为格式不对。

    then, _ := time.Parse("01-JAN-1970 00:00:00", "11-Feb-2021 11:42:16")
    fmt.Println(then)
    lTime := then.Add(-1 * time.Hour) 
    fmt.Println(lTime)

【问题讨论】:

  • 你必须编写你自己的解析器,或者至少看起来是这样,但如果你只关心一小时的差异,你可以省略除了 00:00:00 之外的 ewerithing

标签: datetime go time


【解决方案1】:

所以对于你的 time.Parse(...) 当你在第一个参数中指定格式时,你必须使用非常具体的值。

(抱歉,我不知道它在文档中的哪个位置,我只是在需要参考时总是去源代码)https://github.com/golang/go/blob/master/src/time/format.go#L92

所以对你来说:

"01-JAN-1970 00:00:00" 应该是"01-Jan-2006 03:04:05"

使用来自给定参考的正确格式常量值的示例。 https://play.golang.org/p/MUNqaFQHjVJ

编辑:

为了强调使用 format.go 参考,这只是值(月、小时、秒等)语法“01/Jan/2006”或“01-Jan-2006”或“01-- Jan--2006" 都是解析时间的有效方式。

Go 在如何解析基于字符串的日期方面提供了极大的灵活性。

下面是另一个示例,格式为"01/Jan/2006 03:04:05"https://play.golang.org/p/kEyZEDpu-6N

【讨论】:

  • 无法在我的机器上运行,显示月份超出范围
  • 它在我的机器和 Go Playground 上运行。你能把你正在运行的东西放在 Playground 中并分享吗?
  • 我得到的当前字符串是11/Feb/2021。你想让我把它改成11-FEB-2021吗?它会接受这种格式吗?
  • 我会更详细地更新我的答案,但要点是你会使用:time.Parse("01/Jan/2006 03:04:05", "11/Feb-2021 11:42:16")
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
相关资源
最近更新 更多