باستخدام Log4R بشكل صحيح في تطبيق Ruby
سؤال
يجب أن أفتقد شيئًا واضحًا حقًا ، لكنني أواجه مشكلة في الاستخدام العام لـ Log4R في تطبيق Ruby الخاص بي. أنا قادر على تسجيل الدخول بدون مشكلة ، لكن يبدو أن النفقات العامة متعلقة بالطريقة التي أحصل عليها. أنا في الأساس أقوم بتمرير المسار الكامل إلى اسم ملف لتسجيل الدخول في كل فصل في طلبي. يقوم البرنامج النصي Ruby الذي يسمى بسحب ملف السجل من إحدى الوسيطات الموجودة في ArgV والتي يتم تمريرها بعد ذلك وتعيينها في كل فئة أسميها في Ruby. في كل فئة ، أستخدم PatternFormatter لإدراج اسم الفئة/الملف في عبارة السجل.
هل هناك طريقة أفضل لجعل هذا العمل؟ يبدو الأمر وكأنه لا يهم ما أفكر فيه سيتطلب أن يتم نقل شيء إلى كل فصل في تطبيق Ruby الخاص بي. يمكنني تعيين ملف السجل في ملف تكوين YAML بدلاً من ذلك ، ولكن بعد ذلك سأقوم بتمرير ملف التكوين إلى كل فئة أيضًا.
اي نصيحه؟ إذا لم يكن هذا منطقيًا ، يمكنني محاولة نشر بعض عينات التعليمات البرمجية المحددة لتوضيح ما أعنيه.
شكرًا!
المحلول
حسنًا ، أي سبب لا تنشئه Log4r::Logger
الفصل في بداية البرنامج النصي الخاص بك ومرر المثيل؟ ليس عليك حتى تمريره ، يمكنك دائمًا الحصول عليه بالاسم 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
وعند الركض run.rb
لقد حصلت:
$ ruby run.rb
INFO test: started script
INFO test: in do_something
hi!
INFO test: finishing
وملف سجل اسمه logtest.log
على القرص.
نصائح أخرى
أنا مشرف Log4R ،
بالنسبة للبرامج النصية الفردية (ملفات .rb مختلفة) ، يمكنك التعامل مع هذا بعدة طرق مختلفة (مناسبة ، وأنا أعلم) ، أولاً ، تضع في اعتبارك أن الميزات التي أغطيها هنا متوفرة في> = 1.1.4.
تتمثل إحدى الطرق في تعيين سلسلة نمطية مختلفة لكل برنامج نصي (إذا قمت بإنشاء ملف تكوين YAML أو XML ، فيمكنك تحديد أنماط مختلفة على أساس اسم الفئة).
هناك طريقة أخرى تتمثل في استخدام واحدة من GDC أو NDC أو MDC في شكل نمط.
ستقوم GDC بتعيين "سياق تشخيص عالمي" وهذا يعني ، إنها قيمة متوفرة من جميع مؤشرات الترابط التي تشغل البرنامج النصي. يمكنك استخدامه عن طريق وضع ٪ G في النمط وتحديد القيمة عبر gdc.set (سلسلة) للحصول على معلومات أكثر تفصيلاً ، راجع: http://log4r.rubyforge.org/manual.html
NDC و MDC متداخلة وتعيين سياقات تشخيصية على التوالي. نمط هذه هو استخدام ٪ x و ٪ x {symbol | object} ، وتعيينها عبر ndc.set (سلسلة) و mdc.put (كائن رمز | كائن ،)
هناك طريقة أخرى تتمثل في استخدام Pattern ٪ T ، الذي يطبع اسم الملف ورقم السطر للمكان الذي تم إجراء المكالمة.
إن التجارة بين كل من هذه الطرق هي أنها أكثر تكلفة تدريجياً في استخدام موارد وحدة المعالجة المركزية. أميل أولاً إلى استخدام GDC لنوع الشيء الذي تطلبه.