我希望使用log4net将日志文件记录到我的日志文件中.log4net的配置详细信息是以编程方式编写的。我试着记录要记录的行号,但帮助少了,这是我的代码
private IAppender CreateFileAppender(string name,string fileName) {
PatternLayout layout = new PatternLayout();
//layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} %line %-5p : %m%n";
//layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} 5p [%t] (%F:%L) - %m%n";
layout.ConversionPattern = "%5p %d{yyyy-MM-dd hh:mm:ss tt} (%c:%L) - [%X {UserIdentityName}] %m%n";
layout.ActivateOptions();
FileAppender appender = new FileAppender(layout, HCVIEWERLOG_FILENAME, true);
appender.Layout = layout;
appender.Name = HCVIEWERLOG_APPENDER;
appender.File = HCVIEWERLOG_FILENAME;
appender.AppendToFile = true;
string[] Args = Environment.CommandLine.Split
("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach(string txt in Args)
appender.Threshold = txt.ToString().ToUpper().Contains("DEBUG") ?
log4net.Core.Level.Debug : log4net.Core.Level.Off;
appender.ActivateOptions();
return (appender as IAppender);
}
即使我尝试使用stacktrace获取行号,但我将值设为0。 这是代码
受保护的字符串GetLogMessage(字符串消息) {
StackTrace stackTrace = new StackTrace(true);
StackFrame stackFrame = stackTrace.GetFrame(3);
return (stackFrame.GetMethod().DeclaringType.Name
+ "|" + stackFrame.GetMethod().Name
+ "|" + **stackFrame.GetFileLineNumber()**
+ "||||" + message);
}
答案 0 :(得分:3)
这里有两件事:
1)确保pdb文件存在,否则您将始终获得零。
2)小心确保检索正确的堆栈框架。当前堆栈帧是第0个。当你走向堆栈时,你将走过你的代码,但是在堆栈上面的代码上面将是一堆框架调用来启动应用程序,这些将具有零行号。
这段代码说明了这一点:
static void Main(string[] args)
{
WriteOutStack();
Console.ReadLine();
}
public static void WriteOutStack()
{
StackTrace stackTrace = new StackTrace(true);
for (int i = 0; i < (stackTrace.FrameCount); i++)
{
StackFrame stackFrame = stackTrace.GetFrame(i);
Console.WriteLine("{0}.{1} ({2})",
stackFrame.GetMethod().DeclaringType.Name,
stackFrame.GetMethod().Name,
stackFrame.GetFileLineNumber());
}
}
输出:
Program.WriteOutStack (20)
Program.Main (15)
AppDomain._nExecuteAssembly (0)
HostProc.RunUsersAssembly (0)
ExecutionContext.Run (0)
ThreadHelper.ThreadStart (0)
上面的输出显示,一旦我走过构成我的代码的两个层,我就进入了框架本身,没有可用的行号。
我提到这个的主要原因是我注意到,在你的样本中,你得到了一个特定的堆栈框架(第3帧),所以我觉得值得提高。 (换句话说,请确保您没有在上面显示的手动代码中颠倒读取堆栈。)
答案 1 :(得分:1)
如果您将.pdb文件与.dll一起发送,则应在堆栈跟踪中获取行号。