2016-03-03 4 views
0

Я написал оболочку (класс Custom Logger) вокруг класса TraceSource, чтобы иметь больше контроля над тем, как другие разработчики будут использовать этот пользовательский Logger и данные/сообщения журнала на разных уровнях.Как сделать обертку безопасным потоком класса TraceSource

Ниже приведен код с реализацией только для подробных, ошибок и информационных уровней.

public class Logger : ILogger 
{ 
    private const int DEF_ERROR_EVENT_ID = 2; 
    private const int DEF_INFORMATION_EVENT_ID = 4; 
    private const int DEF_DEBUG_EVENT_ID = 5; 
    private static TraceSource source = null; 

    public Logger(string nameOfComponent) 
    { 
     source = new TraceSource(nameOfComponent); 
    } 

    public void LogDebug(Type type, string methodName) 
    { 
     if (type!=null) 
      throw new ArgumentNullException(type.ToString()); 
     source.TraceEvent(TraceEventType.Verbose, DEF_DEBUG_EVENT_ID, string.Format("{0}.{1}",type.ToString(),methodName)); 
    } 


    public void LogError(string message, Exception ex) 
    { 
     if (String.IsNullOrEmpty(message) && ex == null) 
      throw new ArgumentNullException(message, ex.ToString()); 
     source.TraceData(TraceEventType.Error, DEF_ERROR_EVENT_ID, message, ex); 
    } 

    public void LogInformation(string message) 
    { 
     if (String.IsNullOrEmpty(message)) 
      throw new ArgumentNullException(message); 
     source.TraceInformation(message); 
    } 
    } 

Я инициализации статической переменной «источник» в классе Logger не-конструктор по умолчанию (учитывая тот факт, что этот код будет работать в многопоточном среде) эта практика отлично с точки зрения безопасности потоков? Хотя в документации MSDN говорится, что TraceSource является потокобезопасным, и различные методы, такие как TraceSource.TraceData(), TraceSource.TraceEvent() и т. Д., Также учитывают безопасность потоков во всех прослушивателях трассировки, записывающих журналы трассировки. Поскольку я планирую для создания экземпляра класса Logger индивидуально для каждого класса в моем веб-приложении, как показано ниже.

private ILogger log = new Logger("name of the source/class"); 

Что было бы лучшим способом сделать это в многопоточной среде? Будет ли использование контейнера DI, такого как Ninject или Autofac, сделать класс Logger потокобезопасным, или я должен создать синглтон и использовать его или повторно использовать его во всем приложении, чтобы сделать его потокобезопасным. Проблема, с которой я столкнулся, если я создаю одиночный экземпляр класса Logger, заключается в том, что я не смогу передать строку в качестве параметра в класс конструктора нестандартного класса Logger и, в конечном итоге, такую ​​же строку для класса TraceSource, чтобы узнать имя источника или компонента на ходу или «на лету».

Некоторые из вас могут сказать, почему я повторно изобретаю колеса и создаю обертку вокруг TraceSource, а не напрямую используя TraceSource. Но, как упоминалось в начале моего вопроса, я хочу, чтобы больше контроля над тем, что отправляется как журнал в файл или базу данных.

ответ

0

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

private static Logger logger = LogManager.GetLogger("MyClassName"); 

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

Подробнее здесь: https://github.com/NLog/NLog/wiki/Tutorial

Nlog легко настраивается, и, кажется, подходит для цели для случая использования вы описали.

НТН

+0

Ну дело в том, что мы смотрели на Log4Net, Nlog и т.д. Но ни один из них из коробки регистраторы вставьте журналы в базу данных .. Все они делают это, чтобы писать журналы в файлах на жестком диске. Исправьте меня, если я ошибаюсь, поскольку это то, что я понимаю из этих регистраторов. Для достижения того, что мне нужно для достижения, я также написал пользовательский прослушиватель трассировки, который выполняет работу по вставке журналов в базу данных. – user2913184

+0

NLog может писать в db. Вот некоторая информация: https://github.com/NLog/NLog/wiki/Database-target – wazdev

+0

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