将 log4net 添加到动态生成的 C# 代码中

Add log4net to C# code generated dynamically

我们有使用 CodeDom 编译到库中的代码。 在其中一些 classes 中,我想添加 log4net 语句。

我不确定将以下行(以便我稍后可以在 class 中使用日志对象记录)到将动态编译的代码中的语法:

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

到目前为止,我在构建代码的 class 中有以下内容:

//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 知之甚少,但我怀疑如果我将它添加为字符串可能无法正常工作?

您可以在核心组件中 returns ILog 的方法中声明以下内容:

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

然后在动态编译的代码中获取其实例,如下所示:

var log = Log.Get();

这样一来,无论您的代码是通过 CodeDom 动态编译的还是从一开始就在其中,您将始终以调用类型的日志记录实例结束,而无需使用反射。

我已经在我的代码中使用这个实现将近一年了,即使是使用动态编译插件的项目也可以通过这种方式处理日志记录而没有任何明显的副作用。