以编程方式记录我的应用程序中的行号

时间:2009-07-13 12:18:11

标签: .net log4net

我希望使用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);
    }

2 个答案:

答案 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一起发送,则应在堆栈跟踪中获取行号。