とりあえず半歩

学んだことを1日1個、簡単なことでも良いから記録していきたい。

エラー時にログとダンプファイルを出力する

課題

Rのプログラムをバッチなどで実行中にエラーが発生した時、エラー内容がわかったりエラー時の状況をあとから終えたりすると原因を突き止めることに役立つ。そこでエラー時にログとダンプファイルを出力するような関数を定義する。

RプログラムをコンソールやRStudioで実行する分にはエラー内容がすぐわかるし、すぐに原因探しができる。しかし、例えば定時バッチでRプログラムを実行するような場合、すぐにエラー内容を確認・原因追求ができるとは限らない。エラーが発生したらその内容と状況を記録して、何が起きたかすぐわかるようにしておきたい。

実行

実行環境

  • Windows 7 Home Premium 64bit
  • R 2.15.3 64bit

コード

logged.error <- function(dir.path) {
  sink(paste(dir.path, "Rerror.log", sep="/") , append=TRUE)
  print(format(Sys.time(), "%Y/%m/%d %H:%M:%S"))
  traceback(2)
  file.name <- paste("dump", format(Sys.time(), "%Y%m%d%H%M%S"), sep="")
  old.wd <- setwd(dir.path)
  dump.frames(dumpto=file.name, to.file=TRUE)
  setwd(old.wd)
  sink()
}

引数のdir.pathはエラーログとダンプファイルを出力するフォルダのパスを指定する。

この関数を定義したら、バッチを実行する前やR起動時に次のコマンドを実行することでエラー時にログとダンプファイルが記録される。

options(error=logged.error)

logged.error関数で出力されたダンプファイルは以下のコードでRに読み込んでデバッグできる。ダンプファイルはRに読み込まれるとファイル名と同じ名前のオブジェクトになる。

load("temp.dump")
debugger(temp)

評価

Rプログラムの実行時に、他にも使用しているファイルが有るのなら、エラーログやダンプファイルと一緒に記録しておくとエラーを追うのが楽。自分は楽になった。

大きなデータを扱っている時にエラーが発生してダンプファイルを出力すると、ダンプファイルのサイズがかなり大きくなって記録に時間がかかった。

頻繁に記録すると容量をくうので余裕があるかどうか気をつけないといけない。

Rのパッケージに今回の記事と同じような機能を持ったものがあったような……?