Frage Wie kann Rails Zeilennummern / Zeitstempel hinzufügen, um Nachrichten zu protokollieren?


ich benutze tail -f um die Protokolldatei beim Entwickeln meiner Rails-App anzuzeigen. Es zeigt die Log-Nachrichten (in Farbe! :), was großartig ist.

Aber mit so vielen Informationen in der Konsole mit 80 Breiten wird es schwierig zu verfolgen, wo ein bestimmter "Satz" von Protokollnachrichten gestartet wurde, wenn ich zum Beispiel auf eine Schaltfläche geklickt habe, um eine Ressource zu holen.

Es wäre einfacher, wenn zu Beginn jeder Protokollnachricht / Zeile eine Zeilennummer oder sogar ein Zeitstempel vorhanden wäre. Auf diese Weise konnte ich mich daran erinnern, dass ich das Log "nach der Linie 2365" oder "nach 2010/10/10 23: 33: 23: 45" betrachten muss.

Ist das möglich? Gibt es dafür eine interne Rails-Option?


6
2017-12-24 00:15


Ursprung


Antworten:


Warum bearbeiten Sie nicht einfach die Log-Tags Ihrer gewünschten Umgebung?

Entwicklung.rb

config.log_tags [ lambda {|r| DateTime.now } ]

8
2018-01-15 21:56



Wenn Sie einen Zeitstempel erhalten möchten:

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

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

Und formatieren Sie das Datum, wie Sie es für richtig halten.

Das würde für Rails 2.1 + funktionieren, bevor Sie auf die ActiveSupport::Buffered Log-Objekt mit der Konstante: RAILS_DEFAULT_LOGGER

Erhalte Zugriff auf die aktuelle Protokolldatei mit Rails.logger.instance_values["log"]

Es ist schwierig, die Anzahl der Zeilen zu ermitteln, da der Logger die Datei nur zum Schreiben öffnet, wahrscheinlich aus Kostengründen. Ich bekomme ein IOError: not opened for reading wenn ich es versuche. `


3
2017-12-24 01:23



Danke @scany.

Ich habe eine Lösung gefunden Hier.

Ich habe diesen Code modifiziert, um meine eigenen farblichen Highlights hinzuzufügen (natürlich nur für die Entwicklung!) Und jetzt kann ich in der Konsole Dinge wie "Parameter" in Gelb sehen und ich bin jetzt sehr zufrieden!

Falls jemand interessiert ist, hier ist der Code, den ich am Ende gestellt habe environment.rb. Hier ist meine aktuelle (schmutzige) Implementierung. Vermutlich wird er das später beheben (vielleicht ein Juwel machen, aber im Moment dient das mich fein)

WARNUNG

DIRTY CODE FOLGT! Benutzung auf eigene Gefahr!

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

1
2017-12-24 02:09