2

MVC アプリケーションの場合、initializeData="CustomWeblog.txt" パラメーターが使用されている場合、カスタム リスナーはログ ファイルを作成しませんが、initializeData="d:\CustomWeblog.txt" はファイルの作成をトリガーします。そのような行動の理由は何ですか?コンソール アプリケーションは、すべてのタイプのリスナーのファイルを生成します。

カスタムクラス:

public class CustomTextWriterTraceListener : TextWriterTraceListener 
{ 
     public CustomTextWriterTraceListener(string fileName) : base(fileName)
}

Web.config (mvc アプリケーション、web.config)

<trace autoflush="true" />
<sources>
  <source name="Trace">    
      <listeners>
        <add name="TextWriterListner"
             type="System.Diagnostics.TextWriterTraceListener, WebTracing" initializeData="Weblog.txt"/>
        <!-- the file is created -->
        <add name="CustomTextWriterListner"
             type="WebTracing.CustomTextWriterTraceListener, WebTracing" initializeData="CustomWeblog.txt"/>
        <!-- the file is not created in MVC application ?! -->
        <add name="CustomTextWriterListnerAbsolutePath"
             type="WebTracing.CustomTextWriterTraceListener, WebTracing" initializeData="d:\CustomWeblog.txt"/>
        <!-- the file is created -->
      </listeners>      
  </source>
</sources>

カスタム リスナーはログ ファイルを作成しません。

発信者:

TraceSource obj = new TraceSource("Trace", SourceLevels.All);
obj.TraceEvent(TraceEventType.Critical,0,"This is a critical message");

このブログこのブログから、いくつかの追加構成を追加しようとしました。しかし、成功はありません。絶対パスを指定する必要がありますか? カスタム リスナー用に別のアセンブリを作成することによる回避策はありますか?

4

2 に答える 2

2

わかりました。最後に、調査をリスナー パスの生成方法に切り替えました。デバッグ中に気付いたのは、ソース リスナー リストに異なるパスが含まれていることです。

  • System.Diagnostics.TextWriterTraceListener リスナー オブジェクトにはフル パスが生成されます。
  • WebTracing.CustomTextWriterTraceListener にはファイル名しかありません。生成されたエラーはありません。

カスタム リッスンが UnauthorizedAccessException 例外を飲み込んだために発生したさまざまな値により、アプリケーションはアクセス許可の問題について通知されずに動作し続けます。

しかし、カスタム リスナーのログ ファイルを保存する場所はどこでしょうか? それらは生成されますか?

TextWriterTraceListenerソース コードへの次のリンクは、パスを理解するのに役立ちました。次のコード:

//initializeData="CustomWeblog.txt", so fileName == "CustomWeblog.txt" here
string fullPath = Path.GetFullPath(fileName); 
string dirPath = Path.GetDirectoryName(fullPath); 
string fileNameOnly = Path.GetFileName(fullPath);

実際のストレージ パスは、[プロジェクト] > [プロパティ] > [Web] > [サーバー: IIS Express:] によって異なります。

c:\Program Files (x86)\IIS Express\CustomWeblog.txt

私がMVCアプリケーションを(管理者として:vs管理者として実行して)デバッディングしている間、ログファイルはそのフォルダーに正しく生成されました。管理者権限なしで VS を実行している場合、カスタム リスナーはファイルをまったく作成しません。

上記のように、ソース コード リスナーを実行したところ、コンストラクター呼び出しcatch(UnauthorisedAccessException) { break; }でトリガーされることがわかりました。new StreamWriter(...)

  • パスへのアクセスが拒否されるのはなぜですか? そうリンク
  • IIS/ASP.NET のすべてのユーザー アカウントとは何ですか?それらの違いは何ですか? (回答の実際のセクション)SOリンク
  • すばらしいビデオ チュートリアル: IIS上の IIS のアプリケーション プールと、Pragime Tech によるアプリケーション プールの構成。

initializeData="d:\CustomWeblog.txt"別の回避策として、属性でパス全体を宣言できます。ただし、適切な権限が必要であることに注意してください。

于 2016-03-06T22:18:42.690 に答える