Wir haben Code, um Daten in unserer Webanwendung Ruby 1.8.6 zu protokollieren. Sie nennen es etwa wie folgt:Modul des Aufrufers in Ruby erhalten
$log.info("Some text here")
Jetzt, in der angemeldeten Ausgang, ich möchte das Modul schließen, wo diese Linie erschien. Ich weiß, dass die Kernel#caller
mir ein Array geben wird, wo ich die Datei und Zeilennummer, die die Protokollzeile aufgetreten ist, ziehen kann, aber das will ich nicht. Ich möchte das Modul, nicht den Dateinamen. Die naheliegende Lösung besteht darin, die Protokollzeile so zu ändern, dass sie wie folgt lautet:
und dann das Ergebnis analysieren. Das wird jedoch nicht funktionieren, weil ich versuche, diese Informationen im Standardfall zu extrahieren. Das heißt, ich brauche die Lösung, um zu funktionieren, wenn der Programmierer vergessen hat, das Modul, den zweiten Parameter für die Protokollzeile anzugeben.
Gibt es eine Möglichkeit, dies zu tun? Wenn nicht, muss ich nur mit dem Array caller
auskommen; Die meisten unserer Module befinden sich in separaten Verzeichnissen. Dies wäre eine 80% ige Lösung.
vollständigeres Beispiel, entschuldigen Sie bitte kleinere Syntaxfehler:
in Datei log.rb:
module Log
class Logger
def info(msg, mod = '')
puts "Module: #{mod} Msg: #{msg}"
end
end # class Logger
end # module Log
$log = Log::Logger.new
in Datei foo.rb:
module Foo
class Bar
def do_something
# Do not pass in self.class.name.
# We want the output to look like:
# Module: Foo Msg: I did something!
$log.info "I did something!"
end
end # class Bar
end #module Foo
Ich sehe nicht, wie Sie es tun können, es sei denn, um "Selbst" oder "Bindung" an das Logger-Objekt zu übergeben. Sie müssten die Datei mit den Informationen von 'caller' analysieren, was Sie sicher nicht tun möchten. –