2013-02-13 20 views
22

私は現在、組み込みのTraceListenerを使用してアプリケーションログライブラリを開発しています。このライブラリは多くのプロジェクトで使用され、単純なインターフェースを提供する必要があります。ここでは、何がログファイルに書き込まれるかについてのみ気を付けなければなりません。呼び出し方法とクラス名を調べる方法は?

リフレクション空間を使用することで、現在どのアプリケーションがログ関数(実行アセンブリ名の取得)と呼ばれているかを知ることができますが、ログ機能を呼び出す関数とクラスの名前も必要です。

のは、私が持っているとしましょう:

私は別のプロジェクトから呼び出す
public static void LogInfo(string vLogText) { 
    Trace.WriteLine(
     MethodInfo.GetCurrentMethod().Name 
     + this.GetType().ToString() + vLogText); 
    } 

(クラス:TestClassを、方法:のtestMethod)

Tracer.LogInfo("log this!") 

私がログに見ることを期待:

TestClass, TestMethod, log this! 

代わりに私は

TracerClass, LogInfo, log this! 

親メソッドとクラス名の取得方法は?

var mth = new StackTrace().GetFrame(1).GetMethod(); 
var cls = mth.ReflectedType.Name; 
// where 1 illustrates how deep into the stack to reflect. 

あなたが助ける上で、古いフレームワークを使用しているが場合はよりエレガントな解決策は、C#5.0>にあります。

+5

最新のC#とVS 2012を使用している場合は、[これは非常に役に立ちます](http://msdn.microsoft.com/en-us/library/hh534540.aspx) –

+0

@ Trustme-I'maDoctor This華麗です!そんなことは知らなかった。あなたはコメントの代わりにこれを答えにして投票できるようにして、それを閉鎖してマークすることができますか?どうもありがとうございました。 – Neurodefekt

+0

@Neurodefekt問題はありません。お役に立てて嬉しいです。 :) –

答えて

27

Caller Information(つまりCallerFilePathAttribute,CallerLineNumberAttributeおよびCallerMemberNameAttribute)と一緒に出荷された最新のC#およびVS 2012は、使用できる場合に役立ちます。

できない場合は、他の回答を参照する必要があります。

+1

これは私にとって素晴らしい答えのようですが、私はいつもそのような目的のためにstackTraceにアクセスすることを躊躇します。 1つの質問は、事前コンパイルプロセッサのように思えますが、ILコード内の実際の呼び出し元の名前に置き換えられます。誰かがILコードを難読化するのを好むなら、私は安全ではないと思っていました。それに関するコメント? –

+1

@MubasharAhmad [documentation](https://msdn.microsoft.com/en-us/library/mt653988.aspx)から: "呼び出し元の情報値は、コンパイル時に中間言語(IL)にリテラルとして出力されます。例外のStackTraceプロパティの結果、結果は難読化の影響を受けません。 –

16

はこのような何かをやってみてください。

+13

2つのこと:1)これはパフォーマンスに重大な影響を与える可能性があります。2)最適化されたコードでは、メソッドのインライン展開によって不正なメソッド名が出力されることがあります。 –

2

Environment.StackTraceを使用して呼び出したメソッドだけでなく、完全なスタックトレースを記録することもできます。これは、同じロギング構造を使用して例外を記録する場合に役立ちます。

詳細については、this msdn pageを参照してください。

関連する問題