我已经创建了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类的构造函数调用。
文件名和亚麻布我都错了。我错过了什么。
答案 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();
所以,结果不是你所期望的。
答案 1 :(得分:0)
您将在此答案中找到所需内容:https://stackoverflow.com/a/3448439/106567。
关键是不要在包装器中使用ILog
接口。相反,您需要使用Logger
类,您可以这样调用:
_logger.Log(MyLogWrapper.ThisDeclaringType, log4netLevel, message, ex);
重要的部分是第一个参数,它允许log4net在访问方法名称或文件名等内容时删除堆栈跟踪的不需要的部分。以这种方式编写包装器需要更多的工作,但是你可以得到你想要的结果。