web-dev-qa-db-ja.com

Windowsサービスがログファイルに書き込まないのはなぜですか?

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

 <?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>
25
Mike Roosa

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

10
Michael Meadows

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

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
28
Tim Clem

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

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

13

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

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

2
Richard

エンタープライズフレームワークのロギングで同じ問題が発生しました。

アンサーが一緒に正しい話をするこの質問を締めくくる。

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

Windowsサービスにはこれらと同じ権限がないため、ログファイルは書き込まれません。 Windowsサービスには書き込み権限があります(私はこれをテストしました)。

AppDomain.CurrentDomain.BaseDirectory

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

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

2
peterincumbria

私が同じ問題を抱えていたとき、私はこの投稿が非常に役に立ったと感じました:

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

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

2
bressain

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

1
genki

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

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

1
Eoin Campbell

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

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

0
jwatts1980

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

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

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

0
Aykut Çevik

私は非常に密接に関連した問題を抱えていました。私のNLOGは次のようになりました。

<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="c:\temp\nlog-internal.log">

<targets>
<!-- Write events to a file with the date in the filename -->
<target xsi:type="File"
  name="File"
  fileName="${basedir}/logs/${shortdate}.log"
  layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>

<rules>
<!-- Exception levels: Fatal, Error, Warn, Info, Debug, Trace -->
<logger name="*"
  minlevel="Debug"
  writeTo="File" />
</rules>

それはすべて許可関連でした。まず、サービスをインストールしたとき、ローカルサービスアカウントにLogsフォルダーへの読み取り/書き込みのアクセス許可があることを確認する必要がありました。

第二に、internalLogFileは書き込まれませんが、Nlogは関係なくアクセスしようとしているように見えます。このため、ローカルサービスに** c:\ temp **の読み取り/書き込みのアクセス許可があることを確認して、問題を解決しました。

0
Simon Miller