45

我正在尝试向使用 Windows Mobile 6.1 的移动设备上运行的应用程序添加日志记录。.NET Compact 框架 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();
}
4

13 回答 13

53

我遇到了这个问题,原来我的日志文件没有被复制到我的构建目录中。NLog github 页面给出了答案。(为了更好的可读性,我对段落进行了一些重新格式化。) https://github.com/NLog/NLog/wiki/Logging-troubleshooting

NLog 找不到配置文件。当 NLog.config 文件配置为 Build Action = None 或 Copy to Output Directory = Do not copy in Visual Studio 时,可能会发生这种情况。

设置构建操作 = 内容和“复制到输出目录 = 如果更新则复制以解决此问题)

于 2017-04-14T21:42:27.877 回答
23

正在创建日志文件 - 但不在应用程序目录中。

使用${basedir}布局渲染器作为文件名的一部分被证明是一种解决方案。

于 2012-05-11T12:18:53.273 回答
17

如果标记为答案的响应不是那么清楚,您可以查看示例

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

使用 NLog 中的 AppData 位置从此处获取

于 2013-05-10T15:36:45.853 回答
14

来自nlog 故障排除指南

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

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

于 2018-04-24T07:54:04.337 回答
6

我的问题与权限有关,日志文件需要允许进程写入它,没有写入权限,您将不会获得任何文件。

以下是在 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

于 2019-05-17T16:18:45.057 回答
5

从 nlog 故障排除指南:

https://github.com/NLog/NLog/wiki/Logging-troubleshooting

如果你知道你的配置文件肯定被找到了,暂时用下面的替换你的 NLog.config 文件的部分并尝试一下。

此规则将匹配您创建的任何记录器,如果有效,它将在“基本目录”中放置一个 log.txt 文件 - 这是您的测试实例的“bin”目录,例如,如果您在调试中运行模式下,您会在 bin > debug 文件夹中看到 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="file" 对目标有效 - 其他值没有

如上所述添加 throwExceptions="true" 还可以确保您在调试时收到有用的错误消息。

于 2017-06-19T06:49:58.770 回答
3

就我而言,在定义规则后我错过了规则就像一个魅力

 <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>
于 2017-12-22T11:18:18.657 回答
1

在这个问题上花了很多时间。这是我的问题。我正在使用安装项目来安装带有 MSI 的 Windows 服务。我必须手动将 NLog.config 添加到安装程序的输出中,以确保将其复制到服务的安装目录中

于 2021-07-07T17:27:34.330 回答
0

在我的情况下,一个WebAPI应用程序,我通过将IIS_IUSRS修改权限授予网站文件夹的修改权限来解决问题C:\inetpub\wwwroot\my_website

在此处输入图像描述

于 2021-11-24T11:32:56.103 回答
0

为了解决这个问题,我必须以管理员模式运行我的应用程序。我怀疑windows有一个更新突然阻止exe创建(日志)文件,因为exe总是可以在没有管理员权限的情况下预先登录。

于 2020-10-08T14:26:44.503 回答
0

在我的情况下,我不得不在代码中手动加载 NLog.config 文件,因为它不是自动找到的。加载配置必须在生成日志之前完成。

LogManager.LoadConfiguration(@"D:\doe\ConsoleApp2\ConsoleApp2\NLog.config");

之后我得到了日志文件和控制台输出。

于 2021-09-13T11:37:53.477 回答
0

我也遇到了同样的问题,终于解决了。我有一个 Web 应用程序,我想在其中实现 NLog。请找到以下步骤来实现 NLog。

第 1 步:- 转到 NuGet 包管理器并安装以下包。 在此处输入图像描述

第 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);
        }
    }
  }
}

我们已经做到了。现在执行您的代码并享受日志记录。

于 2018-08-22T11:40:06.953 回答
-1

出于简单的故障排除目的,启动 VisualStudio 以管理员身份运行。这将有助于整理在调试时创建日志文件的权限。

还在每个目标部分中使用 createDirs=true 以在目标部分提供的文件路径中自动创建缺少的文件夹。

于 2018-08-16T08:11:44.980 回答