2010-03-18 3 views
7

Je dois vraiment manquer quelque chose d'évident, mais j'ai des problèmes avec l'utilisation générale de Log4r dans mon application Ruby. Je suis capable de me connecter sans problème, mais les frais généraux semblent maladroits comme je l'ai configuré. Je passe essentiellement le chemin complet à un nom de fichier pour me connecter à chaque classe dans mon application. Le script ruby ​​appelé tire le fichier journal de l'un des arguments de ARGV qui est ensuite transmis et défini dans chaque classe que j'appelle ruby. Dans chaque classe, j'utilise patternFormatter pour insérer le nom de classe/fichier dans l'instruction log.Utiliser correctement Log4r dans Ruby Application

Y a-t-il une meilleure façon de faire ce travail? Il semble que peu importe ce que je pense, il faudra que quelque chose soit transmis à chaque classe dans ma demande de rubis. Je pourrais définir le fichier journal dans un fichier de configuration yaml à la place, mais je transmettrais aussi le fichier de configuration à chaque classe.

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

Merci!

Répondre

12

Hmm, une raison quelconque pour laquelle vous n'instantiez pas la classe Log4r::Logger au début de votre script et passez l'instance? Vous ne devez même pas passer autour, vous pouvez toujours obtenir par son nom 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 

et quand 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.

+0

Je n'arrive pas à faire ce travail. L'appel à Logger ['mylog'] dans un autre fichier .rb renvoie zéro. – Spencer

+0

Et comment dirais-je à Logger quel fichier se déconnecter? – Spencer

+0

Jetez un oeil à l'exemple mis à jour ci-dessus. Que voulez-vous dire quand vous dites "un autre fichier .rb"? –

13

Je suis le responsable de log4r,

Pour les scripts individuels (différents fichiers .rb), vous pouvez aborder cette question de différentes façons (montage, je sais), tout d'abord, soyez conscient que les caractéristiques I Je couvre ici sont disponibles en> = 1.1.4. Une méthode consiste à définir une chaîne PatternFormatter différente par script (si vous créez un fichier de configuration yaml ou xml, vous pouvez spécifier des modèles différents par nom de classe). Une autre façon serait d'utiliser l'un de GDC, NDC ou MDC dans un PatternFormatter. GDC définira un "contexte de diagnostic global", c'est-à-dire, une valeur qui est disponible à partir de tous les threads exécutant un script. Vous pouvez l'utiliser en plaçant% g dans le modèle et en définissant la valeur via GDC.set (String) pour plus d'informations, voir: http://log4r.rubyforge.org/manual.html

NDC et MDC sont des contextes de diagnostic imbriqués et mappés respectivement. Le modèle pour ceux-ci est d'utiliser% x et% X {Symbol | Object}, et de les définir via NDC.set (String) et MDC.put (Symbol | Object, Object)

Encore une autre façon serait de utilisez le Motif% t, qui affiche le nom de fichier et le numéro de ligne de l'appel. Le compromis entre chacune de ces méthodes est qu'elles sont de plus en plus coûteuses en termes d'utilisation des ressources de l'unité centrale. J'ai tendance à utiliser d'abord GDC pour le genre de chose que vous demandez.

+0

Pourriez-vous s'il vous plaît montrer un exemple? (Le lien que vous avez fourni est mort) – Arafangion

Questions connexes