2009-05-13 12 views
25

私はWindowsサービスを持っており、ログにはnlogを使用しています。私はビジュアルスタジオideから実行するとすべてうまく動作します。ログファイルは問題なく更新されます。サービスをインストールすると、サービスはうまく動作しますが、ログファイルは決して更新されません。それが役に立ったら私はローカルサービスの下で走っています。はい、アプリケーションフォルダの下にlogsディレクトリを作成しました。Windowsサービスがログファイルに書き込まれないのはなぜですか?

<?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> 
+0

は、実際にはどの言語にも適用されますが、c#と.netだけではありません。私は私のC++ Windowsサービスのためにこの問題を抱えていました。 –

+0

この種の問題については、常に[内部ログ](https://github.com/NLog/NLog/wiki/Internal-Logging)を確認してください。 – Julian

答えて

10

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

+2

またはインストーラでそのディレクトリに書き込むためのローカルサービスパーミッションを与えるだけです。 –

+2

インストーラではどのように許可しますか? nlog.configもプロジェクトのbinディレクトリにありますが、セットアップファイルには移動しません。どうすればいいのですか? –

2

サービスを別の名前のユーザーとしてインストールまたは実行しようとしましたか?

これがうまくいくと、ローカルシステムアカウントにディレクトリ/ファイルへの書き込み権限がないアクセス権の問題が発生している可能性があります。

3

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

私は、(これは他の回答者と同様に)サービスのアカウントがファイルへの十分なアクセス権を持たない許可問題であると思われます。

+1

チップリチャードのおかげで、これでnlog.configファイルが存在しなかったことに気付きました。それをロードしてまだ動作していませんが、私はそれが問題の一部であると確信しています –

2

Windowsインストールのsystem32ディレクトリに何かが書かれているかどうかチェックしましたか? Iirc、それはサービスのデフォルトのアプリケーションランタイムベースディレクトリです...

30

私もこの問題を抱えていました。 genkiが述べたように、おそらく\ Windows \ System32ディレクトリにログインしているはずです。たぶんあなたが最初にそこに期待しているログファイルを確認します。サービスを書くとき、私は、多くの場合、ログファイルはCに保存されているよりも、あなたは、Windowsのx64バージョンを使用している場合は、通常のアプリケーションのように

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
+1

はsystem32のように見えません –

+0

システム32ではなく、そのSysWOW64 – julestruong

11

を動作するように、現在のディレクトリを取得するために、最初にこのような行を入れています: \ Windows \ SysWOW64フォルダ

AnyCPU設定を使用してプロジェクトを構築し、64ビットオペレーティングシステムに展開する場合のデフォルトのケースです。

2

私はエンタープライズフレームワークのロギングで同じ問題を抱えています。

Answersが一緒に正しいストーリーを伝えるこの質問を結論づけてください。

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

Windowsサービスにはログファイルが書き込まれないように、これらのアクセス許可はありません。 Windowsサービスには、書き込みを行うためのアクセス許可(私はこれをテストしたもの)があります。

AppDomain.CurrentDomain.BaseDirectory 

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

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

+0

これは私のWindowsサービスと完全に機能しました。ありがとう! – Baxter

1

サービスが他のユーザーコンテキストで実行されている可能性もありますし、Windowsの制限もあります。私は同じ問題を抱えており、次のフォルダにログインして解決しました。

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

おそらくこれが役に立ちます。

3

私は同じ問題が持っていたとき、私はこの記事が非常に役に立った:

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

を基本的に、あなたはあなたの設定でファイルの場所の一部として$ {BASEDIR}をしたいと思います。これにより、実行可能ファイルが実行されている場所でNLogが開始されます。

+0

ありがとうございました!これだよ。 basedirのものを入れて、それは動作します。 – Vetras

1

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

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

-2

やあ、これは私がやったことであり、それはuはクラスライブラリを作成する必要がありますし、このクラスで^^

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 
     { 

     } 
    } 

次Methodeのを追加して、あなたのサービスでuはのOnStartメソッドで行う必要があり、うまく仕事だ:

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

これは役に立ちそうです。

+0

これはロギングの* a *メソッドですが、OPが使用しているnlogのような適切なロギングフレームワークの代わりにはなりません。 – mutex

関連する問題