Добавьте log4net в код C#, сгенерированный динамически

У нас есть код, который компилируется в библиотеку с помощью CodeDom. В некоторые из этих классов я хотел бы добавить операторы log4net.

Я не уверен в синтаксисе добавления следующей строки (чтобы я мог использовать объект журнала для журналов позже в классе) в код, который будет компилироваться динамически:

 private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Пока у меня есть следующее в классе, который строит код:

//create log4net entry
        CodeMemberField log4netField = new CodeMemberField(typeof(log4net.ILog), "log");
        log4netField.Attributes = MemberAttributes.Static | MemberAttributes.Private;

Должен ли я использовать InitExpression? Как в:

log4netField.InitExpression = new CodePrimitiveExpression();

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

Это помогло: MSDN, но в нем нет примеров всего, что мне нужно.

Итак, моя основная проблема заключается в том, как добавить это:

log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Я мало что знаю о CodeDom, но подозреваю, что что-то может не сработать, если я добавлю его как строку?


person Igavshne    schedule 21.04.2015    source источник


Ответы (1)


Вы можете объявить следующее в методе, который возвращает ILog в ваших основных компонентах:

 return LogManager.GetLogger(new StackTrace().GetFrames()[1].GetMethod().DeclaringType);

А затем получите его экземпляр в коде, который динамически компилируется следующим образом:

var log = Log.Get();

Таким образом, независимо от того, был ли ваш код динамически скомпилирован через CodeDom или был там с самого начала, вы всегда будете получать экземпляр журнала для вызывающего типа без необходимости использовать Reflection.

Я использую эту реализацию в своем коде уже почти год, и даже проекты, использующие динамически скомпилированные плагины, могут обрабатывать ведение журнала таким образом без каких-либо заметных побочных эффектов.

person aevitas    schedule 21.04.2015