2008-10-23 1 views
2

У меня есть исполняемый файл, который в зависимости от параметра командной строки поставки выглядит примерно так:Как получить вспомогательный метод в классе утилиты, чтобы использовать его журнал вызовов в log4net?

Program.cs -

namespace DiskSpaceReporting 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if(args.Length == 1) 
      { 
       switch(args[0]) 
       { 
        case "-summarytotals": 
         SummaryDiskSpaceReporter.Run(); 
         break; 

        case "-detailed": 
         DetailedDiskSpaceReporter.Run(); 
         break; 
        //...other reporting types 
       } 



      } 
     } 
    } 
} 

SummaryDiskSpaceReporter.cs

namespace DiskSpaceReporting 
{ 
    public class SummaryDiskSpaceReporter 
    { 
     private static IEventIDLog log = EventIDLogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     public static void Run() 
     { 
      log.Info(1234, "Starting"); 
      //...do work 
      string message = Helpers.CreateMessage(messageID); 
      //...do work 
     } 
    } 
} 

DetailedDiskSpaceReporter. cs

namespace DiskSpaceReporting 
{ 
    public class DetailedDiskSpaceReporter 
    { 
     private static IEventIDLog log = EventIDLogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     public static void Run() 
     { 
      log.Info(1234, "Starting"); 
      //...do work 
      string message = Helpers.CreateMessage(messageID); 
      //...do work 
     } 
    } 
} 

Helpers.cs

namespace DiskSpaceReporting 
{ 
    public class Helpers 
    { 
     private static IEventIDLog log = ???    
     public static string CreateMessage(Guid messageID) 
     { 
      log.Info(9876, "Starting"); 
      //...do work 
     } 
    } 
} 

В моей log4net конфигурации У меня есть две отдельные регистраторы, по одному для каждой из SummaryDiskSpaceReporter и DetailedDiskSpaceReporter, потому что их требования лесозаготовительных различны:

<root> 
    <level value="ALL" /> 
    <appender-ref ref="ConsoleLogAppender" /> 
    <appender-ref ref="EventLogAppender" /> 
</root> 

<logger name="DiskSpaceReporting.SummaryDiskSpaceReporter"> 
    <appender-ref ref="SummaryDiskSpaceReporterRollingFileAppender"/> 
</logger> 

<logger name="DiskSpaceReporting.DetailedDiskSpaceReporter"> 
    <appender-ref ref="DetailedDiskSpaceReporterRollingFileAppender"/> 
</logger> 

Оба SummaryDiskSpaceReporter и DetailedDiskSpaceReporter вызывают вспомогательный метод в классе под названием Helpers. Я хочу поместить некоторые записи в методы вспомогательного класса.

Итак, вопрос в том, как мне получить метод Helpers.CreateMessage() для использования того же регистратора, что и его вызывающий?

т.е.

SummaryDiskSpaceReporter.Run() -> использовать DiskSpaceReporting.SummaryDiskSpaceReporter регистратор DetailedDiskSpaceReporter.Run() -> использовать DiskSpaceReporting.DetailedDiskSpaceReporter регистратор.

Приветствия Kev

ответ

2

Я играл с этим вопросом в течение некоторого времени, и, к сожалению, придется отказаться на некоторое время и вернуться к выполнению «реальной» работы. На данный момент, что я пришел с выглядит следующим образом:

Опции 1: Пропустите регистратор в

Это не отличный вариант, но он должен работать нормально, если вы не возражаете соединения вашего помощника, чтобы регистратор. Просто позвольте методу CreateMessage использовать IEventIDLog. Затем вы можете использовать это для входа в правильное переданное в регистраторе.

public static string CreateMessage(Guid messageID, IEventIDLog log) 
{ 
    log.Info(9876, "Starting"); 
    //...do work 
} 

Не совсем блестящий, но он должен работать!

Опция 2: Используйте стеку вызовов

Сделать использование стека вызовов, чтобы найти код вызова и из этого найти тип и получить регистратор вы хотите от этого типа

public static string CreateMessage(Guid messageID) 
{ 
    StackFrame frame = new StackTrace().GetFrame(1); 
    IEventIDLog log = EventIDLogManager.GetLogger(frame.GetMethod().DeclaringType); 
    log.Info(9876, "Starting"); 
    //...do work 
} 

Все еще не блестящий, так как нам нужно прикоснуться к стеку вызовов, и что произойдет, если код вызова не имеет регистратора.

Вариант 3: использование log4net

Это вариант мы хотим использовать, ад это то, что вопрос хочет в своем ответе, , но я до сих пор не работали его еще. :) Просматривая log4net, мы находим классные вещи, такие как класс иерархии, который позволяет нам получить корневой регистратор.

Logger logger1 = ((log4net.Repository.Hierarchy.Hierarchy) log4net.LogManager.GetRepository()).Root; 

Так что я уверен, что есть способ, чтобы получить регистратор один уровень вверх от метода CreateMessage, теперь только найти его. :)

+0

Эй спасибо за ответ .... Я думал о вариантах 1 и 2, но должен быть способ заставить log4net сделать это как можно скорее. – Kev 2008-10-23 07:24:08

Смежные вопросы