.net протоколирование с поддержкой Eventid
Ищете замену для входа в существующее (почти устаревшее) приложение. Это регистрирует события на основе eventId и имеет dll, сконфигурированный как файл сообщений о событиях (регистрация ведется в журнал событий и очередь сообщений). Вся регистрация зависит от идентификатора события, так как некоторые зарегистрированные события загружаются на предприятие, где они интернационализируются на основе идентификатора события. К этой инфраструктуре ведения журналов также было добавлено некоторое ведение журнала файлов, в котором используется не этот файл сообщений о событиях, а записанные в журнал простые строки (собственно с поддержкой переноса файлов и архивирования).
Я искал каркас журналирования, который будет иметь стандартный интерфейс для ведения журнала на основе идентификатора (Error(id, object[] args)) и "простых" сообщений (Error (строковое сообщение, object[] args)).
Кажется, что ни log4net, ни nlog не имеют таких интерфейсов.
Есть ли какие-либо рамки каркаса журналов, поддерживающие это, или я должен построить самостоятельно. Или адаптировать как-нибудь log4net / nlog для этого.
спасибо, флорин
4 ответа
Посмотрите на блок приложения регистрации в Enterprise Library: http://msdn.microsoft.com/en-us/library/cc511708.aspx
Вы также можете интегрировать ведение журнала унаследованного приложения в свою обычную инфраструктуру ведения журналов. Это может быть легко достигнуто с помощью функции маршрутизации.net Common.Logging, которая является абстракцией каркасов журналирования (она поддерживает enteprise lib, log4net, NLog, System.Trace).
Смотрите эту ссылку для "расширения" log4net, которое позволяет достаточно легко добавлять идентификаторы событий в сообщения журнала.
Вот сокращенный фрагмент ссылки log4net:
public interface IEventIDLog : ILog
{
void Info(int eventId, object message);
void Info(int eventId, object message, Exception t);
}
public class EventIDLogImpl : LogImpl, IEventIDLog
{
/// <summary>
/// The fully qualified name of this declaring type not the type of any subclass.
/// </summary>
private readonly static Type ThisDeclaringType = typeof(EventIDLogImpl);
public EventIDLogImpl(ILogger logger) : base(logger)
{
}
#region Implementation of IEventIDLog
public void Info(int eventId, object message)
{
Info(eventId, message, null);
}
public void Info(int eventId, object message, System.Exception t)
{
if (this.IsInfoEnabled)
{
LoggingEvent loggingEvent = new LoggingEvent(ThisDeclaringType, Logger.Repository, Logger.Name, Level.Info, message, t);
loggingEvent.Properties["EventID"] = eventId;
Logger.Log(loggingEvent);
}
}
}
Я не вижу причин, почему вы не могли бы сделать что-то подобное с NLog. Вот ссылка на некоторые примеры расширения NLog Logger в исходном репозитории GitHub от NLog.
Также отмечу, что System.Diagnostics.TraceSource также поддерживает ведение журнала EventId. Если вы рассматриваете System.Diagnostics, вы можете также рассмотреть возможность использования Ukadc.Diagnostics, чтобы получить некоторые сильные возможности форматирования, аналогичные тем, что вы можете сделать с log4net и NLog.
TraceSource.TraceEvent-Methode предоставляет возможность передавать числовой идентификатор для события журнала, а также методы, которые можно использовать для регистрации "простых" сообщений.