2011-07-29 9 views
3

私たちはプロジェクトを展開しようとしていますが、elmahにwwwrootの外部にxmlログを作成させることはできません。それは現在、inetpub {site} \ wwwroot \ App_Dataにログを記録しています。これは、これが動作している唯一のパスだからです。私たちはinetpub {site} \ logsフォルダにログを記録します。これを稼働させるためのアイデアはありますか?私たちはすでにフォルダへの\と../パスを試しましたが、うまく動作していないようです。Elmah logPath outside wwwroot

答えて

2

これを動作させるためのアイデアはありますか?

ログファイルの絶対パスを指定できますが、IISでWebアプリケーションを実行するように構成されているアカウントには、このフォルダへの書き込み権限があるため、内部でファイルを作成および変更できるようにする必要があります。

1

Darinが述べたように、Webアプリケーションが実行されているユーザーアカウントでログフォルダにアクセスできるようにしましたか。私は相対的なパスがうまくいくはずだと思いますか?また、フォルダが存在することを確認しますか?

3

ELMAH logPathはWeb.configでのみ設定でき、仮想パス( "〜/"で始まる場合)または絶対ファイルシステムパスのいずれかになります。

<elmah> 
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" /> 

しかし、プログラムELMAH LOGPATHを設定するには、どのように回避策があります:Web.configファイルでELMAH LOGPATHのデフォルトの設定ではある

public class MvcApplication : HttpApplication 
{ 
    private static string _elmahDirectory; 
    private static readonly FieldInfo ElmahLogPathField = typeof(XmlFileErrorLog).GetField("_logPath", BindingFlags.NonPublic | BindingFlags.Instance); 

    protected void Application_Start() 
    { 
     // Assign your path here 
     _elmahDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     ... 
    } 

    protected void Application_BeginRequest() 
    { 
     var xmlFileErrorLog = (XmlFileErrorLog)Elmah.ErrorLog.GetDefault(HttpContext.Current); 
     ElmahLogPathField.SetValue(xmlFileErrorLog, _elmahDirectory); 
    } 
} 
0

あなたがコードから代わりのでLOGPATHを設定する必要がある場合設定ファイルに設定するには、以下のようにします。

デフォルトでは、ELMAHはweb.configファイルを読み取り、作成するErrorLogの実装を見つけます。ただし、このメカニズムをオーバーライドして、独自のIServiceProvider実装を実装し、ServiceCenter.Currentプロパティを使用してインスタンスを返すデリゲートを登録できます。

internal sealed class ElmahServiceProvider : IServiceProvider 
{ 
    private readonly ErrorLog defaultErrorLog; 

    private ElmahServiceProvider(ErrorLog defaultErrorLog) 
    { 
     Requires.IsNotNull(defaultErrorLog, "defaultErrorLog"); 
     this.defaultErrorLog = defaultErrorLog; 
    } 

    public object GetService(Type serviceType) 
    { 
     return serviceType == typeof(ErrorLog) ? this.defaultErrorLog : null; 
    } 
} 

とアプリケーションの開始時に、あなたは以下の操作を行うことができます:

このようなIServiceProvider実装はこのようになります

// Option 1: using a virtual path 
var logger = new XmlFileErrorLog(new Dictionary<string, string> 
{ 
    { "logPath", "~/myCustomPath" } 
}); 

// Option 2: using a fixed path 
var logger = new XmlFileErrorLog("c:\\logFiles"); 

// Creating the provider and registering it in the ServiceCenter. 
var provider = new ElmahServiceProvider(logger); 
ServiceCenter.Current = c => provider; 

これは反射に戻す必要がなくなりことができます。

+0

良いアイデアですが、サンプルコードに問題があります。 「Requires」はここでヌルチェックを行うカスタムクラスです。また、Dictionaryオブジェクトには構文の問題があります。 – user3885927