2

親愛なる開発者の皆様、こんにちは。

NLog で奇妙な問題が発生しまし
た。クラッシュしましたが、ログにユーザー アクティビティのトレースが見つかりませんでした。

ロギングが機能していないと思います...
権限の問題などを検索しようとしましたが、すべて問題ないようです

問題が発生した場合にログをデバッグしたいので、次の
コードを作成して、何も作成できなかった場合にユーザーに通知します。

public static class Log
{
    static Log()
    {
        try
        {
            AppLogger = LogManager.GetLogger("Megatec.EngineeringMatrix.AppLogger");
            ChangeLogger = LogManager.GetLogger("Megatec.EngineeringMatrix.ChangeLogger");
            DRCLogger = LogManager.GetLogger("Megatec.EngineeringMatrix.DRCLogger");

            if((AppLogger == null) || (ChangeLogger == null) || (DRCLogger == null))
                throw new NLogConfigurationException("Configuration does not specify correct loggers");
            writeStartupLogEntry();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), @"Failed to load `Megatec.EngineeringMatrix` Loggers.");
            throw;
        }

    }

    public static readonly Logger AppLogger;
    public static readonly Logger ChangeLogger;
    public static readonly Logger DRCLogger;

次の構成ファイルを使用します。

  <?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" throwExceptions="true">
    <targets>
      <target xsi:type="File" name="AppLogFile" createDirs="true" fileName="c:/log?s/${processname}/${logger}_${shortdate}.log"
              layout=">> ${time} ${uppercase:${level}} ${callsite} ${message} ${exception:format=tostring}" />

      <target xsi:type="File" name="ChangeLogFile" createDirs="true" fileName="c:/log?s/${processname}/${logger}_${shortdate}.log"
              layout=">> ${date} ${message} ${exception:format=tostring}" />

      <target xsi:type="File" name="DRCLogFile" createDirs="true" fileName="c:/logs/${processname}/${logger}_${shortdate}.log"
              layout=">> ${date} ${message} ${exception:format=tostring}" />
    </targets>

    <rules>
      <logger name="Megatec.EngineeringMatrix.AppLogger" minlevel="Trace" writeTo="AppLogFile" />
      <logger name="Megatec.EngineeringMatrix.ChangeLogger" minlevel="Trace" writeTo="ChangeLogFile" />
      <logger name="Megatec.EngineeringMatrix.DRCLogger" minlevel="Trace" writeTo="DRCLogFile" />
    </rules>
  </nlog>

明らかc:\lo?gsに、ディレクトリを作成できないため、BAAD構成を作成しました。

それでも、私はメッセージを受け取りません
MessageBox.Show(ex.ToString(), @"Failed to load 'Megatec.EngineeringMatrix'

そしてAppLogger.Info()例外をスキップします...

ログに何も書いていませんが、アプリはそれを認識していません...

デバッグでは、例外をキャッチして、NLog によって処理されていることを確認できます。

コードからそれをキャッチするにはどうすればよいですか?

4

1 に答える 1

1

これは古い問題ですが、最近の変更点がいくつかあります。

一部の例外は、過去に NLog によって「食べられた」ものです。たとえば、AsyncWrapper(またはasyncon属性を使用して<target>

これは NLog 4.3 で修正されました。

例外処理の一貫性 (動作の変更) 例外のログ記録とスローは、以前は一貫性がありませんでした。すべてが内部ロガーに記録されたわけではなく、失われることもありました。たとえば、非同期ラッパー (または非同期属性) は、適切な再スローなしですべての例外をキャッチしていました。

NLog が機能しない理由が不明な場合があるため、これは悪いことです (自分で何度も取得しました)。これは NLog 4.3 で修正されました!

すべての例外は内部ロガーに記録されます 「throwExceptions」オプションはすべてのケースで尊重されます アドバイス: 本番環境では throwExceptions を無効にしてください! (これがデフォルト)

http://nlog-project.org/2016/04/16/nlog-4-3-has-been-released.htmlを参照

于 2016-09-26T21:16:09.017 に答える