如何在Racket中解析上下文相关的日志文件?

时间:2014-12-18 08:40:46

标签: racket

我尝试使用Racket解析日志文件,逐行读取日志文件,如下所示

(define (read-next-line-iter file)
  (let ((line (read-line file)))
    (unless (eof-object? line)
      (filter-log line)
      (read-next-line-iter file))))

(define (filter-log line)
  (match line
    [(regexp #rx"errCode *:") (display line)]
    [_ (void)]))

(call-with-input-file "lines2read.log" read-next-line-iter)

但是,在某些匹配案例中,有相关的上下文。日志文件的一些内容将是

[I][2014-12-11 +8.0 10:24:50.150][3518, 127][OnGYNetEnd][, , 0][onGYNetEnd after post to worker netId:0, errType:0, errCode:0, isCancel:false, hashcode:1130102720
[I][2014-12-11 +8.0 10:24:50.150][3518, 127][OnGYNetEnd][, , 0][blabla, this line not important]
[I][2014-12-11 +8.0 10:38:12.743][3518, 127][APAuth][, , 0][onGYNetEnd : errType : 4, errCode : -100, errMsg : hit push hold!!
[I][2014-12-11 +8.0 10:38:12.743][3518, 127][APAuth][, , 0][THIS LINE IS IMPORTANT, WE NEED TO GRAP IT!
[I][2014-12-11 +8.0 10:38:12.743][3518, 127][APAuth][, , 0][THIS LINE IS IMPORTANT TOO, WE NEED TO GRAP IT! 

以上面的日志文件为例:

  • 如果errCode0,且下一行与regexp个案例不符,则忽略
  • 如果errCode 0,则接下来的两行与regexp个案例不匹配,打印

怎么做?

1 个答案:

答案 0 :(得分:1)

您需要将“状态”编码为显式值。所以,例如,听起来你需要知道

  • 前一行是否有错误代码为零?
  • 前两行中有一行有非零错误代码吗?

看起来在这里跟踪前两个错误代码就足够了;我会将此作为read-next-line-iter函数的显式参数添加。你必须考虑文件开头应该是什么。