こんにちはこんにちは
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
このやり方で君だけの最強のアクセスログを作ろう!!