【问题标题】:Not getting the filename and linenumber in log after calling log4net wrapper method调用 log4net 包装器方法后未在日志中获取文件名和行号
【发布时间】:2016-07-27 05:55:58
【问题描述】:

我已经创建了如下的 log4net 包装类

public class Logger : ILogger
{

    private log4net.ILog _logger = log4net.LogManager.GetLogger(typeof(Logger));


    public void MyMethod(object message, params object[] args)
    {
        if (args.Length == 0 || args == null)
        {
            _logger.Info(message);
        }
        else
        {
            _logger.InfoFormat(message.ToString(), args);
        }
    }
 }

我在控制器类中调用包装方法

   Logger obj=new Logger(); 
   obj.MyMethod("Constructor of AccountController class called.");

我在 webconfig 中将布局模式定义为

<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="C:\Log\My.log" />
      <param name="AppendToFile" value="true"/>     
      <maximumFileSize value="500KB" />
      <maxSizeRollBackups value="2" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date,%file(%line), [%-5level],%message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingFile" />
    </root>
  </log4net>

按照我期望遵循日志的模式

2016-07-27 10:12:48,480,e:\MyProject\Controllers\AccountController.cs(24), [INFO ],调用 AccountController 类的构造函数。

但我得到了

2016-07-27 10:12:48,480,e:\MyProject\Infrastructure\Utilities\Logger.cs(15), [INFO ], AccountController 类的构造函数被调用。

文件名和行号我都弄错了。我错过了什么。

【问题讨论】:

    标签: c# asp.net-mvc-4 log4net


    【解决方案1】:

    据我所知,c# 不像 c/c++,获取文件名和行号是不同的。也许它的实现是以下代码:

    string currentFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); 
    int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();
    

    所以,结果不是你所期望的。

    另见Print the source filename and linenumber in C#

    【讨论】:

    • 感谢您的回复,我也可以通过 new StackFrame(0, true);我主要关心的是如何在不更改 PatternLayout 的情况下将此信息传递给 log4net Info 或 InfoFormat 方法
    【解决方案2】:

    你会在这个答案中找到你需要的东西:https://stackoverflow.com/a/3448439/106567

    关键是不要在包装器中使用ILog 接口。相反,您需要使用 Logger 类,您可以像这样调用它:

    _logger.Log(MyLogWrapper.ThisDeclaringType, log4netLevel, message, ex);
    

    重要的部分是第一个参数,它让 log4net 在访问方法名或文件名等内容时删除堆栈跟踪中不需要的部分。以这种方式编写包装器需要更多的工作,但您可以得到您想要的结果。

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多