カニでもできるRailsでアクセスログ実装

こんにちはこんにちは

Rails 4 でさくっとアクセスログ出そうと思ったけど、思ったよりさくっといかなかったので実装方法を残しておく

ログの項目

これくらいの簡単な内容

  • 時間
  • ユーザー名
  • リクエストURI
  • USER AGENT

独自ログの設定

まず、Railsのログじゃなくて独自のログを出したかったので、

config/environment.rb

    # Load the Rails application.
    require File.expand_path('../application', __FILE__)
    
    class AccessLogger < ::Logger
      class NoHeaderLogDevice < ::Logger::LogDevice
        def add_log_header(file)
        end
      end
    
      class AccessFormatter < ::Logger::Formatter
        def call(severity, timestamp, progname, msg)
          "#{msg}\n"
        end
      end
    
      def initialize(logdev, shift_age = 0, shift_size = 1048576)
        super(nil, shift_age, shift_size)
    
        @formatter = AccessFormatter.new
    
        if logdev
          @logdev = NoHeaderLogDevice.new(
            logdev,
            :shift_age => shift_age,
            :shift_size => shift_size
          )
        end
      end
    
    end
    
    # Initialize the Rails application.
    Kaniapp::Application.initialize!

解説

ソースの中身を解説すると、

ログファイル作成時に出る邪魔なヘッダー(# Logfile created on ...)を抹殺

  class NoHeaderLogDevice < ::Logger::LogDevice
    def add_log_header(file)
    end
  end

ログフォーマットを指定

  class AccessFormatter < ::Logger::Formatter
    def call(severity, timestamp, progname, msg)
      "#{msg}\n"
    end
  end

config/environments/production.rb に

config.access_logger = AccessLogger.new('log/skv_access.log')

を追加

呼び出し

ApplicationController から

before_filter { access_log if Rails.env.production? }

private
def access_log
  return if session['warden.user.user.key'].nil?
  @user = User.find_by_id(session['warden.user.user.key'][0][0])
  return if @user.nil?
  now = Time.now.to_s.gsub(/ \+0900/,'')
  request_uri = URI.unescape(request.env['REQUEST_URI'])
  remote_ip = request.env['HTTP_X_FORWARDED_FOR'] || request.remote_ip
  user_agent = request.env['HTTP_USER_AGENT']
  row = "#{now}\t#{@user.username}\t#{request_uri}\t#{remote_ip}\t#{user_agent}"
  Kaniapp::Application.config.access_logger.info(row)
end

このやり方で君だけの最強のアクセスログを作ろう!!