Как заставить Rails добавлять номера строк / временные метки в лог сообщения? - PullRequest
6 голосов
/ 24 декабря 2010

Я использую tail -f для отображения файла журнала при разработке моего приложения Rails. Он показывает сообщения журнала (в цвете! :), что здорово.

Но с таким большим количеством информации в консоли шириной 80 становится трудно отследить, где начался определенный «набор» сообщений журнала, когда, скажем, я нажал кнопку, чтобы получить ресурс.

Было бы проще, если бы в начале каждого сообщения / строки журнала был номер строки или даже отметка времени. Таким образом, я мог вспомнить, что мне нужно начать просматривать журнал «после строки № 2365» или «после 2010/10/10 23: 33: 23: 45».

Возможно ли это сделать? Есть ли какая-нибудь внутренняя опция Rails для этого?

Ответы [ 3 ]

8 голосов
/ 16 января 2013

почему бы вам просто не отредактировать теги журналов желаемой среды

development.rb

config.log_tags [ lambda {|r| DateTime.now } ]
3 голосов
/ 24 декабря 2010

Если вы хотите получить метку времени:

class ApplicationController < ActionController::Base
  # ...
  before_filter :log_tracker

  def log_tracker
    Rails.logger.add(1, "Log Date: #{DateTime.now}")
  end
end

И отформатируйте дату так, как считаете нужным ....

Это будет работать для Rails 2.1 +, до того, как вы сможетеполучить доступ к объекту журнала ActiveSupport::Buffered с помощью константы: RAILS_DEFAULT_LOGGER

Получить доступ к актуальному файлу журнала с помощью Rails.logger.instance_values["log"]

Получить количество строк сложно, поскольку регистратор открывает толькофайл для записи, вероятно, для экономии.Я получаю IOError: not opened for reading, когда пытаюсь.`

1 голос
/ 24 декабря 2010

Спасибо @ scaney.

Я нашел решение здесь .

Я изменил этот код, добавив свои собственные цвета подсветки (только для разработки, конечно!), И теперь я вижу в консоли такие вещи, как «параметры» в желтом, и теперь я очень доволен!

Если кому-то интересно, вот код, который я поставил в конце environment.rb.Вот моя текущая (грязная) реализация.Возможно, исправлю это позже (возможно, сделаю драгоценный камень, но пока это служит мне отлично)

ПРЕДУПРЕЖДЕНИЕ

DIRTY CODEСЛЕДУЮЩЕМ!Используйте на свой страх и риск!

module ActiveSupport
  class BufferedLogger

    #define the ANSI escape codes for normal and bright colors
    $my_my_ansi_colors = {

      :normal => "\x1B[0m",

      :black => "\x1B[30m",
      :red => "\x1B[31m", #red
      :green => "\x1B[32m",
      :yellow => "\x1B[33m",
      :blue => "\x1B[34m",
      :magenta => "\x1B[35m",
      :cyan => "\x1B[36m",
      :white => "\x1B[37m",

      :bred => "\x1B[1m\x1B[31m", #bright red
      :bgreen => "\x1B[1m\x1B[32m",
      :byellow => "\x1B[1m\x1B[33m",
      :bblue => "\x1B[1m\x1B[34m",
      :bmagenta => "\x1B[1m\x1B[35m",
      :bcyan => "\x1B[1m\x1B[36m",
      :bwhite => "\x1B[1m\x1B[37m",
    }

    #take a string and using the keys in the hash, replace the keys in the 
    #string but surround the keys with ANSI color codes
    #No idea how to retain the case of the key!(TODO someday)
    def my_highlight msgx,hash
      return msgx if msgx.blank?
      return msgx if hash.empty?
      hash.each_pair do |k,v|
        if not k.nil?
          msgx.gsub! Regexp.new(k, Regexp::IGNORECASE), $my_my_ansi_colors[:normal]+$my_my_ansi_colors[v]+k.upcase+$my_my_ansi_colors[:normal]
        end
      end
      msgx
    end


    def add(severity, message = nil, progname = nil, &block)
      return if @level > severity

      message = (message || (block && block.call) || progname).to_s

      #INSERT BEGINS
      if not $myownglobalnumbercounter.nil?
        $myownglobalnumbercounter += 1
      else
        $myownglobalnumbercounter = 1
      end

      level = {
        0 => "DEBUG",
        1 => "INFO",
        2 => "WARN",
        3 => "ERROR",
        4 => "FATAL"
      }[severity] || "U"

      message = "\x1B[0m[%d %s] : %s" % [$myownglobalnumbercounter,level,message]
      message = my_highlight message, {
        "debug" => :white,
        "error" => :bred,
        "info" => :bwhite,
        "warning" => :byellow,
        "warn" => :byellow ,
        "parameters" => :byellow,
        "#" => :bgreen,
        "ms " => :bmagenta,
        "GET " => :bmagenta,
        "PUT " => :bmagenta,
        "POST " => :bmagenta,
        "DELETE " => :bmagenta
        }
      #INSERT ENDS

      message = "#{message}\n" unless message[-1] == ?\n
      buffer << message
      auto_flush
      message
    end
  end
end
...