アプリケーションにロギングを実装したいのですが、log4netのような外部フレームワークは使用しません。
それで、DOSのファイルへのエコーのようなことをしたいと思います。それを行う最も効果的な方法は何ですか?
外部フレームワークを使用せずにログに記録された未処理の例外をログに記録する方法はありますか?
アプリケーションにロギングを実装したいのですが、log4netのような外部フレームワークは使用しません。
それで、DOSのファイルへのエコーのようなことをしたいと思います。それを行う最も効果的な方法は何ですか?
外部フレームワークを使用せずにログに記録された未処理の例外をログに記録する方法はありますか?
回答:
public void Logger(string lines)
{
//Write the string to a file.append mode is enabled so that the log
//lines get appended to test.txt than wiping content and writing the log
using(System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt", true))
{
file.WriteLine(lines);
}
}
詳細については、MSDN
using
on file を使用する必要がありますが、メソッドに対してローカルであるため、いずれにしてもすぐに破棄されます。
file.WriteLine(lines);
、例外がスローされたときにコードがヒットすることはありませんfile.Close();
。を使用することusing
は、と同等ですtry { // using block } finally { // Dispose }
。これは、using
ブロック内のコードが例外をスローした場合でもオブジェクトが破棄されることを意味します
log4j.netのような外部のフレームワークを使用したくない。
どうして?Log4netはおそらく、ほとんどの要件に対応します。たとえば、次のクラスを確認してください:RollingFileAppender。
Log4netは十分に文書化されており、ウェブ上には何千ものリソースと使用例があります。
イベントログに直接書き込むことができます。次のリンクを確認して
ください。http ://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx
そしてこれがMSDNからのサンプルです:
using System;
using System.Diagnostics;
using System.Threading;
class MySample{
public static void Main(){
// Create the source, if it does not already exist.
if(!EventLog.SourceExists("MySource"))
{
//An event log source should not be created and immediately used.
//There is a latency time to enable the source, it should be created
//prior to executing the application that uses the source.
//Execute this sample a second time to use the new source.
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatedEventSource");
Console.WriteLine("Exiting, execute the application a second time to use the source.");
// The source is created. Exit the application to allow it to be registered.
return;
}
// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";
// Write an informational entry to the event log.
myLog.WriteEntry("Writing to event log.");
}
}
ログを記録する本当に簡単な方法を探している場合は、この1つのライナーを使用できます。ファイルが存在しない場合は作成されます。
System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
ELMAHを発見するまで、私は自分のエラーログを作成していました。ELMAHと同じくらい完璧に電子メールを送信することができませんでした。
独自のカスタムエラーログが必要な場合は、簡単に独自のコードを記述できます。私のプロジェクトの1つからスニペットを差し上げます。
public void SaveLogFile(object method, Exception exception)
{
string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
try
{
//Opens a new file stream which allows asynchronous reading and writing
using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
{
//Writes the method name with the exception and writes the exception underneath
sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
sw.WriteLine(exception.ToString()); sw.WriteLine("");
}
}
catch (IOException)
{
if (!File.Exists(location + @"log.txt"))
{
File.Create(location + @"log.txt");
}
}
}
次に、実際にエラーログに書き込むには、単に書き込みます(q
キャッチされた例外です)
SaveLogFile(MethodBase.GetCurrentMethod(), `q`);