我正在尝试将日志记录添加到使用Windows Mobile 6.1在移动设备上运行的应用程序。 .NETCompact框架3.5。使用NLog。
我安装了相应版本的NLog发行版。
但是没有创建日志文件。
这是我的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=".\Neolant.ASRM.Terminal.log" layout="${longdate}|${level}|${message}|${exception}" autoFlush="true"/>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
这是我正在使用的测试代码:
public static void Main()
{
try
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
var logger = NLog.LogManager.GetLogger("UpperLevel");
logger.Info("test test test.");
try
{
throw new Exception("Unexpected!");
}
catch (Exception e)
{
var logger = NLog.LogManager.GetLogger("UpperLevel");
logger.WarnException("An exception occured.", e);
}
throw new Exception("Suddenly!");
}
finally
{
NLog.LogManager.Flush();
}
}
private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
var logger = NLog.LogManager.GetLogger("UpperLevel");
logger.FatalException("Application closed due to exception.", unhandledExceptionEventArgs.ExceptionObject as Exception);
NLog.LogManager.Flush();
}
答案 0 :(得分:20)
正在创建日志文件 - 但不在应用程序目录中。
使用${basedir}布局渲染器作为文件名的一部分证明是一种解决方案。
答案 1 :(得分:20)
我遇到了这个问题,我的日志文件没有被复制到我的构建目录。 NLog github页面有答案。 (为了更好的可读性,我稍微重新格式化了这一段。) https://github.com/NLog/NLog/wiki/Logging-troubleshooting
NLog无法找到配置文件。当NLog.config文件配置为Build Action = None或Copy to Output Directory =不在Visual Studio中复制时,可能会发生这种情况。
设置构建操作=内容和&#34;复制到输出目录=复制如果更新则修复此问题
答案 2 :(得分:14)
如果标记为答案的回答不是那么清楚,您可以查看示例
<targets>
<target xsi:type="Console" name="console"
layout="${longdate}|${level}|${message}" />
<target xsi:type="File" name="ErrorLog" fileName="${basedir}/error.txt"
layout="${longdate}
Trace: ${stacktrace}
${message}" />
<target xsi:type="File" name="AccessLog" fileName="${basedir}/access.txt"
layout="${shortdate} | ${message}" />
</targets>
答案 3 :(得分:3)
答案 4 :(得分:2)
就我而言,在定义规则像魅力
之后,我已经错过了规则 <rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
<!-- add your logging rules here -->
<!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" />
-->
</rules>
答案 5 :(得分:1)
来自nlog故障排除指南:
https://github.com/NLog/NLog/wiki/Logging-troubleshooting
如果您知道确实找到了配置文件,请使用以下内容暂时替换NLog.config文件的部分并尝试使用。
此规则将匹配您创建的任何记录器,如果有效,它会将log.txt文件放在&#39;基目录中。 - &#39; bin&#39;测试实例的目录,例如如果您在调试模式下运行,则会在您的bin&gt;中看到log.txt。调试文件夹。 (在故障排除指南中没有详细说明。)
如果这样可行,那么您就知道问题出在你的规则上:
<nlog throwExceptions="true">
<targets>
<target name="file" type="File" fileName="${basedir}/log.txt" />
</targets>
<rules>
<logger name="*" minLevel="Trace" writeTo="file" />
</rules>
</nlog>
我发现只有name =&#34; file&#34;为目标工作 - 其他值没有
添加throwExceptions =&#34; true&#34;如上所述还将确保您在调试时收到有用的错误消息。
答案 6 :(得分:1)
我也遇到了同样的问题,终于我解决了。我有一个Web应用程序,我想在其中实现NLog。请找到以下步骤来实现NLog。
第2步:-打开Web.config并添加以下行
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="D:\projects\NlogWeb\nlog-internal.log">
<targets>
<target name="console" xsi:type="ColoredConsole" layout="${message}" />
<!--Write logs to File-->
<target name="file" xsi:type="File" fileName="D:\projects\NlogWeb\ErrorLogFile.log" layout="--------------------- ${level}(${longdate})${machinename}-------------------- ${newline}
Exception Type:${exception:format=Type}${newline}
Exception Message:${exception:format=Message}${newline}
Stack Trace:${exception:format=Stack Trace}${newline}
Additional Info:${message}${newline}" >
</target>
</targets>
<rules>
<logger name="*" minlevel="trace" writeTo="file" />
</rules>
</nlog>
步骤3:-现在是要在.cs文件中调用的最后一个配置。
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace NlogWeb
{
public partial class Home : System.Web.UI.Page
{
private static Logger logger = LogManager.GetCurrentClassLogger();
protected void Page_Load(object sender, EventArgs e)
{
try
{
throw new Exception("Divide By Zero Exception", new DivideByZeroException());
}
catch (Exception ex)
{
logger.Error(ex.Message);
}
}
}
}
我们做了。现在执行您的代码并享受日志记录。
答案 7 :(得分:0)
我的问题是与权限相关的,日志文件需要允许进程对其进行写操作,没有写权限,您将不会获得文件。
以下是针对IIS中的网站进行修复的方法:
安全脚注: 从安全角度来看,最佳实践是使用ApplicationPoolIdentity,因为它是动态创建的非特权帐户。 在这里阅读更多内容:https://docs.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities
答案 8 :(得分:0)
要解决此问题,我必须在管理员模式下运行我的应用程序。我怀疑Windows的更新突然导致exe无法创建(log)文件,因为exe总是可以在没有管理员权限的情况下预先记录日志。
答案 9 :(得分:0)
在这个问题上花了很多时间。这是我的问题。我正在使用安装项目来安装带有 MSI 的 Windows 服务。我必须手动将 NLog.config 添加到安装程序的输出中,以确保将其复制到服务的安装目录中
答案 10 :(得分:-1)
出于简单的故障排除目的,启动VisualStudio以管理员身份运行。这将有助于整理调试时创建日志文件的权限。
还要在每个目标部分中使用createDirs = true在目标部分提供的文件路径中自动创建丢失的文件夹。