Ruboty | Ruboty と Logger #ruboty

# Ruboty | Ruboty と Logger #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Ruboty と Logger について

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Ruboty の Logging
Ruboty では ruby 標準の Logger を拡張し、 Ruboty.logger 経由で呼び出し可能です。

* [ruboty logger.rb](https://github.com/r7kamura/ruboty/blob/51336efc18a5603a9a5ba6eedf19474454bfc20f/lib/ruboty/logger.rb)

~~~ruby
require "logger"

module Ruboty
  class Logger < Logger
    def initialize(*)
      super
      @formatter = ->(severity, time, name, message) { "#{message}\n" }
    end
  end
end
~~~

* [ruboty ruboty.rb](https://github.com/r7kamura/ruboty/blob/51336efc18a5603a9a5ba6eedf19474454bfc20f/lib/ruboty.rb)

~~~ruby
module Ruboty
  class << self
    include Mem

    def logger
      @logger ||= Ruboty::Logger.new($stdout)
    end
# 略
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 試用
Ruboty に標準で付属している ping action を編集して動作確認してみます

### <i class="fa fa-code" style="font-size:1em;"></i> 編集内容

~~~ruby
module Ruboty
  module Actions
    class Ping < Base
      def call
        message.reply(pong)
      end

      private

      def ping
        # この行を追加
        Ruboty.logger.info '@@@@@@@@@@@@@ Use Ruboty.logger @@@@@@@@@@@@@@@'
        message.body[-4..-1]
      end

      def pong
        ping.gsub(/i/i, "i" => "o", "I" => "O")
      end
    end
  end
end
~~~

### <i class="fa fa-frown-o" style="font-size:1em;"></i> 編集前実行結果

~~~
> ruboty ping
pong
~~~

### <i class="fa fa-smile-o" style="font-size:1em;"></i> 編集後実行結果

~~~
> ruboty ping
@@@@@@@@@@@@@ Use Ruboty.logger @@@@@@@@@@@@@@@
pong
~~~

## <i class="fa fa-graduation-cap" style="font-size:1em;"></i> おまけ
おまけ要素として Ruby の Logger 基礎

### <i class="fa fa-file-text-o" style="font-size:1em;"></i> Log の出力先

Logger.new に任意の引数を与えることで、出力先を設定できます。

* <i class="fa fa-code" style="font-size:1em;"></i> サンプルコード

~~~ruby
require 'logger'
stdout_logger = Logger.new(STDOUT)
stdout_logger.info "sample output to STDOUT"
file_logger = Logger.new('hoge.log')
file_logger.info "sample output to hoge.log"
stdout_logger.info File.read('hoge.log')
~~~

* <i class="fa fa-file-o" style="font-size:1em;"></i> サンプル出力

~~~ruby
I, [2014-12-09T22:40:35.895133 #5664]  INFO -- : sample output to STDOUT
I, [2014-12-09T22:40:35.897640 #5664]  INFO -- : # Logfile created on 2014-12-09 22:40:35 +0900 by logger.rb/44203
I, [2014-12-09T22:40:35.896637 #5664]  INFO -- : sample output to hoge.log
~~~

### <i class="fa fa-list-ol" style="font-size:1em;"></i> Log Level
Logger オブジェクトにはログレベルを設定可能であり、
設定したレベルよりも低いログは無視されます。

以下の5段階が用意されています。

|Level|Description|
|:--|:--|
|FATAL|プログラムをクラッシュさせるような制御不可能なエラー|
|ERROR|エラー|
|WARN|警告|
|INFO|一般的な情報|
|DEBUG|低レベルの情報|

* <i class="fa fa-code" style="font-size:1em;"></i> サンプルコード

~~~ruby
require 'logger'

def output_logs(logger)
  logger.info("info")
  logger.debug("debug")
end

logger = Logger.new(STDOUT)
logger.level = Logger::INFO

output_logs(logger)
puts "--------------------------------"

logger.level = Logger::DEBUG

output_logs(logger)
~~~

* <i class="fa fa-file-o" style="font-size:1em;"></i> サンプル出力

~~~ruby
I, [2014-12-09T22:22:17.029072 #7436]  INFO -- : info
--------------------------------
I, [2014-12-09T22:22:17.029072 #7436]  INFO -- : info
D, [2014-12-09T22:22:17.029072 #7436] DEBUG -- : debug
~~~

### <i class="fa fa-file" style="font-size:1em;"></i> フォーマット
Logger#formatter=(formatter) を利用して、フォーマットを変更可能

* <i class="fa fa-code" style="font-size:1em;"></i> サンプルコード

~~~ruby
require 'logger'
logger = Logger.new(STDOUT)
logger.formatter = proc { |severity, datetime, progname, msg|
  [
    "severity:#{severity}",
    "datetime:#{datetime.strftime('%Y/%m/%d %H:%m:%S.%L')}",
    "msg:#{msg}"
  ].join("\t") + "\n"
}
logger.info 'formatter test1'
sleep 1
logger.info 'formatter test2'
~~~

* <i class="fa fa-file-o" style="font-size:1em;"></i> サンプル出力

~~~ruby
severity:INFO   datetime:2014/12/09 22:12:35.565        msg:formatter test1
severity:INFO   datetime:2014/12/09 22:12:36.568        msg:formatter test2
~~~

### その他
その他の機能については るりま のドキュメント参照
<i class="fa fa-external-link-square" style="font-size:1em;"></i> http://docs.ruby-lang.org/ja/2.1.0/class/Logger.html

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty GitHub](https://github.com/r7kamura/ruboty)
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [るりま | Logger](http://docs.ruby-lang.org/ja/2.1.0/class/Logger.html)