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 不创建日志文件的主要内容,如果未能解决你的问题,请参考以下文章