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

时间:2015-04-21 09:20:49

标签: c# log4net codedom

我们有使用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了解不多,但我怀疑如果我把它添加为字符串可能会有用吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

var log = Log.Get();

这样,无论您的代码是通过CodeDom动态编译还是从一开始就在那里,您总是会得到一个调用类型的日志实例,而不必使用Reflection。

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