Правильно прочитайте файл журнала - PullRequest
0 голосов
/ 06 августа 2020

У меня есть файл журнала с такими данными внутри:

2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={
  "errors": [
    "Message type error"
  ]
})) to exchange FOS 
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.

Я пытаюсь прочитать этот файл таким образом:

data <- readr::read_lines(file = "log_data.log", progress = FALSE)
log_df <- setDT(tibble::enframe(data, name = NULL))

Но этот фрейм данных выглядит так:

              value
1   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
 
2   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
3   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
4   2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={
5     "errors": [
6         "Message type error"
7     ]
8   })) to exchange FOS 
9   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.

Итак, поскольку вы видите строку номер 4, разделенную на несколько строк, подумал, что это одна. Как я мог прочитать этот файл журнала, чтобы он понимал, что каждая строка должна начинаться с отметки времени?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вот еще один более общий подход, который разбивает регулярное выражение для даты, а затем разбивает текст на столбцы:

testfile <- "testfile.txt"

suppressPackageStartupMessages(invisible(
  lapply(c("data.table", "magrittr", "stringr"),
         require, character.only = TRUE)))
paste0(fread(testfile, sep=NULL, header=FALSE)$V1, collapse = " ") %>%
  str_split(pattern = regex("([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))")) %>%
  unlist() %>% .[-1] %>% trimws() %>% str_split(" ", n=7) %>%
  do.call(rbind, .) %>% as.data.table()
#>          V1                  V2    V3                    V4  V5 V6
#> 1: 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper:  10  -
#> 2: 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper:  66  -
#> 3: 10:07:01 (pool-3-thread-5id) DEBUG  ValidationXmlParser: 127  -
#> 4: 14:48:00 (pool-2-thread-1id) DEBUG        MessageWriter:  55  -
#> 5: 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578  -
#>                                                                                                                                                                                                                                           V7
#> 1:                                                                                                                                                                                                                     Trying to upload data
#> 2:                                                                                                                                                                                                                     Trying to upload data
#> 3:                                                                                                                                                                                                                   No META-Only annotation
#> 4: Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={ "errors": [ "Message type error" ] })) to exchange FOS
#> 5:                                                                                                                                                                                                              Scoped message interpolator.

Создано 06.08.2020 пакет REPEX (v0.3.0)

0 голосов
/ 06 августа 2020

читать в файле журнала в виде строки:

library(readr) 
read_file('mylog.log') -> mylog

Если за новой строкой следует пробел или }, удалите:

library(stringr)
str_replace_all(mylog, "\n |\n\\}", '') -> mylog_clean

Разделить символами новой строки:

str_split(mylog_clean, '\n')[[1]]

Результат в виде фрейма данных:

> as.data.frame(unlist(str_split(mylog_clean, '\n') ))
1 2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
2 2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
3 2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
4 2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={ "errors": [   "Message type error" ])) to exchange FOS
5 2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...