log4net настраиваемые объекты журнала и appender - PullRequest
3 голосов
/ 26 февраля 2010

Я хотел бы расширить log4net для принятия пользовательских объектов журнала в качестве параметра.Например:

        public class MyLogObject
    {
        public string PropA;
        public int PropB;
    }

    private MyLogObject entry = new MyLogObject() {PropA = "FooBar", PropB = 1};
    Log.Debug(entry);

... это должно работать аналогично исключениям.

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

Кто-нибудь знает, работает ли это с log4net, и если есть какие-то примеры, может помочь мнесделать это?

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

Обновление Моя идея состояла в том, чтобынастроить log4net для использования моего пользовательского «MyAppender» вместе с пользовательским рендерером «MyRenderer».Средство визуализации вернет простой SQL-оператор вставки с записью в базу данных приложением.Может быть, есть лучший способ сделать это.

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Вы можете сохранить свой пользовательский объект в ThreadContext (или в глобальном контексте, если это имеет смысл)

log4net.ThreadContext.Properties ["MyLogObject"] = запись;

Свойство может быть легко извлечено в вашем приложении. Если вы предоставляете переопределение «ToString ()», вы можете даже распечатать его, используя обычные приложения и указав шаблон преобразования:

date% -5level% property {MyLogObject} -% message% newline

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

1 голос
/ 26 февраля 2010

Почему бы не использовать AdoNetAppender? Приложение наследует встроенные возможности буферизации от BufferingAppenderSkeleton .

Если вам не требуется хранить каждое свойство класса MyLogObject в отдельных столбцах таблицы, вы можете переопределить метод ToString(). Строка будет использоваться в качестве значения для журнала% message%:

public class MyLogObject
{
    public string PropA;
    public int PropB;

    override public string ToString()
    {
        return PropA + " " + PropB;
    }
}
...