【问题标题】:Best technique to transform log file data for analysis using R or python使用 R 或 python 转换日志文件数据以进行分析的最佳技术
【发布时间】:2015-02-12 11:26:29
【问题描述】:

我想将日志文件转换为可以在 R 中读取的格式以供进一步分析。

我在尝试寻找解决方案时遇到的事情。 Regex,RecordBreaker,OpenRefine 或 GoogleRefine,R 有 stringr 和 dplyr 等。

我尝试使用 OpenRefine,它看起来很有用,但仍然希望获得更多指导,因为他们说日志文件是真正的大数据。

数据看起来像这样;

M 8000000 NADR     14273 18:17:43.22 STC35256 00000291  DSNT375I  +HPN2 PLAN=DISTSERV WITH 026
 D                                         026 00000291          CORRELATION-ID=db2jcc_appli
 D                                         026 00000291          CONNECTION-ID=SERVER
 D                                         026 00000291          LUW-ID=G93FF023.DB11.CDD5C8DE241F=29839
 D                                         026 00000291
 D                                         026 00000291  THREAD-INFO=SAPHPNDB:9.63.240.123:SAPHPNDB:db2jcc_application:DYNAMIC
 D                                         026 00000291  :46835:*:*
 D                                         026 00000291          IS DEADLOCKED WITH PLAN=DISTSERV WITH
 D                                         026 00000291          CORRELATION-ID=db2jcc_appli
 D                                         026 00000291          CONNECTION-ID=SERVER
 D                                         026 00000291          LUW-ID=G93FF07C.EE5F.CDD5C82B2305=29799
 D                                         026 00000291
 D                                         026 00000291  THREAD-INFO=SAPHPNDB:9.63.240.33:SAPHPNDB:db2jcc_application:DYNAMIC:
 D                                         026 00000291  46835:*:*
 E                                         026 00000291          ON MEMBER HPN2
............................................................................

底层结构是这样的;

  1. 每条记录以 M 开头,以 E 结尾

  2. D 是提供有关单个记录的更多信息的变量。 因此,如上面的日志文本所示,第一个实例以 M 开头,以 E 结尾,在 D 之间提供相关 ID、连接 ID 等信息。

所以上面的日志文件应该是数据表格式的一行,以D为变量。

  [1]: http://i.stack.imgur.com/hw9zY.png

可能的解决方案:

data <- readLines("data1.txt")
pattern <- "(M\\s+\\d+\\s+)(\\w+\\s+)(\\d+\\s+)(\\d+:\\d+:\\d+.\\d+\\s+)(\\w+\\s+)(\\d+\\s+)(\\w+\\s+)(\\+\\w+\\s+\\w+(\\=|\\s+)\\w+\\s+\\w+\\s+\\d+)"

m <- regexec(pattern,data)

matches <- regmatches(data, m)

parts <- do.call(rbind,lapply(regmatches(data, m), `[`,c(2L,3L,4L,5L,6L,7L,8L,9L)))

colnames(parts) <- c("ID1","ID2","Date","Time","ID3","ID4","ID5","description")

parts <- as.data.frame(parts)

parts1 <- na.omit(parts)

【问题讨论】:

  • D 的总集合是预定义的吗?否则,您如何想象将不同的 D 映射到变量?
  • 它没有预定义它会变化,有一个最大数量。可能发生的变量的数量,并且在多种情况下会出现其中的一个子集。例如。因此,相关 ID 将是一列,但在日志中未生成相关 ID 的 sn-p 中,我们应该有 NA。

标签: regex r data-processing log-files


【解决方案1】:

嗯,你可以一次做一个日志行。伪代码是这样的:

IF logrow.record == 'D' AND logrow.type == 'CORRELATION' THEN
  current.record$correlation = logrow.value
ELSE IF logrow.record == 'E' THEN
  all.records[n+1] = current.record
ELSE IF logrow.record == 'M' THEN
  current.record = empty new record
  current.record$ID = logrow.value
END

基本上如果是 M,那么你就开始一个新记录。如果是 E 则结束当前的。如果是 D,则根据存在的其他信息将数据添加到当前记录。

这不会太容易,但也不会太难。从一条记录开始,创建大量的中间变量,一次迈出一步。

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多