3

エラーを別のテキストファイルに書き込んで、そのファイルを電子メールで送信するのに助けが必要です。実際、私はWindowsアプリケーションを作成しましたが、別のファイルに例外や書き込みエラーを追加しませんでした。これで、エラーが原因でアプリケーションが中断された場合は常に、エラーを別のテキストファイルに記録し、そのファイルを電子メールで送信する必要があります。

エラーログファイルを調べたところ、エラーログをテキストファイルに書き込むための個別のクラスを作成し、そのファイルをすべてのメソッドのtry-catchブロックに呼び出すことがわかりました。しかし、私のプログラム/アプリケーションは大きくなり、その中間を追加する必要があります。また、log4netについても知りましたが、それでも同じように機能します。

アプリケーションレベルで、またはアプリケーションがエラーメッセージを受け取ったときに、エラーログを書き込む方法を教えてもらえますか?

手伝ってくれてありがとう。

4

5 に答える 5

1

まだどのシステムにも接続していない場合は、log4netを確認することをお勧めします。log4netは、あなたが求めていることを実行し、人気のあるライブラリであるため、他の人が認識して拡張できるからです。チームの専門家。また、他の誰かがそれを維持しているので、あなたは時々無料のバグ修正を得るでしょう。

于 2012-07-18T16:47:28.930 に答える
1

私が見る限り、必要なのはAppDomain.UnhandledExceptionイベントを処理することだけです。クラッシュに関する最も一般的な情報が表示されます。これを使用して、クラッシュの理由の調査を開始できます。

そしてもちろん、ハンドラーでは、好きなもの、またはカスタムロガーUnhandledExceptionを使用できます。log4net

于 2012-07-18T16:48:23.953 に答える
0

試す

Log4Net

SMTPロガー:

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="to@domain.com" />
<from value="from@domain.com" />
<subject value="test logging message" />
<smtpHost value="SMTPServer.domain.com" />
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>

于 2012-07-18T16:49:04.413 に答える
0

他の場所でキャッチされていないすべての例外を処理するには、Application.ThreadExceptionのハンドラーを実装することを検討してください

于 2012-07-18T16:49:15.713 に答える
0

WPFプロジェクトに使用するロギングヘルパーを作成しました。これは、多くの異なるコンポーネントを含む大規模なプロジェクトです。これは、MVVMの操作方法を学ぶ前のことでしたので、これがパターンを壊す場合は失礼します。このシステムは、さまざまなタスクを処理するために新しいコンポーネントで継続的に拡張されています。コンポーネントは、特定のタスクを処理するスタンドアロンユニットと考えることができ、メインコンポーネントがそれらすべてのマスターになります。このロギングにより、エラーが発生したコンポーネントに関係なく、エラーをログに記録することができました。それはやり過ぎかもしれませんが、私たちにとっては非常にうまくいきました。

同じ原則を使用して、すべてのシステム全体のイベント(ユーザーアクション、データ変更など)をログに記録しています

App.xaml.csで、未処理のエラーをすべてキャッチします。これはロギングの最後の手段であることに注意してください。例外が発生すると予想される場合は常にtrycatchを使用します(たとえば、db接続)。

public partial class App : Application
{
    void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        ErrorEvent errorEvent = new ErrorEvent();
        errorEvent.LogErrorEvent(e.Exception);
        e.Handled = true;
    }
}

ErrorEventは、イベントルーティングを使用してエラーをログに記録するユーティリティdll内のクラスです。重大度に応じて、さまざまな種類のエラーが発生します。これらのエラーはすべてデータベースに記録され、データベース接続を認識する唯一のコンポーネントはメインコンポーネントです。これが、ルーティングイベントを使用して例外をメインコンポーネントに送信してログに記録する理由です。ErrorEventHelperが入力され、メインコンポーネントにルーティングされます。try catchsを使用している状況では、EventHelperを作成し、LogErrorEventメソッドを使用してログに記録するために渡します。ShowMessageプロパティは、ユーザーに例外を通知するか、ログに記録するだけにするかを決定するために使用されます。

public class ErrorEvent : UserControl
{
    public delegate void ErrorEventEventHandler(object sender, RoutedCustomEventArgs e);

    public static readonly RoutedEvent EventOccuredEvent = EventManager.RegisterRoutedEvent(
    "EventOccured", RoutingStrategy.Bubble, typeof(ErrorEventEventHandler), typeof(ErrorEvent));

    // Provide CLR accessors for the event
    public event RoutedEventHandler EventOccured
    {
        add { AddHandler(EventOccuredEvent, value); }
        remove { RemoveHandler(EventOccuredEvent, value); }
    }

    public void LogErrorEvent(ErrorEventHelper occuredEventDetails)
    {
        RoutedEventArgs newEventArgs = new RoutedCustomEventArgs(ErrorEvent.EventOccuredEvent, occuredEventDetails);
        RaiseEvent(newEventArgs);
    }

    public void LogErrorEvent(Exception exception)
    {
        ErrorEventHelper occuredEventDetails = new ErrorEventHelper();
        occuredEventDetails.ErrorType = ErrorEventHelper.EventTypes.Critical;
        occuredEventDetails.ErrorValue = exception.Message;
        occuredEventDetails.ErrorStack = exception.StackTrace;
        occuredEventDetails.ShowMessage = true;

        RoutedEventArgs newEventArgs = new RoutedCustomEventArgs(ErrorEvent.EventOccuredEvent, occuredEventDetails);
        RaiseEvent(newEventArgs);

        if (exception.InnerException != null)
        {
            LogErrorEvent(exception.InnerException);
        }
    }

    public class RoutedCustomEventArgs : RoutedEventArgs
    {
        public ErrorEventHelper OccuredEventDetails { get; private set; }

        public RoutedCustomEventArgs(RoutedEvent routedEvent, ErrorEventHelper occuredEventDetails)
            : base(routedEvent)
        {
            this.OccuredEventDetails = occuredEventDetails;
        }
    }

}

public class ErrorEventHelper
{
    public string ErrorValue { get; set; }
    private EventTypes _ErrorType = EventTypes.Critical;
    public EventTypes ErrorType 
    {
        get
        {
            return _ErrorType;
        }
        set
        {
            _ErrorType = value;
        }
    }
    public string ErrorStack { get; set; }
    public bool ShowMessage { get; set; }

    public enum EventTypes
    {
        Critical,
        Warning,
        Information
    }

    public void SendMessage()
    {
        ErrorEvent newEvent = new ErrorEvent();
        newEvent.LogErrorEvent(this);
    }
}

メインウィンドウで、イベントハンドラーを登録します。

EventManager.RegisterClassHandler(typeof(ErrorEvent),
                        ErrorEvent.EventOccuredEvent, new ErrorEvent.ErrorEventEventHandler(LogOccuredErrors));

そして最後にそれを処理します:

private void LogOccuredErrors(object sender, ErrorEvent.RoutedCustomEventArgs e)
{
     ErrorEventHelper eventHelper = e.OccuredEventDetails;

 //Call Database Helper to log to database or output to file and email
    StringBuilder builder = new StringBuilder();
    builder.AppendLine(eventHelper.ErrorType);
    builder.AppendLine(eventHelper.ErrorValue);
    builder.AppendLine(eventHelper.ErrorStack);
    if (eventHelper.ShowMessage)
    {
        MessageBox.Show(eventHelper.ErrorValue);
    }

//Create your log file and email it
    File.WriteAllText(@"C:\log.txt", ControllerBuilder.ToString())
//email here

}
于 2012-07-18T17:09:02.280 に答える