Pergunta

Devo realmente estar perdendo algo óbvio, mas estou tendo problemas com o uso geral do LOG4R no meu aplicativo Ruby. Sou capaz de registrar sem problemas, mas a sobrecarga parece desajeitada da maneira que eu a tenho. Estou basicamente passando o caminho completo para um nome de arquivo para fazer login em cada classe em meu aplicativo. O script Ruby que é chamado puxa o arquivo de log de um dos argumentos no ARGV, que é transmitido e definido em cada classe que eu chamo de rubi. Em cada classe, uso o PatternFormatter para inserir o nome da classe/arquivo na instrução LOG.

Existe uma maneira melhor de fazer isso funcionar? Parece que não importa o que eu acho que exigirá que algo seja passado para cada classe no meu aplicativo Ruby. Eu poderia definir o arquivo de log em um arquivo de configuração da YAML, mas também passaria o arquivo de configuração para cada classe.

Algum conselho? Se isso não faz sentido, eu poderia tentar postar algumas amostras de código mais específicas para explicar melhor o que quero dizer.

Obrigado!

Foi útil?

Solução

Hmm, qualquer motivo pelo qual você não instancie Log4r::Logger aula no início do seu script e passa a instância? Você nem precisa passar por aí, sempre pode obtê -lo pelo nome de Logger classe:

run.rb:

require 'log4r'
require 'class_a'

logger = Log4r::Logger.new('test')
logger.outputters << Log4r::Outputter.stdout
logger.outputters << Log4r::FileOutputter.new('logtest', :filename =>  'logtest.log')
logger.info('started script')
a = A.new
a.do_something
logger.info('finishing')

Class_a.rb:

class A
  def do_something
    logger = Log4r::Logger['test']
    logger.info('in do_something')
    puts 'hi!'
  end
end

E quando você corre run.rb você recebe:

$ ruby run.rb 
 INFO test: started script
 INFO test: in do_something
hi!
 INFO test: finishing

e um arquivo de log nomeado logtest.log no disco.

Outras dicas

Eu sou o mantenedor do log4r,

Para scripts individuais (diferentes arquivos .rb), você pode abordar isso de algumas maneiras diferentes (encaixando, eu sei), primeiro, esteja atento que os recursos que estou cobrindo aqui estejam disponíveis em> = 1.1.4.

Uma maneira seria definir uma string de formato padrão diferente por script (se você criar um arquivo de configuração YAML ou XML, poderá especificar diferentes padrões com base no nome da classe).

Outra maneira seria usar um de GDC, NDC ou MDC em um padrão de formato.

A GDC definirá um "contexto de diagnóstico global", ou seja, é um valor disponível em todos os threads executando um script. Você pode usá -lo colocando %G no padrão e definindo o valor via GDC.set (String) para obter informações mais detalhadas, consulte: http://log4r.rubyforge.org/manual.html

NDC e MDC são contextos de diagnóstico aninhados e mapeados, respectivamente. O padrão para isso é usar %x e %x {símbolo | objeto} e defini -los via ndc.set (string) e mdc.put (símbolo | objeto, objeto)

Outra maneira seria usar o padrão %t, que imprime o nome do arquivo e a linha de onde a chamada foi feita.

A troca entre cada um desses métodos é que eles são progressivamente mais caros no uso de recursos da CPU. Costumo usar primeiro o GDC para o tipo de coisa que você está pedindo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top