45

WindowsMo​​bile6.1を搭載したモバイルデバイスで実行されているアプリケーションにログを追加しようとしています。�.NETCompactFramework3.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

この問題は、ログファイルがビルドディレクトリにコピーされていないことが判明しました。NLoggithubページに答えがありました。(読みやすくするために、段落を少し再フォーマットしました。) https://github.com/NLog/NLog/wiki/Logging-troubleshooting

NLogは構成ファイルを見つけることができません。これは、NLog.configファイルがビルドアクション=なしまたは出力ディレクトリにコピー=VisualStudioでコピーしないで構成されている場合に発生する可能性があります。

ビルドアクション=コンテンツを設定し、「出力ディレクトリにコピー=新しい場合はコピーしてこれを修正します)

于 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のWebサイトで修正する方法は次のとおりです。

  1. Windowsエクスプローラーでフォルダーを右クリックし、プロパティを選択します
  2. [セキュリティ]タブを選択します
  3. [編集]をクリックします
  4. [追加]をクリックします
  5. テキストボックスに「IISAppPool\YourAppPoolNameと入力し、YourAppPoolNameをサイトが実行されているアプリケーションプールの実際の名前に置き換えます。
  6. [名前を確認]をクリックします
  7. [ OK]をクリックします

セキュリティの脚注:セキュリティの観点から、ベストプラクティスは、動的に作成された非特権アカウントである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

私も同じ問題に直面しました、ついに私はそれを解決しました。NLogを実装したいWebアプリケーションがありました。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 に答える
0

これを修正するには、アプリケーションを管理者モードで実行する必要がありました。exeが管理者権限なしで以前は常にログに記録される可能性があるため、Windowsに突然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サイトフォルダーの変更アクセス許可に変更WebAPIアクセス許可を与えることで問題を解決しましたIIS_IUSRSC:\inetpub\wwwroot\my_website

ここに画像の説明を入力してください

于 2021-11-24T11:32:56.103 に答える
-1

トラブルシューティングを簡単にするために、VisualStudioを起動して管理者として実行します。これは、デバッグ中にログファイルを作成するためのアクセス許可を整理するのに役立ちます。

また、各ターゲットセクションでcreateDirs = trueを使用して、ターゲットセクションで指定されたファイルパスに欠落しているフォルダーを自動的に作成します。

于 2018-08-16T08:11:44.980 に答える