NLog不会创建日志文件

时间:2012-05-11 11:50:34

标签: c# compact-framework nlog

我正在尝试将日志记录添加到使用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();
}

11 个答案:

答案 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>

从这里采取using AppData location in NLog

答案 3 :(得分:3)

来自nlog故障排除指南

请检查Nlog.config文件属性:复制到输出目录应为始终复制

请查看图片链接https://i.stack.imgur.com/AlUG5.png

答案 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。

步骤1:-转到NuGet软件包管理器并安装以下软件包。 enter image description here

第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中的网站进行修复的方法:

  1. 在Windows资源管理器中右键单击您的文件夹,然后选择属性
  2. 选择安全标签
  3. 点击修改
  4. 点击添加
  5. 在文本框中键入“ IIS AppPool \ YourAppPoolName 将YourAppPoolName替换为您的网站在其下运行的应用程序池的实际名称。
  6. 点击检查姓名
  7. 点击确定

安全脚注: 从安全角度来看,最佳实践是使用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在目标部分提供的文件路径中自动创建丢失的文件夹。