2015-11-03 41 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