私は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>
ローカルサービスアカウントには、指定されたファイルの場所に書き込むためのアクセス権がありません。サービスのプロパティダイアログの[ログオン]タブでシステムアカウントを使用するように設定するか、セットアッププロセスの一部としてユーザーアカウントを設定できます。
私もこの問題を抱えています。 genkiが述べたように、おそらく\ Windows\System32ディレクトリにログインしています。おそらく、最初にそこにあるはずのログファイルを確認してください。サービスを作成するとき、現在のディレクトリを通常のアプリケーションのように動作させるために、最初にこのような行を頻繁に挿入しました
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
X64バージョンのWindowsを使用している場合、ログファイルはC:\ Windows\SysWOW64フォルダーに保存されます
AnyCP構成を使用してプロジェクトをビルドし、64ビットオペレーティングシステムにデプロイする場合、これがデフォルトのケースです。
Process Monitor を使用して、実行されているファイル操作と、それらが失敗した理由を確認できます。
私は(他の回答者とともに)これがアクセス許可の問題であり、サービスのアカウントにファイルへの十分なアクセス権がないことを疑います。
エンタープライズフレームワークのロギングで同じ問題が発生しました。
アンサーが一緒に正しい話をするこの質問を締めくくる。
あなたの例では、Visual Studioを使用している場合IDEアプリケーションのユーザー権限を使用してログファイルが書き込まれ、ログファイルが書き込まれます。
Windowsサービスにはこれらと同じ権限がないため、ログファイルは書き込まれません。 Windowsサービスには書き込み権限があります(私はこれをテストしました)。
AppDomain.CurrentDomain.BaseDirectory
system.IO名前空間を使用します。
したがって、ログファイルをこのベースディレクトリに転送すれば、安全です。
私が同じ問題を抱えていたとき、私はこの投稿が非常に役に立ったと感じました:
http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html
基本的に、構成のファイルの場所の一部として$ {basedir}を含める必要があります。これにより、実行可能ファイルが実行されている場所からNLogが開始されます。
好奇心から、Windowsインストールのsystem32ディレクトリに何かが書き込まれているかどうかを確認しましたか? Iirc、これはサービスのデフォルトのアプリケーションランタイムベースディレクトリです...
別の名前のユーザーとしてサービスをインストール/実行してみましたか?.
それが機能する場合は、ローカルシステムアカウントにディレクトリ/ファイルへの書き込み権限がないという権限の問題があると確信できます。
サービスのインストールプロジェクトを作成し、それを複数回インストールした後、最終的に、インストールするファイルの1つとしてNLog.configファイルが含まれていないことに気付きました。実行可能ファイルと一緒に含まれるようになったので、完全に機能しています。
価値があることについては、NLog.configファイルを事後に手動で追加できますが、サービスを停止して再起動する必要がある場合があります。
サービスが他のユーザーコンテキストで実行されているか、Windowsの制限が原因である可能性があります。私は同じ問題を抱えていて、次のフォルダにログインしてそれを解決しました:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
多分これはあなたを助けるでしょう。
私は非常に密接に関連した問題を抱えていました。私の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 **の読み取り/書き込みのアクセス許可があることを確認して、問題を解決しました。