【问题标题】:Add log4net to C# code generated dynamically将 log4net 添加到动态生成的 C# 代码中
【发布时间】:2015-04-21 09:20:48
【问题描述】:

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

【问题讨论】:

    标签: c# log4net codedom


    【解决方案1】:

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

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

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

    var log = Log.Get();

    这样,无论您的代码是通过 CodeDom 动态编译的还是从一开始就在其中,您最终都会得到调用类型的日志实例,而不必使用反射。

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

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2012-04-09
      相关资源
      最近更新 更多