現在、RedisによってトリガーされるWebサービスプロセスとバックグラウンドワーカーという複数のプロセスを持つRailsアプリケーションがあります。
問題は、ログファイルをチェックして、特定の動作が発生した場所を特定するのが難しい場合があります。それはWeb部分でしたか、Resqueワーカーでしたか。
プロセス名やプロセスIDなど、各ログエントリをプロセスごとに区別できるものを含める方法はありますか?
現在、RedisによってトリガーされるWebサービスプロセスとバックグラウンドワーカーという複数のプロセスを持つRailsアプリケーションがあります。
問題は、ログファイルをチェックして、特定の動作が発生した場所を特定するのが難しい場合があります。それはWeb部分でしたか、Resqueワーカーでしたか。
プロセス名やプロセスIDなど、各ログエントリをプロセスごとに区別できるものを含める方法はありますか?
これにはいくつかのオプションがあるようです。
config.log_tags = [:subdomain, :uuid, :remote_ip, Proc.new { "PID-%.5d" % $$ }]
前のリンクは遅いと言っています)config.log_tags = [Proc.new { "PID: %.5d" % Process.pid }]
関連するSOの記事は次のとおりです。- Rails3.2.2ログファイルは順序付けられておらず、リクエストは絡み合っています
私にとって最善の策は、代わりに:uuidを使用することです。同じファイルに複数のプロセスがログを記録している場合に、同じ情報を伝達してリクエストを区別できるようにします。
コントローラコンテキストの外部でプロセスIDが必要な場合(たとえば、遅延ジョブ)、これを初期化子に入れることができます。
class ActiveSupport::BufferedLogger
def formatter=(formatter)
@log.formatter = formatter
end
end
class Formatter
SEVERITY_TO_COLOR_MAP = {'DEBUG'=>'0;37', 'INFO'=>'32', 'WARN'=>'33', 'ERROR'=>'31', 'FATAL'=>'31', 'UNKNOWN'=>'37'}
def call(severity, time, progname, msg)
formatted_severity = sprintf("%-5s","#{severity}")
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S.") << time.usec.to_s[0..6].ljust(6)
color = SEVERITY_TO_COLOR_MAP[severity]
"\033[0;37m#{formatted_time} (pid:#{$$})\033[0m [\033[#{color}m#{formatted_severity}\033[0m] #{msg.strip}\n"
end
end
Rails.logger.formatter = Formatter.new
詳細はこちら: http: //www.software-thoughts.com/2013/08/adding-process-id-and-timestamps-to.html
ここに元の投稿:http://cbpowell.wordpress.com/2012/04/05/beautiful-logging-for-ruby-on-rails-3-2/