Я написал оболочку (класс 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. Но, как упоминалось в начале моего вопроса, я хочу, чтобы больше контроля над тем, что отправляется как журнал в файл или базу данных.
Ну дело в том, что мы смотрели на Log4Net, Nlog и т.д. Но ни один из них из коробки регистраторы вставьте журналы в базу данных .. Все они делают это, чтобы писать журналы в файлах на жестком диске. Исправьте меня, если я ошибаюсь, поскольку это то, что я понимаю из этих регистраторов. Для достижения того, что мне нужно для достижения, я также написал пользовательский прослушиватель трассировки, который выполняет работу по вставке журналов в базу данных. – user2913184
NLog может писать в db. Вот некоторая информация: https://github.com/NLog/NLog/wiki/Database-target – wazdev
Прохладный, но все же мне было поручено написать собственный регистратор и пользовательский прослушиватель трассировки. Поэтому мне нужно придерживаться того, что меня попросили сделать. – user2913184