2012-03-29 14 views
1

私のアプリケーションのルートにlog.txtファイルを置こうとしています。しかし、これは動作していないようです。助けてくれてありがとう。asp.net私のWebアプリケーションのログファイルを作成しようとしています

エラーメッセージ(私はこれは方法によって、ローカルホストである、私は適切なファイルに書い思ういけない、私はそのローカルまたはウェブホストの場合、これは仕事をしたいと思います。):

へのアクセス'C:¥Program Files(x86)¥Common Files¥Microsoft Shared¥DevServer¥10.0¥log.txt'のパスが拒否されました。

説明現在のWeb要求の の実行中に、未処理の例外が発生しました。エラーについての詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

これは私のコードです:

public static void LogErrorMessage(Exception e) 
    { 
     using (StreamWriter w = File.AppendText("log.txt")) 
     { 
      Log(e.ToString(),w); 
      w.Close(); 
     } 

    } 



private static void Log(String logMessage, TextWriter w) 
     { 
      w.Write("\r\nLog Entry : "); 
      w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), 
       DateTime.Now.ToLongDateString()); 
      w.WriteLine(" :"); 
      w.WriteLine(" :{0}", logMessage); 
      w.WriteLine("-------------------------------"); 
      // Update the underlying file. 
      w.Flush(); 
     } 
+0

がそのことを確認しますアプリケーションプールユーザーに書き込み許可が与えられているイオンをあなたが書き込んでいるディレクトリに移動します。 – Brian

答えて

2

私はあなたが必要だと思う:

public static void LogErrorMessage(Exception e, string Directory) 
{ 
    using (StreamWriter w = File.AppendText(Directory + "/log.txt")) 
    { 
     Log(e.ToString(),w); 
     w.Close(); 
    } 

} 

ASPXクラス

public void Page_Load() 
    { 
     Logger.LogErrorMessage(ex, Server.MapPath("~")); 

    } 
+0

クラスでマップパスを使用するにはどうすればよいですか?これはaspサーバークラスではありません – user516883

+0

呼び出し元サーバークラスから渡します。修正されたコードを参照してください。 – Jon

+0

'HttpContext.Current.Server.MapPath()'メソッドを試してみてください。メソッドの変更はありません。 –

1

あなたは、実行中のフォルダを取得するにはEnvironment.CurrentDirectoryを使用する必要があります。

あなたのコードは、Webサーバランタイムフォルダ(C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0)に書き込もうとします。

0

log.txtファイルのフルパスを指定すると、web.configを使用してディレクトリパスを取得できます。

+0

はい、ホストにアップロードすると変更する必要があります。 – user516883

+0

web.configにディレクトリパスを保存すると、Webサーバーに公開した後でもそのパスを変更することができます。ローカル/テスト環境では1つのパスを、プロダクションサーバーでは1つのパスを持つことができます。 – Ravia

0

あなたは(IISマネージャを使用してサイトのアプリケーションプール内のユーザーを見つける。)あなたのIISサイトを実行しているユーザーを見つける必要があります。

このユーザーには、log.txtファイルを作成しようとしているフォルダを読み書きする権限を与える必要があります。

エラーは、「アクセスが拒否されました」と明確に明確です。

0

NLogを使用することもできますが、実装は非常に簡単です。

まず、NLogをプロジェクトにダウンロードして追加します。

と作成NLog.config:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 

    <targets> 

     <target name="file" xsi:type="File" fileName="${basedir}/Logs/site.log" 
     layout="${date}: ${message}" /> 

     <target name="eventlog" xsi:type="EventLog" source="Dealing Errors Nlog" log="Application" 
     layout="${date}: ${message} ${stacktrace}" /> 


    </targets> 

    <rules> 
     <logger name="*" minlevel="Info" writeTo="file" /> 
     <logger name="*" minlevel="Error" writeTo="file" /> 

     <logger name="*" minlevel="Error" writeTo="eventlog" /> 
     <logger name="*" minlevel="Info" writeTo="eventlog" /> 
    </rules> 
</nlog> 

Global.asaxの

private NLogLogger GetLog() 
     { return new NLogLogger(); } 

クリートログという名前の1つのクラスにおいて。CS:

public static class Log 
    { 

     public static ILogger GetLogger()//return the interface 
     { 
      return new NLogLogger(); 
     } 
    } 

NLoggerという名前の別のクラスを作成します。インターフェイスILoggerです上の

public class NLogLogger : ILogger 
    { 
     private Logger _logger; //NLog 

     public NLogLogger() 
     { 
      _logger = LogManager.GetCurrentClassLogger(); 
     } 

     public void Info(string message) 
     { 
      _logger.Info(message); 
     } 

     public void Warn(string message) 
     { 
      _logger.Warn(message); 
     } 

     public void Debug(string message) 
     { 
      _logger.Debug(message); 
     } 

     public void Error(string message) 
     { 
      _logger.Error(message); 
     } 

     public void Error(Exception x) 
     { 
      Error(LogUtility.DealingException(x)); 
     } 

     public void Fatal(string message) 
     { 
      _logger.Fatal(message); 
     } 

     public void Fatal(Exception x) 
     { 
      Fatal(LogUtility.DealingException(x)); 
     } 
    } 

とCREAD:

public interface ILogger 
    { 

     void Info(string message); 


     void Warn(string message); 


     void Debug(string message); 


     void Error(string message); 


     void Error(Exception x); 


     void Fatal(string message); 


     void Fatal(Exception x); 
    } 

、最終的に1つのクラスLogUtility:

public class LogUtility 
    { 

     public static string DealingException(Exception x) 
     { 
      Exception logException = x; 
      if (x != null) 
      { 
       logException = x; 
      } 

      string strErrorMsg = Environment.NewLine + "URL ERROR:\t" + System.Web.HttpContext.Current.Request.Path; 

      strErrorMsg += Environment.NewLine + "URL:\t" + System.Web.HttpContext.Current.Request.RawUrl; 

      strErrorMsg += Environment.NewLine + "Message:\t" + (logException.Message != null ? logException.Message : "Not Found"); 


      strErrorMsg += Environment.NewLine + "Source:\t" + (logException.Source != null ? logException.Source : "Not Found"); 


      strErrorMsg += Environment.NewLine + "Stack Trace:\t" + (logException.StackTrace != null ? logException.StackTrace : "Not found"); 

      strErrorMsg += Environment.NewLine + "Destination URL:\t" + (logException.TargetSite.ToString() != null ? logException.TargetSite.ToString() : "Not found"); 

      strErrorMsg += Environment.NewLine; 
      strErrorMsg += Environment.NewLine; 
      return strErrorMsg; 
     } 
    } 
関連する問題