Rubyでloggerを使い、ログを出力してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き横山です。

Rubyスクリプトからログを出力する際、 logger を使ってログ出力してみた時のメモです。

準備

今回Amazon Linux 2015.09を使いました。

$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2015.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2015.09"
PRETTY_NAME="Amazon Linux AMI 2015.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2015.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

$ ruby -v
ruby 2.0.0p647 (2015-08-18) [x86_64-linux]

サンプル

以下のコードを準備します。
Logger.new(...) でインスタンスを作成した時点では、すべてのログレベルで出力しますが、 log.level で出力ログレベルを指定し、出力するログを制限することが出来ます。
ログレベルは、 DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN の順番です。1

ソースコード

#!/usr/bin/env ruby

require 'logger'

log = Logger.new('/tmp/log')

log.debug('debug')
log.info('info')
log.warn('warn')
log.error('error')
log.fatal('fatal')
log.unknown('='*80)
log.level=Logger::INFO
log.debug('debug')
log.info('info')
log.warn('warn')
log.error('error')
log.fatal('fatal')
log.unknown('='*80)
log.level=Logger::FATAL
log.debug('debug')
log.info('info')
log.warn('warn')
log.error('error')
log.fatal('fatal')
log.unknown('+'*80)

実行結果

$ ruby log.rb
$ cat /tmp/log
# Logfile created on 2015-09-29 06:00:41 +0000 by logger.rb/41954
D, [2015-09-29T06:00:41.226365 #12428] DEBUG -- : debug
I, [2015-09-29T06:00:41.226405 #12428]  INFO -- : info
W, [2015-09-29T06:00:41.226451 #12428]  WARN -- : warn
E, [2015-09-29T06:00:41.226470 #12428] ERROR -- : error
F, [2015-09-29T06:00:41.226484 #12428] FATAL -- : fatal
A, [2015-09-29T06:00:41.226499 #12428]   ANY -- : ================================================================================
I, [2015-09-29T06:00:41.226515 #12428]  INFO -- : info
W, [2015-09-29T06:00:41.226528 #12428]  WARN -- : warn
E, [2015-09-29T06:00:41.226541 #12428] ERROR -- : error
F, [2015-09-29T06:00:41.226554 #12428] FATAL -- : fatal
A, [2015-09-29T06:00:41.226566 #12428]   ANY -- : ================================================================================
F, [2015-09-29T06:00:41.226581 #12428] FATAL -- : fatal
A, [2015-09-29T06:00:41.226595 #12428]   ANY -- : ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ただ、ログを残す場所に注意が必要です。
書き込み権限のない場所や、ディレクトリが存在しない場所にログを書こうとするとエラーになります。

$ cp -rp log.rb{,.orig}
$ vim log.rb
$ diff -u log.rb{.orig,}
--- log.rb.orig 2015-09-29 06:00:37.493442154 +0000
+++ log.rb  2015-09-29 06:04:55.528613682 +0000
@@ -2,7 +2,7 @@

 require 'logger'

-log = Logger.new('/tmp/log')
+log = Logger.new('/root/log')

 log.debug('debug')
 log.info('info')

$ ruby log.rb
/usr/share/ruby/2.0/logger.rb:601:in `initialize': Permission denied - /root/log (Errno::EACCES)
    from /usr/share/ruby/2.0/logger.rb:601:in `open'
    from /usr/share/ruby/2.0/logger.rb:601:in `create_logfile'
    from /usr/share/ruby/2.0/logger.rb:596:in `open_logfile'
    from /usr/share/ruby/2.0/logger.rb:551:in `initialize'
    from /usr/share/ruby/2.0/logger.rb:318:in `new'
    from /usr/share/ruby/2.0/logger.rb:318:in `initialize'
    from log.rb:5:in `new'
    from log.rb:5:in `<main>'

まとめ

サンプルレベルですが、Rubyのloggerの使い方の参考になれば幸いです。