29

私はWindowsサービスを持っており、ロギングにnlogを使用しています。Visual Studio IDEから実行すると、すべてが正常に機能します。ログファイルは問題なく更新されます。サービスをインストールすると、サービスは正常に実行されますが、ログファイルが更新されません。それが助けになるなら、私はローカルサービスの下で走っています。はい、アプリケーションフォルダの下にlogsディレクトリを作成しました。

 <?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="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}_info.txt"
            layout="${date} ${logger} ${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" maxlevel="Info" writeTo="file" />
  </rules>
</nlog>
4

12 に答える 12

30

私もこの問題を抱えていました。genki で述べ​​たように、おそらく \Windows\System32 ディレクトリにログインしています。最初に期待しているログファイルを確認してください。サービスを書くとき、現在のディレクトリが通常のアプリケーションのように動作するように、最初にこのような行を入れることがよくあります

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
于 2009-05-13T16:17:03.123 に答える
13

ローカルサービスアカウントには、指定されたファイルの場所に書き込むためのアクセス権がありません。サービスプロパティダイアログの[ログオン]タブでシステムアカウントを使用するように設定するか、セットアッププロセスの一部としてユーザーアカウントをセットアップできます。

于 2009-05-13T15:20:21.533 に答える
13

x64 バージョンの Windows を使用している場合、ログ ファイルは C:\Windows\SysWOW64 フォルダーに保存されます。

これは、 AnyCPU構成を使用してプロジェクトをビルドし、64 ビット オペレーティング システムにデプロイする場合のデフォルトのケースです。

于 2011-04-09T10:30:01.300 に答える
2

Process Monitorを使用して、実行されているファイル操作と、それらが失敗する理由を確認できます。

(他の回答者と一緒に)これは許可の問題であり、サービスのアカウントがファイルに十分にアクセスできないのではないかと思います。

于 2009-05-13T15:34:19.340 に答える
2

同じ問題が発生したときに、この投稿が非常に役立つことがわかりました。

http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html

基本的に、構成ファイルの場所の一部として ${basedir} を含める必要があります。これにより、実行可能ファイルが実行されている場所から NLog が開始されます。

于 2013-02-11T21:50:32.873 に答える
2

好奇心から、Windows インストールの system32 ディレクトリに何かが書き込まれているかどうかを確認しましたか? Iirc、これはサービスのデフォルトのアプリケーション ランタイム ベース ディレクトリです...

于 2009-05-13T16:08:37.927 に答える
2

Enterprise フレームワークのロギングで同じ問題が発生しました。

この質問を締めくくるには、答えを合わせて正しい話をしてください。

Visual Studio IDE を使用する場合の例では、アプリケーションのユーザー権限を使用してログ ファイルが書き込まれ、ログ ファイルが書き込まれます。

Windows サービスにはこれらと同じ権限がないため、ログ ファイルは書き込まれません。Windows サービスには、

AppDomain.CurrentDomain.BaseDirectory

System.IO 名前空間を使用します。

したがって、ログ ファイルをこのベース ディレクトリに転送すると安全です。

于 2012-05-24T21:00:10.270 に答える
1

別の名前のユーザーとしてサービスをインストール/実行してみましたか。

それが機能する場合は、ローカルシステムアカウントにディレクトリ/ファイルへの書き込み権限がないという権限の問題があることを確信できます。

于 2009-05-13T15:20:49.363 に答える
0

サービスのインストールプロジェクトを作成し、それを複数回インストールした後、インストールするファイルの1つとしてNLog.configファイルが含まれていないことにようやく気付きました。実行可能ファイルと一緒に含まれているので、完全に機能しています。

NLog.configファイルは事後に手動で追加できますが、サービスを停止して再起動する必要がある場合があります。

于 2013-02-20T21:20:38.587 に答える
0

サービスが別のユーザー コンテキストで実行されており、Windows の制限が原因である可能性があります。同じ問題が発生し、次のフォルダーにログインして解決しました。

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

多分これはあなたを助けるでしょう。

于 2012-10-08T07:10:55.693 に答える
-4

こんにちは、これは私がやったことであり、うまく機能しています。クラスライブラリを作成する必要があり、このクラスに次のメソッドを追加する必要があります^^

  public static void WriteErrorLog(Exception ex)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
            sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ":" + ex.Message.ToString().Trim());
            sw.Flush();
            sw.Close();
        }
        catch
        {

        }
    }
    public static void WriteErrorLog(String Message)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
            sw.WriteLine(DateTime.Now.ToString() + ":"+Message);
            sw.Flush();
            sw.Close();
        }
        catch
        {

        }
    }

そしてあなたのサービスでは、OnStartメソッドで作成する必要があります:

Library.WriteErrorLog(" Service Started ");
//and in your OnStop method
     Library.WriteErrorLog(" Service Stoped ");

これが役立つことを願っています。

于 2016-03-04T08:45:06.803 に答える