| 10 июня 2008, 15:54 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
Расширенное логированеи с помощью log4r |
Для начала инсталируем джем
[root@bublik ~]# gem install --remote log4r
complete
Successfully installed log4r-1.0.5
1 gem installed
Installing ri documentation for log4r-1.0.5...
Installing RDoc documentation for log4r-1.0.5...
Пимер подключения
ДОбавляем следующие строки в environment.rb
#########################################
require "log4r"
require "log4r/configurator"
include Log4r
Log4r::Configurator.custom_levels("Info","Error","Access","Activity","Debug")
class MyFormatter < Log4r::Formatter
def format(event)
buff = "The level is #{event.level} and has "
buff += "name '#{Log4r::LNAMES[event.level]}'\n"
buff += "The logger is '#{event.name}' "
buff += "and the data type is #{event.data.class}\n"
buff += "Let's inspect the data:\n"
buff += event.data.inspect + "\n"
# buff += "We were called at #{event.tracer[0]}\n\n"
end
end
Log4r::FileOutputter.new('my_log',
:filename=>"#{RAILS_ROOT}/log/mylog.log",
:trunc=>false,
:formatter=>MyFormatter)
devel = Log4r::Logger.new("mylog")
#devel.trace = true
devel.add('my_log')
production = Log4r::Logger.new("prod")
production.add('my_log')
devel.info("User logged in")
devel.access("User logged in")
devel.error("User logged in")
devel.debug("User logged in")
production.info("User logged in")
production.access("User logged in")
production.error("User logged in")
production.debug("User logged in")
Вот пример того что мы получим
http://log4r.sourceforge.net/
http://www.pigstye.net/articles/2007/02/01/log4r-and-rails
http://www.martyandrews.net/blog/2007/09/logging_in_ruby_on_rails.html
http://wiki.rubyonrails.org/rails/pages/HowtoConfigureLogging
------------ Операции с WM | SEO консультации |
|
| log4r |
| 08 июня 2008, 23:18 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: Расширенное логированеи с помощью log4r |
Добавляем в в начало файла envoronment.rb
require "log4r"
include Log4r
Добавляем в development.rb
formatter = Log4r::PatternFormatter.new(:pattern => "[%l][%c] (%d) | %M |")
Log4r::StderrOutputter.new('console', :formatter => formatter)
Log4r::FileOutputter.new('devel_log',
:filename=>"#{RAILS_ROOT}/log/development.log",
:trunc=>false,
:formatter => formatter)
Log4r::Logger.new('App').add('console')
Log4r::Logger.new('App').add('devel_log')
RAILS_DEFAULT_LOGGER = Log4r::Logger.new('App::Rails')
В результате получим красивый лог
[DEBUG][Rails] (2008-03-04 16:13:35) | SQL (0.001283) SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = 'products'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
|
------------ Операции с WM | SEO консультации |
|
| configure log4r |
| 10 июня 2008, 15:30 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
No such file to load -- log4r |
При попытке запустить тесты возникла следующая проблемма
wr@bublik trunk]$ ruby test/unit/trustconnect_log_test.rb
/home/wr/****/trunk/config/environment.rb:6:in `require': no such file to load -- log4r (LoadError)
from /home/wr/comodo/comodo_sasp/trunk/config/environment.rb:6
from ./test/unit/../test_helper.rb:2:in `require'
from ./test/unit/../test_helper.rb:2
from test/unit/trustconnect_log_test.rb:1:in `require'
from test/unit/trustconnect_log_test.rb:1
Оказывается для запуска тектов надо добавить еще загрузку джемов
/environment.rb
require 'rubygems'
require "log4r"
include Log4r
------------ Операции с WM | SEO консультации |
|
| require log4r, gem log4r |
| 10 июня 2008, 10:56 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: Расширенное логированеи с помощью log4r |
Выше приведенные конфига показали что существует проблемма при запуске script/console
По этому нашелся интересный вараинт решения
Добавляем файла в директорию конфигов и вызываем его в script/server
require File.join(File.dirname(__FILE__), 'boot')
require File.expand_path(File.dirname(__FILE__) + "/logger")
файлы которые надо добавить приатачены ------------ Операции с WM | SEO консультации |
|
| Присоединенные: log4r_rails.zip |
| 10 июня 2008, 03:42 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
Rails loggger formatter 5.0 из 1 гол. |
Борьба с логером не закончилась на этом.
Как показало тестовое использование log4r, сто он не на столько совершенен чтобы его использовать на все 100% в продакшине, по сему было принято решение сделать маленький хак для стандартного логера, для получения желаемого вида логов.
logger for rails 1.2.x < 2.0
Вынесем наш хак во внешний файл, для просторы миграции в другие приложения или его отключения.
#app/lib/logger_core_ext.rb'
######################################
#Для использования добавляем в app/config/enviromnent.rb следующие строки
#require 'logger_core_ext'
#RAILS_DEFAULT_LOGGER.formatter = Logger::CustomFormatter.new
######################################
class Logger
#revert rails logger hack
alias format_message old_format_message
class CustomFormatter < Formatter
def call(severity, time, progname, msg)
"[%s|#%5d|%s] %s| %s\n" % [severity[0..3], $$, time.to_s(:db), progname, msg2str(msg)]
end
end
end
#app/config/enviromnent.rb
require 'logger_core_ext'
RAILS_DEFAULT_LOGGER.formatter = Logger::CustomFormatter.new
Добавим для тестового просмотра вида нашего лога в application.rb
class ApplicationController < ActionController::Base
before_filter :showlog
def showlog
logger.debug('debug from log'){ "Received connection from" }
logger.info('info from log')
logger.info("MainApp"){ "Received connection from" }
logger.warn('warn from log')
logger.error('error from log')
logger.fatal('fatal from log')
end
end
Как результат в наших логах прекрасные и понятные записи.
Processing MessagesController#show (for 127.0.0.1 at 2008-03-11 11:35:48) [GET]
[INFO|# 5584|2008-03-11 11:35:48] | Session ID: 7e022c9982f2d317480f10f104c92407
[INFO|# 5584|2008-03-11 11:35:48] | Parameters: {"action"=>"show", "id"=>"14", "controller"=>"messages"}
[DEBU|# 5584|2008-03-11 11:35:48] | [Set SUBDOMAIN] -
[DEBU|# 5584|2008-03-11 11:35:48] debug from log| Received connection from
[INFO|# 5584|2008-03-11 11:35:48] | info from log
[INFO|# 5584|2008-03-11 11:35:48] MainApp| Received connection from
[WARN|# 5584|2008-03-11 11:35:48] | warn from log
[ERRO|# 5584|2008-03-11 11:35:48] | error from log
[FATA|# 5584|2008-03-11 11:35:48] | fatal from log
[DEBU|# 5584|2008-03-11 11:35:48] | Message Columns (0.000000) SHOW FIELDS FROM messages
[DEBU|# 5584|2008-03-11 11:35:48] | Message Load (0.000000) SELECT * FROM messages WHERE (messages.`id` = 14)
[DEBU|# 5584|2008-03-11 11:35:48] | Message Load (0.010000) SELECT * FROM messages WHERE (messages.`id` = 14)
------------ Операции с WM | SEO консультации |
|
| logger ror, logger formatter |
| 10 июня 2008, 08:05 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
pretty logs for rails 1.2 and 2.0 |
Вызов логера с блоком
logger.debug('debug from log'){ "Received connection from" }
logger.info('info from log')
logger.info("MainApp"){ "Received connection from" }
rails 1.2.6
[DEBU|# 5880|2008-03-11 16:07:47] debug from log: Received connection fr
[INFO|# 5880|2008-03-11 16:07:47] : info from log
[INFO|# 5880|2008-03-11 16:07:47] MainApp: Received connection from
rails 2.0.2
[DEBU|# 5880|2008-03-11 16:07:47] debug from log
[INFO|# 5880|2008-03-11 16:07:47] : info from log
[INFO|# 5880|2008-03-11 16:07:47] MainApp
И так после путем долгий патчей получилась такая версия которая работает с обеими версиями rails 1.2x and 2.0
и так подключаем app/config/environment.rb
Rails::Initializer.run do |config|
....
end
require 'logger_core_ext'
Содержимое app/lib/logger_core_ext.rb
=begin
====app/config/environment.rb
require 'logger_core_ext'
=end
class Logger
# Used for rails 1.2.x
alias format_message old_format_message
class Formatter
def call(severity, time, progname, msg)
"[%s|#%5d|%s] %s: %s\n" % [severity[0..3], $$, time.to_s(:db), progname, msg2str(msg)]
end
end
end
module ActiveSupport
# Used for rails 2.0
class BufferedLogger
module Severity
def level_to_s(level)
case level
when 0
'DEBUG'
when 1
'INFO'
when 2
'WARN'
when 3
'ERROR'
when 4
'FATAL'
when 5
'UNKNOWN'
end
end
end
def add(severity, message = nil, progname = nil, &block)
return if @level > severity
# message = (message || (block && block.call) || progname).to_s
message = (message || (block && block.call) || progname).to_s
# If a newline is necessary then create a new message ending with a newline.
# Ensures that the original message is not mutated.
message = "#{message}\n" unless message[-1] == ?\n
message = "[%s|#%5d|%s] %s: %s" % [level_to_s(severity)[0..3], $$, Time.now.to_s(:db), progname, message]
@buffer << message
auto_flush
message
end
end
end
------------ Операции с WM | SEO консультации |
|
| logger rails 2.0, pretty logger rails, logger format |