2017-09-01 9 views
1

C#で書かれたライブラリで、さまざまな操作を行い、ログにはNLogを使用しています。現在のところ、GUIと一緒に使用してGUIを操作するには、WinFormsが問題なく動作します。NLogが遅くなり、ASP.net MVCアプリケーションが破損する

古いWinFormsを置き換える新しいWebベースのインターフェイスを開発するように求められました。私はASP.net MVC5を選択しました。

問題は、私は私のASP.netアプリケーションの休憩、NLogを使って何かをログに記録し、ライブラリから任意のメソッドを呼び出すときということです:ページ間のロード時間は、(非常に長くなる(〜30秒程度)と、すべてのステータスが失われますTempDataおよびViewDataの辞書は空になります)。

しかし、私がそのメソッドでNLogへのすべての呼び出しをコメントした後、私はライブラリから同じ正確なメソッドを呼び出すと、すべてがスムーズに行く!

どうしてですか? NLogが私のASP.net MVCアプリを殺すのはなぜですか?

  • 私はアプリが遅くなり、ログの数千人をやっていないよ。急いで明白提案を書く前

    <?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> 
        <target name="logfile" xsi:type="File" fileName="logs\Service.log" keepFileOpen="false" 
           layout="${longdate} ${level} ${message} ${exception:format=tostring}" 
            archiveFileName="logs\Service.{#}.log" 
          archiveEvery="Day" 
          archiveNumbering="Rolling" 
          maxArchiveFiles="30" 
          /> 
        </targets> 
    
        <rules> 
        <logger name="*" minlevel="Info" writeTo="logfile" /> 
        </rules> 
    </nlog> 
    

    重要事項: ここNLog構成です。我々は 最高15-20ログコールについて話しています

  • これは、ファイルにロギングするときにのみ発生します。例えば、私はXSI使用してネットワークにログオンしている場合:タイプ=を「NLogViewerは、」この問題は、私はここにベースディレクトリを見つけ、その完全なパスが間違っていると問題があると思い
+0

ロギングフォルダにアクセス権の問題がありますか?それはどこにホストされていますか? I/Oで何が行われているかを見るために、sysinternalsのProcessMon(またはdiskmonまたはfilemon)のようなものを使用しましたか?あなたのログステートメントをどのように構築していますか?ログに文字列連結を使用して大きな文字列を書いていますか?ログに記録されずに処理されている文字列形式のデバッグレベルログをたくさん使用していますか?プロファイリングツールを使用してスローダウンされている場所やVSに組み込まれている場所を確認するためにWebアプリケーションをプロファイルしましたか? – Igor

+0

要するに、**あなたの調査作業をもっとやるか、もっと多くの情報を提供する必要があります。誰もあなたが答えを出すことができますが、それは最高に推測されるので与えられたものではありません。 – Igor

+0

https://github.com/nlog/NLog/wiki/BufferingWrapper-targetを試したことがあります – Fildor

答えて

2

を発生しません。

過去にこれらの問題が発生していた場合。たとえば、this issue

${basedir}を使用してください。

+0

あなたは正しかった!絶対パスを使用すると、問題は完全に修正されました!ところで...環境変数を使用できるかどうかは分かりますか?私は%ProgramData%\ MyApp \ Logs \に書きたいと思います。方法はありますか? –

+1

これを使用します:https://github.com/NLog/NLog/wiki/Environment-Layout-Renderer – Julian

2

パフォーマンスが非常に重要である場合は、<targets>内の最初の要素としてこれを追加することを検討:

<default-wrapper xsi:type="AsyncWrapper" timeToSleepBetweenBatches="0" overflowAction="Block" /> 

また、あなたがさらに最適化したいならば、あなたはログファイル、ファイル・ターゲットにbufferSizeパラメータを追加する必要がありますが(パフォーマンスを向上しますときkeepFileOpen="false"):ジュリアンからの答えは確かに問題を解決しなかったが、私はまだ知らなかったので、

<target name="logfile" xsi:type="File" fileName="logs\Service.log" bufferSize="4096" ... /> 
+0

提案していただきありがとうございますが、私がやっているロギングはあまり重くはありません、すべてのメソッド呼び出しは通常、 10〜20ログライン。この遅さは、@ジュリアンによって指摘された問題 –

0

は、さらに明確化としてこれを書くWHY問題が発生していました。

基本的には、絶対パスを指定しないことで、ログファイルが作業ディレクトリのアプリケーションで書かれていました:

はそれ以来、私はここにそれは行く、分かりました。 ASP.net Webアプリケーションでは、このディレクトリはWebサイトがデプロイされているディレクトリです。これは大きな問題を引き起こします。変更を検出するために、サイトのメインディレクトリはIISによって絶えず監視されています。NLogがこのディレクトリにログファイルを書き込むと、IISは変更されたファイルを検出し、再配置するサイトとして解釈し、はWebアプリケーション全体を再起動します

基本的に、ログの新しい行ごとに、私のアプリは最初から再起動されていました!パフォーマンスは不自然ではありませんでした!

TL; DR:ASP.net Webサイトが展開されている最上位ディレクトリには何も書き込まないでください。

関連する問題