2015-11-03 44 views
1

我已經在幾個控制檯應用程序上使用NLog,沒有任何問題,但這是我第一次在MVC Web應用程序中使用它。當我嘗試登錄到文件時,沒有任何反應。沒有錯誤,也沒有創建任何日誌文件。當我在本地瀏覽應用程序時,我也不會收到任何錯誤。NLog不在MVC應用程序中創建日誌?

我做的第一件事是確認我的NLog.config文件的屬性在「複製到輸出」屬性中設置爲「始終複製」。我甚至通過NuGet卸載了NLog,然後再次安裝它,並關閉VS並再次打開項目。

我已經做了一些搜索,我發現的唯一真正建議是先創建文件夾位置,然後檢查應用程序池的權限。我創建了文件夾位置,但似乎也沒有工作。我通過Visual Studio 2015中的Debug模式運行它,它自動啓動本地Web服務器,所以我不知道如何找出它用於寫入文件位置的服務。

在下面的例子中,我可以在我的控制器內的ActionResult上放置一個斷點,並在「gate」參數中看到一個正在傳遞的值。我儘管對我的測試記錄器,並沒有得到任何錯誤。我查看我的日誌位置,並且沒有創建日誌文件。

任何人有什麼建議我可以嘗試?

NLog.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" 
     autoReload="true" 
     throwExceptions="true"> 

    <variable name="LogDirBase" value="D:/logs/RampInfo"/> 
    <variable name="LogYear" value="${date:format=yyy}"/> 
    <variable name="LogMonth" value="${date:format=MM}"/> 
    <variable name="LogDay" value="${date:format=dd}"/> 
    <variable name="LogFileShortDate" value="${date:format=yyyy-MM-dd}"/> 

    <targets> 

    <target name="DefaultTarget" 
     xsi:type="File" 
     fileName="${LogDirBase}/${LogFileShortDate}.log" 
     encoding="utf-8" 
     layout="${longdate} | ${callsite} | ${message}" 
     maxArchiveFiles="14" 
    /> 

    </targets> 

    <rules> 
    <logger name="defaultLogger" minlevel="Debug" writeTo="DefaultTarget" /> 
    </rules> 
</nlog> 

我的控制器

public class RampController : Controller 
    { 
     private static Logger logger = LogManager.GetCurrentClassLogger(); 


     // GET: GateInfo 
     public ActionResult Gate(string gate) 
     { 

      logger.Debug("Start action result. Gate: " + gate); 
    } 
+0

在調試模式中本地IIS實例使用您的當前登錄的應用程序池的用戶,所以想必你有權寫入到指定的文件夾,但也許值得一檢查 –

+0

也可以嘗試切換'/'來' '\\'' –

+0

請參閱http://stackoverflow.com/questions/23729629/why-is-the-basedir-nlog-configuration-not-working/23736348#23736348 –

回答

0

記錄器的名字通常使用這樣的

<logger name="Name.Space.RampController" minlevel="Debug" writeTo="DefaultTarget" /> 

或者,如果你只是想要一個日誌文件的應用:

<logger name="*" minlevel="Debug" writeTo="DefaultTarget" /> 

內部,LogManager.GetCurrentClassLogger着眼於當前的堆棧來確定呼叫類型:(Silverlight的條件語句刪除):

public new T GetCurrentClassLogger() 
{ 
    StackFrame frame = new StackFrame(1, false); 
    return this.GetLogger(frame.GetMethod().DeclaringType.FullName); 
} 
-1

我感謝大家的建議。我花了數小時試圖弄清楚爲什麼NLog不工作。我放棄了這一天,今天早上以一種清新的頭腦回到了它。我基本上開始了一個全新的NLog.config並且工作。我從不同的項目中複製出不同的NLog配置。我沒有真正看到兩者之間的區別,但是現在它按照預期工作。

下面是我使用的新的NLog.config。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     autoReload="true" 
     throwExceptions="true"> 

    <variable name="LogDirectory" value="D:\integration\logs\RampInfo"/> 

    <targets> 
    <target name="LogTarget" 
      xsi:type="File" 
      fileName="${LogDirectory}/${shortdate}.log" 
      encoding="utf-8" 
      maxArchiveFiles="14" 
      layout="${longdate} ${callsite} ${message}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="LogTarget" /> 
    </rules> 
</nlog> 
+0

記錄器名稱現在*可與所有類匹配。 – Joe