2010-02-17 10 views

risposta

0

È possibile creare il proprio logger sovraccaricando i Logger class

+0

Non c'è un modo semplice senza scrivere molto codice? – turri

+0

@turri non che io sappia. Sembra che i livelli siano praticamente codificati in (Logger :: INFO e così via). Forse c'è un altro modo, ma non riesco a pensarci adesso – marcgg

3

livelli di log non sono altro che interi costanti definite in logger.rb:

# Logging severity. 
module Severity 
    DEBUG = 0 
    INFO = 1 
    WARN = 2 
    ERROR = 3 
    FATAL = 4 
    UNKNOWN = 5 
end 

È possibile registrare i messaggi con qualsiasi livello ti piace usare Logger#add metodo:

l.add 6, 'asd' 
#=> A, [2010-02-17T16:25:47.763708 #14962] ANY -- : asd 
3

Il proprio data logger deve solo sovrascrivere lo Logger#format_severity metodo, qualcosa di simile:

class MyLogger < Logger 

    SEVS = %w(DEBUG INFO WARN ERROR FATAL VERBOSE TRAFFIC) 
    def format_severity(severity) 
    SEVS[severity] || 'ANY' 
    end 

    def verbose(progname = nil, &block) 
    add(5, nil, progname, &block) 
    end 
end 
+0

IMO, questa è una risposta migliore perché evita la patch della scimmia del nucleo di Ruby. + – sethvargo

4

Si può semplicemente aggiungere alla classe Logger:

require 'logger' 

class Logger 
    def self.custom_level(tag) 
    SEV_LABEL << tag 
    idx = SEV_LABEL.size - 1 

    define_method(tag.downcase.gsub(/\W+/, '_').to_sym) do |progname, &block| 
     add(idx, nil, progname, &block) 
    end 
    end 

    # now add levels like this: 

    custom_level 'TRAFFIC' 
    custom_level 'ANOTHER-TAG' 
end 


# using it: 

log = Logger.new($stdout) 
log.traffic('testing') 
log.another_tag('another message here.') 
2

Se si avvia bisogno di un sacco di roba su misura, può essere la pena di verificare log4r, che è una libreria di registrazione flessibile che ti permette di fare un sacco di cose interessanti/utili facilmente.

0

Questa è una vecchia domanda, ma dato che è così in alto su google, ho pensato che sarebbe stato utile dover correggere la risposta. È possibile utilizzare effettivamente il metodo Logging.init. Ecco come si dovrebbe aggiungere un livello di log trace

require 'logging' 
Logging.init %w(trace debug info warn error fatal) 
Logging.logger.root.level = :trace 
Logging.logger.root.add_appenders Logging.appenders.stdout 
Logging.logger['hello'].trace 'TEST' 

Questo sta usando il 2.0.0 del logging gemma.

Problemi correlati