调用log4net包装器方法后,没有在日志中获取文件名和亚麻

时间:2016-07-27 05:55:59

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

我已经创建了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类的构造函数调用。

文件名和亚麻布我都错了。我错过了什么。

2 个答案:

答案 0 :(得分:0)

据我所知,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#

答案 1 :(得分:0)

您将在此答案中找到所需内容:https://stackoverflow.com/a/3448439/106567

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

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

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