Ruby On Rails in UA/Rails plugins и фичи/Расширенное логированеи с помощью log4r

10 июня 2008, 18:54   Расширенное логированеи с помощью log4r
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
Для начала инсталируем джем [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 консультации
09 июня 2008, 02:18   RE: Расширенное логированеи с помощью log4r
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
Добавляем в в начало файла 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 консультации
10 июня 2008, 18:30   No such file to load -- log4r
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
При попытке запустить тесты возникла следующая проблемма 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 консультации
10 июня 2008, 13:56   RE: Расширенное логированеи с помощью log4r
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
Выше приведенные конфига показали что существует проблемма при запуске 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, 06:42   Rails loggger formatter
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
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 консультации
10 июня 2008, 11:05   pretty logs for rails 1.2 and 2.0
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
Вызов логера с блоком 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 консультации
13 августа 2010, 01:37   RE: Расширенное логированеи с помощью log4r
skif
skif
Живет: не указан
Сообщений: 1
Рейтинг: 0.0
Рег: 15 июля 2010

  •  
Ruslan Voloshin А есть ли возможность получить с помощью log4r имя класса, метода и строку (или хотя бы имя файла и номер строки) в которой была затребована запись лога? Аналогично тому как это делает log4j. Не нашел этой фичи, да и вобще сомневаюсь что такое возможно, но было бы очень полезно и удобно.
13 августа 2010, 09:17   RE: RE: Расширенное логированеи с помощью log4r
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
skif Да это есть - это стандартные вещи руби, ндо только почитать документацию по языку, и станет гораздо больше понятно
__FILE__
__LINE__
Операции с WM | SEO консультации