Question

Je dois vraiment manquer quelque chose évidente, mais je vais avoir du mal à usage général de Log4r dans mon application Ruby. Je suis en mesure de se connecter sans problème, mais les frais généraux semble maladroit comme je l'ai configuration. Je passe essentiellement le chemin complet vers un nom de fichier pour ouvrir une session dans chaque classe dans ma demande. Le script Ruby qui est appelé tire le fichier journal de l'un des arguments argv qui est ensuite transmis et réglée dans chaque classe que j'appelle en rubis. Dans chaque classe j'utilise le patternFormatter pour insérer le nom de classe / fichier dans l'instruction journal.

Y at-il une meilleure façon de faire ce travail? Il se sent comme peu importe ce que je pense, il faudra quelque chose à transmettre à chaque classe dans mon application rubis. Je pourrais définir le fichier journal dans un fichier de configuration YAML à la place, mais je passerai dans le fichier de configuration à chaque classe ainsi.

Un conseil? Si cela n'a pas de sens que je pourrais essayer de poster quelques exemples de code plus spécifiques pour expliquer davantage ce que je veux dire.

Merci!

Était-ce utile?

La solution

Hmm, aucune raison pour laquelle vous n'instancier classe Log4r::Logger au début de votre script et passez l'instance autour? Vous ne devez même pas passer autour, vous pouvez toujours obtenir par son nom de classe Logger:

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

et lorsque vous exécutez run.rb vous obtenez:

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

et un fichier journal nommé logtest.log sur le disque.

Autres conseils

Je suis le responsable de log4r,

Pour les scripts individuels (différents fichiers .rb), vous pourriez aborder cette question de différentes façons (montage, je sais), tout d'abord, garder à l'esprit que les caractéristiques que je suis ici couvrant sont disponibles dans> = 1.1.4.

Une façon serait de définir une chaîne de PatternFormatter différente par le script (si vous créez un fichier de configuration YAML ou XML, vous pouvez spécifier différents modèles sur une base par nom de classe).

Une autre façon serait d'utiliser l'un des GDC, NDC ou MDC dans un PatternFormatter.

GDC établira un « contexte mondial de diagnostic », qui est de dire, il est une valeur qui est disponible à partir de tous les threads en cours d'exécution d'un script. Vous pouvez l'utiliser en mettant g% dans le motif et le réglage de la valeur via GDC.set (String) pour des informations plus détaillées, voir: http://log4r.rubyforge.org/manual.html

NDC et MDC sont emboîtés et cartographiées de diagnostic Contextes respectivement. Le modèle pour ces derniers est d'utiliser% x et X% {Symbole | Object}, et de les mettre par NDC.set (String) et MDC.put (Symbole | Object, Object)

Une autre façon serait d'utiliser le motif% t, qui imprime le numéro de nom de fichier et de la ligne où l'appel a été fait.

Le compromis entre chacune de ces méthodes est qu'ils sont de plus en plus cher dans l'utilisation des ressources CPU. J'ai tendance à utiliser d'abord GDC pour le genre de chose que vous demandez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top