マイニングブラウニー スタッフブログ

マイニングブラウニーのひとがなんかかくよ

クローラーサービスmitsubachiのCUIツールをアップデートしました

弊社マイニングブラウニーで提供しております、ウェブサイトをクローリングする
プラットフォームサービス「mitsubachi」ですが、これを操作するCUIツールの
ログ出力機能をアップデートしました。

mitsubachi 入門ガイド-mitsubachi CUI Toolをセットアップする

mitsubachiはクロール処理を個々のキューで処理をするため、ログがキューの
単位で独立して出力されます。
そのためトレースがとてもしにくいという残念な一面がありました。。

CUIツールを利用したmitsコマンドでクロールのログを取得しようとすると...

$ mits rlist [project-name] -f log
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 -Dfile.encoding=UTF-8
No. 1:リソース名[log/stderr/20130311/141149_search.rb.08760274.log],サイズ[0],タイムスタンプ[2013-03-11T14:11:50+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 2:リソース名[log/stderr/20130311/141208_list.rb.94416081.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:09+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 3:リソース名[log/stderr/20130311/141211_list.rb.95394080.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:12+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 4:リソース名[log/stderr/20130311/141215_list.rb.00687670.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:16+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 5:リソース名[log/stderr/20130311/141225_list.rb.81718690.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:26+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 6:リソース名[log/stderr/20130311/141235_list.rb.24222363.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:36+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 7:リソース名[log/stderr/20130311/141235_list.rb.37079102.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:36+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 8:リソース名[log/stderr/20130311/141237_list.rb.37947385.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:38+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 9:リソース名[log/stderr/20130311/141247_list.rb.91683724.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:48+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 10:リソース名[log/stderr/20130311/141251_detail.rb.76353917.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:52+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 11:リソース名[log/stderr/20130311/141254_list.rb.46466238.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:55+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 12:リソース名[log/stderr/20130311/141258_list.rb.00179981.log],サイズ[0],タイムスタンプ[2013-03-11T14:12:59+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 13:リソース名[log/stderr/20130311/141300_detail.rb.27872237.log],サイズ[1393],タイムスタンプ[2013-03-11T14:13:01+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 14:リソース名[log/stderr/20130311/141311_detail.rb.58600194.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:12+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 15:リソース名[log/stderr/20130311/141313_detail.rb.15733403.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:14+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 16:リソース名[log/stderr/20130311/141321_detail.rb.41712169.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:22+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 17:リソース名[log/stderr/20130311/141336_detail.rb.57443087.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:37+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 18:リソース名[log/stderr/20130311/141343_detail.rb.20019418.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:44+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 19:リソース名[log/stderr/20130311/141348_list.rb.41029642.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:49+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 20:リソース名[log/stderr/20130311/141349_detail.rb.88511458.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:50+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 21:リソース名[log/stderr/20130311/141358_detail.rb.01599541.log],サイズ[0],タイムスタンプ[2013-03-11T14:13:59+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 22:リソース名[log/stderr/20130311/141400_detail.rb.01626726.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:01+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 23:リソース名[log/stderr/20130311/141403_detail.rb.23286314.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:04+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 24:リソース名[log/stderr/20130311/141409_detail.rb.19171701.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:10+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 25:リソース名[log/stderr/20130311/141409_detail.rb.45222870.log],サイズ[1393],タイムスタンプ[2013-03-11T14:14:10+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 26:リソース名[log/stderr/20130311/141421_detail.rb.33944169.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:22+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 27:リソース名[log/stderr/20130311/141426_detail.rb.00015241.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:27+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 28:リソース名[log/stderr/20130311/141429_list.rb.11848910.log],サイズ[1393],タイムスタンプ[2013-03-11T14:14:30+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 29:リソース名[log/stderr/20130311/141430_detail.rb.00386591.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:31+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 30:リソース名[log/stderr/20130311/141434_detail.rb.79122253.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:35+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 31:リソース名[log/stderr/20130311/141447_detail.rb.41676158.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:48+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 32:リソース名[log/stderr/20130311/141457_detail.rb.09392800.log],サイズ[0],タイムスタンプ[2013-03-11T14:14:58+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 33:リソース名[log/stderr/20130311/141458_detail.rb.33425740.log],サイズ[1393],タイムスタンプ[2013-03-11T14:14:59+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 34:リソース名[log/stderr/20130311/141509_detail.rb.81220295.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:10+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 35:リソース名[log/stderr/20130311/141515_detail.rb.36874013.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:16+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 36:リソース名[log/stderr/20130311/141518_detail.rb.80295723.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:19+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 37:リソース名[log/stderr/20130311/141518_detail.rb.98154046.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:19+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 38:リソース名[log/stderr/20130311/141521_detail.rb.06842553.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:22+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 39:リソース名[log/stderr/20130311/141525_detail.rb.67984060.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:26+0900],コンテンツタイプ[text/plain; charset=utf8]
No. 40:リソース名[log/stderr/20130311/141532_detail.rb.15367995.log],サイズ[0],タイムスタンプ[2013-03-11T14:15:33+0900],コンテンツタイプ[text/plain; charset=utf8]
...

ギャーーなげえ!
というありさまです。

これを少しでも見やすくするために、ログをリスト出力するlgetという機能を
用意しました。

$ mits lget [project-name] -t e > err.log

このようにすると、err.logのなかに

og/stderr/20130311/141300_detail.rb.27872237.log
NoMethodError: undefined method `text' for nil:NilClass
  (root) at <script>:21
org.jruby.embed.EvalFailedException: (NoMethodError) undefined method `text' for nil:NilClass
        at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:127)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:129)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:157)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.execute(SandboxedScriptExecutor.java:91)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.main(SandboxedScriptExecutor.java:144)
Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass
Exception in thread "main" javax.script.ScriptException: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass
        at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:115)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:132)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:157)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.execute(SandboxedScriptExecutor.java:91)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.main(SandboxedScriptExecutor.java:144)
Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass

log/stderr/20130311/141300_detail.rb.27872237.log
NoMethodError: undefined method `text' for nil:NilClass
  (root) at <script>:21
org.jruby.embed.EvalFailedException: (NoMethodError) undefined method `text' for nil:NilClass
        at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:127)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:129)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:157)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.execute(SandboxedScriptExecutor.java:91)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.main(SandboxedScriptExecutor.java:144)
Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass
Exception in thread "main" javax.script.ScriptException: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass
        at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:115)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:132)
        at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:157)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.execute(SandboxedScriptExecutor.java:91)
        at org.mushikago.services.mitsubachi.sandbox.SandboxedScriptExecutor.main(SandboxedScriptExecutor.java:144)
Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `text' for nil:NilClass
...

このようなスタックトレースが出力されます。
上の例だとクロールスクリプトdetail.rbのの21行目でエラーが出ているな
ということがわかります。

mitsubachiクローラーが途中で中断してしまってるけど、どこでエラーしたのか
わからないときに使えます。

ぜひ使ってみてください。
mitsubachi CUI Tool ver. 2.1.0 ダウンロード