2017-10-30 14 views
4

私は、一連のSQLコマンドを実行するビジネスプロセスを持っています。私は、スタック内でこれらのSQLコマンドを「積み重ね」と例外が発生したときだけでDBにそれらを書きたい、私はlog4netのかNLogは、このシナリオをサポートしていれば、誰もが知っているいくつかのコードでログメッセージを積み重ねて例外が発生したときにログに記録する方法は?

public void BusinessMethod() 
{ 
    Log.Initialize(); // Clear the stack 
    try 
    { 
     Method1ThatExecutesSomeSQLs(); 
     Method2ThatExecutesSomeSQLs(); 
     Method3ThatExecutesSomeSQLs(); 
    } 
    catch(Expection ex) 
    { 
     // if some exception occured in any Method above, them i write the log, otherwise, i dont want to log anything 
     Log.Write(); 
    } 
} 

//Example of some Method that executes SQL's 
public void Method1ThatExecutesSomeSQLs() 
{ 
    string sql = "select * from table"; 
    ExecuteSQL(sql); 
    Log.StackUp("The following sql command was executed: " + sql); //Just stack up, dont write! 
} 

それを説明しましょうか?そうでない場合、それを実装する方法は?

+0

これはLog4Netではないので、Log4Netではなく役立つかもしれませんが、Log4Netではなく、あなたが説明する機能を持つNLogを提案します。 – Michael

+2

@Michaelはこの機能について説明しているNLogページを教えていただけますか? – Ewerton

+0

さて、私はそれを見つけることができませんでした:(かなりの時間前に詳細を覚えていませんが、これは次のように機能します:フィルタ条件としてレベルを指定し、エラーを言います。レベルが指定されたレベル以上であれば、キューに入れられたメッセージとトリガされたメッセージがログに記録されます。バッファリングとフィルタリングのターゲットの組み合わせかもしれませんが、私はこれを行うためのカスタムコードを書いていないと確信しています...おそらくここにいる他の人が例を挙げることができます...? – Michael

答えて

2

NLog 4.5は、そのままのシナリオ(現在ベータ版)をサポートしています。 BufferingWrapperが持っていないとして、いくつかのより多くの助けを必要と

<target name="consoleWarn" xsi:type="AutoFlushWrapper" condition="level >= LogLevel.Warn" > 
     <target xsi:type="BufferingWrapper" overflowAction="Discard" bufferSize="50"> 
      <target xsi:type="Console" layout="${level}:${message}" /> 
     </target> 
</target> 

NLog 4.4(およびそれ以前):これは警告/エラー/致命的なが(オートフラッシュがトリガーさせる)が発生し、最後の50件のメッセージが表示されますオーバーフローアクション。代わりにAsyncWrapperが悪用されることができます:

<target name="consoleWarn" xsi:type="AutoFlushWrapper" condition="level >= LogLevel.Warn" > 
     <target xsi:type="BufferingWrapper" bufferSize="500"> 
      <target xsi:type="AsyncWrapper" queueLimit="50" overflowAction="Discard" fullBatchSizeWriteLimit="1" timeToSleepBetweenBatches="2000000000"> 
       <target xsi:type="Console" layout="${level}:${message}" /> 
      </target> 
     </target> 
</target> 

は、私は私の問題は、必要なときに(フラッシング)を保存し、その後MemoryTargetにメッセージログを積み重ね解決https://github.com/NLog/NLog.Extensions.Logging/issues/127

1

も参照してください。見て:

public class Program 
{ 
    private static Logger logger = LogManager.GetCurrentClassLogger(); 

    static void Main(string[] args) 
    { 
     try 
     { 
      logger.Log(LogLevel.Error, "Start of the process"); 
      // Inside Business class i have a lot of other logger.log() calls 
      // Inside the business class a have a lot of DAOs that calls logger.log() 
      // In ither words, all the calls to logger.log() will be stacked up 
      Business b = new Business(); 
      b.DoSomethig(); 
      logger.Debug("End of the Process."); 
     } 
     catch (Exception) 
     { 
      var target = (MemoryTarget)LogManager.Configuration.FindTargetByName("MemoTarget"); 
      var logs = target.Logs; 

      // Get all the logs in the "stack" of log messages 
      foreach (string s in target.Logs) 
      { 
       Console.Write("logged: {0}", s); 
      } 
     } 

    } 
} 

nlog.config:

<targets> 
    <target xsi:type="Memory" name="MemoTarget" layout="${date:format=dd-MM-yyyy HH\:mm\:ss} | ${callsite} | ${message}" /> 
... 
</targets> 
... 
<rules> 
    <logger name="*" minlevel="Debug" writeTo="MemoTarget" /> 
</rules> 
.... 

が実行した後、それは、出力は次のようになります。少し遅れ

logged: 30-10-2017 20:12:36 | NLog_Tests.Program.Main | Start of the process 
logged: 30-10-2017 20:12:36 | NLog_Tests.Business.DoSomethig | Some business rule was executed 
logged: 30-10-2017 20:12:36 | NLog_Tests.DAOClass.ExecuteCommand | some sql was executed 
logged: 30-10-2017 20:12:36 | NLog_Tests.Program.Main | End of the Process. 
+1

ここにnlog.configを追加するといいでしょう:) – Julian

+0

@ジュリアン私はnlog.config – Ewerton

+0

クールを追加しました。私はすでに投票しています;) – Julian

0

が、この私の(減少):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 async="true"> 
    <wrapper-target xsi:type="BufferingWrapper" name="buffer" bufferSize="32" flushTimeout="100"> 
     <wrapper-target xsi:type="PostFilteringWrapper"> 
     <defaultFilter>level >= LogLevel.Warn</defaultFilter> 
     <when exists="level >= LogLevel.Error" filter="level >= LogLevel.Trace" /> 
     <target xsi:type="ColoredConsole" /> 
     </wrapper-target> 
    </wrapper-target> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Trace" writeTo="buffer" /> 
    </rules> 
</nlog> 

これは、すべてのメッセージ(最大= 32)を警告よりも下にキューに入れますレベル。エラー以上のメッセージが記録されると、キューはフラッシュされます。

上記の設定のテストコード。警告メッセージだけが表示されます。エラーメッセージまたは致命的なメッセージが追加された場合、すべてのメッセージが表示されます。

LogManager.Configuration = new XmlLoggingConfiguration(@"cfg\NLog.xml", false); 
LogManager.ReconfigExistingLoggers(); 

LOG.Trace("trace"); 
LOG.Debug("debug"); 
LOG.Info("info"); 
LOG.Warn("warn"); 
//LOG.Error("error"); 
//LOG.Fatal("fatal"); 

LogManager.Flush(); 
LogManager.Shutdown(); 
+0

ニース、それは問題への良いアプローチです – Ewerton

関連する問題