0

我有一个 Windows 服务,它定期运行 4 种不同的方法。我正在使用 log4net 来记录这些方法。

这 4 种不同的方法使用一些相同的其他方法来完成它们的工作。

我的问题是,在日志记录中,我需要知道 4 种方法中的哪一种在给定时间实际使用了其他方法之一。

该问题的一种解决方案是为这些方法正在使用的其他方法配备一个额外的参数,以告知在给定时间哪个方法正在使用另一种方法。

但我只是想知道是否有另一种方法可以做到这一点?能够记录我的 4 种方法中的哪一种在给定时间使用另一种方法?

为我的所有方法配备这个额外的参数似乎有点笨拙,以便知道我的哪些方法发起了对外部方法的调用。

场景也稍微复杂一些,因为有时工作流程是:

我的 Windows 服务方法调用了另一个方法。这个其他方法然后调用另一个方法,该方法再次调用另一个方法,等等。我需要能够追踪我的哪个 Windows 服务方法发起了调用。

所以任务是实现一种机制,这样我就可以知道我的哪些 Windows 服务方法发起了方法调用。

任何想法?除了显而易见的:为所有方法配备一个额外的参数,以传递我的哪个 Windows 服务方法发起了调用?

4

3 回答 3

1

Since you have modified the question, I modifed the answer:

The most clean way is to create a context:

public class Context: IDisposable
{
    [ThreadStatic]
    static private Context _Current;

    static public Context Current
    {
        get
        {
            return _Current;
        }
    }

    private readonly Context _Previous;

    public Context(string id)
    {
        ID = id;
        _Previous = _Current;
        _Current = this;
    }

    public string ID
    {
        get;
        private set;
    }

    public void Dispose()
    {
        _Current = _Previous;
    }
}

You can use this Context to mark your method by creating a context. This context is retrievable at another part in your code:

static void MethodA()
{
    using (new Context("A"))
    {
        SharedMethod();
    }
}

static void MethodB()
{
    using (new Context("B"))
    {
        SharedMethod();
    }
}

static void SharedMethod()
{
    Console.WriteLine(Context.Current.ID);
}

In this example I only showed 2 different methods calling a shared method, but I think you can translate this into four.

于 2013-05-19T19:19:40.120 回答
1

Assuming you cannot modify the code of those four processes (if you could then it's simple matter of putting logging statements in code of those for processes), you could use System.Diagnostics.StackTrace class in the outside methods. Then using GetFrames method on that stack trace object will give you the call stack for that point in code.

StackTrace t = new StackTrace();
StackFrame[] stackFrames = t.GetFrames();

For an example check this.

于 2013-05-19T19:19:52.037 回答
0

If you want this information always, your best bet is to do what you already suggested. Now, if you just want to debug a problem and need to know who called who when, then you can have that info easily with Process Explorer:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

http://blogs.msdn.com/b/vijaysk/archive/2009/04/02/getting-better-stack-traces-in-process-monitor-process-explorer.aspx

于 2013-05-19T19:19:06.677 回答