サードパーティのライブラリを使用せずにC#でログインするにはどうすればよいですか?[閉まっている]


92

アプリケーションにロギングを実装したいのですが、log4netのような外部フレームワークは使用しません。

それで、DOSのファイルへのエコーのようなことをしたいと思います。それを行う最も効果的な方法は何ですか?

外部フレームワークを使用せずにログに記録された未処理の例外をログに記録する方法はありますか?


1
組み込みのSystem.Diagnostics.TraceSourceを使用できます。<br>以下は、組み込みのトレースリスナー + FileLogTraceListenerのリストです。このような [またはJeff Atwoodによるこの] など、多くのマニュアルがWeb上にあります(codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

2
エンタープライズライブラリはlog4netよりも良いオプションだと思います。
hungryMind

単純なコンソールロギングのみを探している場合は、おそらくSystem.Diagnostics.Tracingが適しています。トレースはコンソール(Trace.WriteLine)のように使用できます。
ポール

回答:


66
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


22
usingon file を使用する必要がありますが、メソッドに対してローカルであるため、いずれにしてもすぐに破棄されます。
markmnl 2014年

19
またfile.WriteLine(lines);、例外がスローされたときにコードがヒットすることはありませんfile.Close();。を使用することusingは、と同等ですtry { // using block } finally { // Dispose }。これは、usingブロック内のコードが例外をスローした場合でもオブジェクトが破棄されることを意味します
Memet Olsen

6
ロギングが完了する前にこのメソッドが再度呼び出された場合はどうなりますか?エラーが発生します-別のプロセスによって使用されているため、プロセスはファイル「C:\ test.txt」にアクセスできません。この問題について誰かが知っていますか?
マイクスポーツマン

23

log4j.netのような外部のフレームワークを使用したくない。

どうして?Log4netはおそらく、ほとんどの要件に対応します。たとえば、次のクラスを確認してください:RollingFileAppender

Log4netは十分に文書化されており、ウェブ上には何千ものリソースと使用例があります。


3
その理由は、私が.netで外部ライブラリを使用したことがないためです。そのため、最初にその方法を学ぶ必要があります;)
IAdapter

4
プロジェクトへの参照を追加し、いくつかのxml構成を配置するだけです-とても簡単です。Google for log4netチュートリアルで、あなたに最適なものを選択してください。
empi

23
Nugetを使用します。外部のライブラリを使用すると簡単になります
heneryville '16 / 03/16

36
なぜそれほど多くの賛成票があるのですか?質問は、OPが外部フレームワークを使用したくないことを2度述べており、Log4netを望まないことを明示的に述べています。確かに、これは回答ではなくコメントであるべきですか?
RyanfaeScotland 2015年

9
@RyanfaeScotlandそうですね、多分OPには合わないかもしれませんが、これは公開サイトであることを忘れないでください。質問のタイトルには「C#でログインする方法」しか記載されていないため、ライブラリの使用に問題がない私のような人もここにアクセスして、この回答が役に立ちます。実際、このスレッドは、「c#ロギング」を検索した最初の結果でした。
swenzel 2016年

18

イベントログに直接書き込むことができます。次のリンクを確認して
ください。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
異なるクラスで同じEventLogを使用するためのベストプラクティスは何ですか?それをコンストラクタのパラメータとして渡しますか?いくつかのシングルトンクラスから静的にアクセスしますか?または何か良いですか?
dpelisek

15

ログを記録する本当に簡単な方法を探している場合は、この1つのライナーを使用できます。ファイルが存在しない場合は作成されます。

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");

このソリューションの問題は、IO操作が追加されることです。そのため、バッチアルゴリズムオペレーションのロギングには使用しないことをお勧めします
Rami Yampolsky

@RamiYampolsky、あなたの意味がわかりません。
dan-gph 2016

@ dan-gph多くのCPUオペレーションを実行するコードを実装する場合、このコードの間にログを記録する場合、実装しようとする実際のアルゴリズムの代わりにログのために時間を「浪費」します。そのため、できるだけ短い時間で「無駄にする」ことを好みます。上記の例のようにIO操作を実行すると非常に時間がかかるため、コードに多数のロギングコマンドがある場合、実行全体が約1000倍遅くなる可能性があります。
Rami Yampolsky 16

@RamiYampolsky、私はそのコードを100,000回ループさせただけで、10秒かかりました。つまり、これは1秒あたり10,000ログエントリ、つまり1エントリあたり0.01マイクロ秒です。1秒間に10個のログを記録すると、0.1マイクロ秒かかります。いいえ、それは全然オーバーヘッドが大きくありません。
dan-gph 16

@ dan-gph私の回答はさまざまなユースケースに関連しています。単純化のためにいくつかの計算を行うループを100,000回実行してみてください。合計+ = iを実行してから、ログを実行してください。ログの有無にかかわらずそれを試してください
Rami Yampolsky 2016

7

ELMAHを発見するまで、私は自分のエラーログを作成していました。ELMAHと同じくらい完璧に電子メールを送信することができませんでした。


私はそれを見ていきます。私の推論として、私のempiのコメントをチェックアウトしてください。
IAdapter

ELMAHは非常に単純なので、面白くもありません。文字通り、Web構成に数行追加するだけで、それを機能させることができます。
jonezy

また、あなたのアプリがいつ爆発するのか/爆発し始めるのかを知るための要件に関しては、サーバーが稼働している限りエラーメールを受け取ることができるので、電子メールを送信する機能があるため、elmahは他のほとんどのものよりも優れていますエルマ。
jonezy

6

.NETの近くに留まりたい場合は、Enterprise Library Logging Application Blockをチェックしてください。見てここに。または、クイックスタートチュートリアルについては、こちらを確認してください。エンタープライズライブラリの検証アプリケーションブロックを使用しましたが、これは本当に私のニーズに適合しており、プロジェクトに「継承」(インストールして参照)するのは非常に簡単です。


4

独自のカスタムエラーログが必要な場合は、簡単に独自のコードを記述できます。私のプロジェクトの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`);

7
ファイルがまだ存在しない場合、最初のエントリを見逃すことを知っていますか?
oɔɯǝɹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.