【问题标题】:ParallelLogger shows no console output and file output is corruptedParallelLogger 显示无控制台输出且文件输出已损坏
【发布时间】:2018-09-17 09:31:43
【问题描述】:

最近我开始使用foreachdoParallel 包将我的代码切换到并行执行。由于不同的线程相互干扰,使用futile.logger 进行日志记录效果不佳。所以我开始使用ParallelLogger,即使在并行设置中也应该处理日志记录。 不幸的是,这个记录器有两个问题我自己无法解决,可能是我做错了什么,或者系统中存在错误。

  1. 第一个问题是,尽管我创建了一个控制台 Appender(请参阅下面的 MWE),但没有线程登录到控制台。
  2. 我的记录器生成的日志文件已损坏,导致launchLogViewer抛出line 40 did not have 6 elements 错误。

这是 MWE:

library(foreach)
library(doParallel)
library(ParallelLogger)

LOGGING_FILE_PATH <- "Parallel_MWE.log"

diff_time <- function(start_time) {
  format(difftime(Sys.time(), start_time))
}

block_execution <- function(start_se, end_se) {
  logInfo("Start Data Loading")
  start_time_loading <- Sys.time()
  Sys.sleep(2)

  logInfo("Data Loading Done: ", diff_time(start_time_loading))
  logInfo("Start Data Preprocessing")
  start_time_computation <- Sys.time()
  logInfo(paste("Start:", sprintf("%04d", start_se),
   "End:", sprintf("%04d", end_se),
   sep = " "
  ))
  Sys.sleep(2)

  logInfo("Computation Done: ", diff_time(start_time_computation))
  logInfo("Start Data Postprocessing")
  start_time_writing <- Sys.time()
  Sys.sleep(2)

  logInfo("Data Postprocessing Done: ", diff_time(start_time_writing))
  logInfo("Overall time taken: ", diff_time(start_time_whole))
  logInfo("Current allocated Memory: ", memory.size(), " MB\n")
}

registerLogger(createLogger(
  name = "ParLogger",
  threshold = "INFO",
  appenders = list(
    createConsoleAppender(
      layout = layoutSimple
    ),
    createFileAppender(
      layout = layoutParallel,
      fileName = LOGGING_FILE_PATH
    )
  )
))

logInfo("Start Programm")

start_time_whole <- Sys.time()
cluster <- makeCluster(detectCores())
registerDoParallel(cluster)

start <- 0100
end <- 9000
step <- 0100

foreach(i = seq(start, end, step), .packages = c("ParallelLogger")) %dopar% {
  block_execution(i, (i + step))
}

stopCluster(cluster)
logInfo("Programm Done: ", format(difftime(Sys.time(), start_time_whole)))
clearLoggers()

这是生成的日志文件的一部分,显示了一种错误情况:

2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Overall time taken: 39.00498 secs
2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB 
cs
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Overall time taken: 39.07554 secs
2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Start Data Loading
2018-09-17 10:47:57 [Thread 2]  INFO  doParallel  fun  Data Postprocessing Done: 2.063492 secs
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB 
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Start Data Loading
39.10681 secs
2018-09-17 10:47:57 [Thread 3]  INFO  doParallel  fun  Data Postprocessing Done: 2.049974 secs
2018-09-17 10:47:57 [Thread 2]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB


2018-09-17 10:49:15 [Thread 3]  INFO  doParallel  fun  Start: 7500 End: 7600
g
2018-09-17 10:49:15 [Thread 4]  INFO  doParallel  fun  Start: 7600 End: 7700

如您所见,有些线条被错误地扭曲或切割成部分。如果我删除这些错误行 launchLogViewer 就可以了。

那么如何将具有多个线程的并行 R 脚本记录到一个文件中并记录到控制台上呢?或者如何让ParallelLogger 登录到文件和控制台而不破坏输出?


编辑:

在 Linux 系统下运行 MWE 会生成格式良好的日志文件。 所以这似乎是一个特定于 Windows 的问题。

【问题讨论】:

  • 如果您在 Linux 或 macOS 上,您可以使用 rsyslog 登录到 syslog,然后只监视 syslog 中的特定日志行。这是避免线程上下文中文件日志记录问题的好方法。
  • 不幸的是,我绑定到 Windows,但还是谢谢你。

标签: r multithreading logging parallel-processing


【解决方案1】:

“控制台中不显示日志”部分的发生是因为各个线程没有标准输出通道,因此这不是错误。我与开发人员讨论了日志文件格式,结果发现ParallelLogger 没有事务管理,因此您对此话题无能为力。

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多