【问题标题】:NLog not creating log in MVC application?NLog没有在MVC应用程序中创建日志?
【发布时间】:2015-11-03 21:12:08
【问题描述】:

我在一些控制台应用程序上使用过 NLog 没有任何问题,但这是我第一次在 MVC Web 应用程序上使用它。当我尝试登录文件时,没有任何反应。没有错误,也没有创建任何日志文件。当我在本地单步执行该应用程序时,我也没有收到任何错误。

我做的第一件事是确认我的 NLog.config 文件的属性在“复制到输出”属性中设置为“始终复制”。我什至通过 NuGet 卸载了 NLog,然后再次安装它以及关闭 VS 并再次打开项目。

我进行了一些搜索,发现唯一真正的建议是先创建文件夹位置,然后检查应用程序池的权限。我创建了文件夹位置,但这似乎也不起作用。我在 Visual Studio 2015 中通过调试模式运行它,它会自动启动本地 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);
    }

【问题讨论】:

  • 在调试模式下,本地 IIS 实例使用您当前的登录作为 AppPool 用户,因此您可能有权写入指定的文件夹,但可能值得一试
  • 还可以尝试将/ 切换为\\

标签: c# asp.net-mvc asp.net-mvc-4 nlog


【解决方案1】:

记录器名称通常使用类似这样的名称

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

或者,如果您只想为您的应用程序提供一个日志文件:

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

在内部,LogManager.GetCurrentClassLogger 查看当前 Stack 以确定调用类型:(silverlight 条件已删除):

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

【讨论】:

    【解决方案2】:

    感谢大家的建议。我花了几个小时试图弄清楚为什么 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>
    

    【讨论】:

    • 记录器名称现在是 * 匹配所有类。
    猜你喜欢
    • 2013-01-06
    • 2017-10-08
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多