NLog 不创建日志文件

Posted

技术标签:

【中文标题】NLog 不创建日志文件【英文标题】:NLog does not create log file 【发布时间】:2016-05-24 08:07:02 【问题描述】:

我刚刚创建了一个空的 ASP.NET 5 Web 应用程序,我想将 NLog 用于我的日志。到目前为止,我已经成功安装了 NLog 并在 Startup 类中创建了一个公共静态 Logger。在我的应用程序文件夹中,我创建了具有以下内容的 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">
    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>
    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>

在 Startup 类的 Configure 方法中,我尝试使用以下代码行记录一些数据:

logger.Warn("foo1");
logger.Debug("foo2");

项目成功构建,但运行后我看不到任何 file.txt。

【问题讨论】:

快速设置在github.com/NLog/NLog.Extensions.Logging 【参考方案1】:

我找到了一个可能的解决方案。创建 ASP.NET 5 空项目后,您可以执行以下操作:

1) 打开 Startup.cs 文件并添加以下使用:

using Microsoft.Extensions.Logging;
using NLog.Framework.Logging;

请注意,为了添加第二个 using,您必须通过添加以下依赖项来修改 package.json 文件:

"NLog.Framework.logging": "1.0.0-rc1-final"

2) 在 startup.cs 文件中,您必须通过添加参数 ihe 和 ilf 来修改“配置”方法的签名。所以最终会是这个样子。

Configure(IApplicationBuilder app, IHostingEnvironment ihe, ILoggerFactory ilf)

ihe 和 ifg 的参数要这样使用:

ilf.AddNLog();
ihe.ConfigureNLog("nlog.config");
ILogger logger = ilf.CreateLogger(GetType().Namespace);
logger.LogInformation("i am nlog bye bye");

3) 在项目文件夹(不是 wwwroot 而是其父文件夹)中,添加一个文件并将其命名为“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"
      internalLogLevel="Warn"
      internalLogFile="c:\temp\internal.txt">


  <!-- define various log targets -->
  <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-$shortdate.log"
                 layout="$longdate|$logger|$uppercase:$level|$message $exception" />

    <target xsi:type="File" name="ownFile" fileName="c:\temp\nlog-own-$shortdate.log"
              layout="$longdate|$logger|$uppercase:$level|$message $exception" />

    <target xsi:type="Null" name="blackhole" />
  </targets>

  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile" />
  </rules>
</nlog>

现在,如果您运行项目并转到 C:\temp,您将看到两个文件:“nlog-all-.log”和“nlog-own-.log”。在第二个文件中,您将看到消息“我是 nlog 再见”

【讨论】:

【参考方案2】:

提供日志文件的完整路径

<?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">

  <!-- 
  See http://nlog-project.org/wiki/Configuration_file 
  for information on customizing logging rules and outputs.
   -->
  <targets>
    <!-- add your targets here -->
    <target name="asyncFile" xsi:type="AsyncWrapper">
      <target name="logfile" xsi:type="File" fileName="C:\Log.txt" layout="$longdate $callsite $level $message $newline" />
    </target>
    <!--
    <target xsi:type="File" name="f" fileName="$basedir/logs/$shortdate.log"
            layout="$longdate $uppercase:$level $message" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->
    <logger name="*" minlevel="Info" writeTo="asyncFile" />
    <!--
    <logger name="*" minlevel="Trace" writeTo="f" />
    -->
  </rules>
</nlog>

【讨论】:

【参考方案3】:

这是我用过的 NLogConfiguration,它绝对可以正常工作

 <?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">
        <targets >
    <target xsi:type="File" name="logfile"
            fileName="$basedir/logs/YourFileName.log"
            layout="$longdate $level:uppercase=true:padding=5 $gdc:item=hostname $gdc:item=useremail ($logger - $mdc:item=actionname)  $message $exception:format=tostring"
            archiveEvery="Day"
            archiveFileName ="$basedir/logs/YourFileName.$date:format=yyyy-MM-dd HH.mm.#.log"
            archiveNumbering ="Sequence"
            maxArchiveFiles="30"
            fileAttributes="Compressed">
    </target>
       </targets>
       <rules>
       <logger name="*" minlevel="Debug" writeTo="logfile">
      </logger>
      </rules>
    </nlog>

在服务器端

public class YourClassName

   private static Logger log = LogManager.GetCurrentClassLogger();

  public void YourMethodName()
    
      try
        
          log.Info("Success");
        
        catch(Exception Ex)
        
         log.Info("Exception"+ex);
        
        
   

【讨论】:

是的,我已经做到了。但是你把它放在 Startup 类了吗?

以上是关于NLog 不创建日志文件的主要内容,如果未能解决你的问题,请参考以下文章

从 msi 安装程序安装时,NLog 不写入日志

NLog 实现日志输出到文件详细步骤

NLog 旋转和清理日志文件

NLog 文件归档

如何强制 NLog 覆盖日志文件

C# 使用NLog记录日志