1

Windows サービス用の単純なファイル ロガーを作成しようとしていますが、ファイルが書き込まれません。ここに私のapp.configファイルがあります:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <connectionStrings>
    <add name="MyAppConnectionString" connectionString="Data Source=.;Initial Catalog=MyApp;Integrated Security=True;MultipleActiveResultSets=True" />
    <add name="MyAppEntities" connectionString="metadata=res://*/MyAppModel.csdl|res://*/MyAppModel.ssdl|res://*/MyAppModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyApp;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <system.web>
    <roleManager enabled="true" defaultProvider="MyAppSqlRoleProvider">
      <providers>
        <add name="MyAppSqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider"
             applicationName="MyApp"
             connectionStringName="MyAppConnectionString"/>
      </providers>
    </roleManager>
  </system.web>
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="C:/logfiles/MyAppAlarms.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
</configuration>

これに似た投稿が他にもあることは知っていますが、それらを読んで、一見すべてを試してみましたが、どこにも到達できませんでした. 上記の同じタグをコンソールアプリに入れてみましたが、うまくいきました。app.config をコピーして C:\ ドライブに貼り付け、AssemblyInfo.cs でこれを使用して参照しようとしました。

[アセンブリ: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = @"C:\app.config")]

しかし、それはうまくいきませんでした。デバッガーを使用してサービスにアタッチできましたが、ここでそれをどのように活用できるかわかりません。何も例外をスローしていません。StreamWriter を使用して同じファイルに書き込もうとしたところ、うまくいったので、書き込み権限の問題ではないことがわかりました。

私は次に何をしようか途方に暮れています。デバッグ情報を取得して何が問題なのかを特定する方法はありますか? 内部デバッグを有効にして DebugView を実行しようとしましたが、低レベルのネットワーク メッセージ以外は何も表示されませんでした。また、log4net debug=true を設定しようとしましたが、これはサービスに役立たないコンソールに書き込むと思います。

4

4 に答える 4

1

私も同じ問題に直面していました。ロガーを構成するためにサービスを実行しているときに、以下のステートメントを使用しました。

XmlConfigurator.Configure();

そしてそれはうまくいきました。

于 2014-04-01T09:56:59.997 に答える
0

app.configファイルの名前が正しいことを確認してください。サービスの実行可能ファイルがMyService.exeの場合、構成ファイルの名前はMyService.exe.configにする必要があります。

私はこれに何度か噛まれてきましたが、今では最初にチェックするものの1つです。

参照:App.ConfigとAppName.exe.Config

于 2012-08-22T20:25:39.243 に答える
0

ログに書き込むサービスには、イベント ビューアーのセキュリティ ログにアクセスするための管理者権限が必要です。これは、管理者アクセス権を持つアカウントを使用してサービスを開始することでテストできます。運用環境では管理者アクセス権を持つアカウントを使用しないでください。一時的なテストとしてのみ使用してください。

これを修正するには、カスタム イベント ログを作成します。セキュリティ ログにアクセスする必要がなくなります。

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
      <logName value="System" />
      <applicationName value="AppName" />
      ...
</appender>
于 2013-03-15T02:03:53.120 に答える
0

サービスをデバッグしている場合は、DbgView でCapture Global Win32が有効になっていることを確認してください。log4net debug=true を設定すると、コンソールと dbgview の両方にメッセージが表示されます。

プログラムの開始時に ServiceBase.Run( ..) コマンドを呼び出す前にlog.Debug呼び出しがある場合は、コマンド プロンプトから直接 exe を実行できるはずです。コマンド ラインからサービスを開始できないというエラー メッセージが表示される前にメッセージをログに記録します。これにより、問題が何であるかを示すことができます。(もちろん、これを行うと、異なる資格情報でプログラムを実行している可能性があることに注意する必要があります。)

また、コマンドラインからサービス以外のプログラムでプログラム全体を実行したい場合は、通常、数行を変更することで実行できます。

あなたのサービスはおそらく次のようなものを使用して開始します

static void Main()
{
     log.Debug("Start Up");
     ServiceBase.Run(new MainService());         
}

これを次のように変更できます

static void Main()
{
     log.Debug("Start Up");
     MainService ms = new MainService();
     ms.OnStart(null);
}

または、再コンパイルせずに切り替えられるようにしたい場合は、次のようなものです

 // The main entry point for the process
    static void Main(string[] args)
    {
       log.Debug("Start Up");

        string cmdLine = args.Length == 0 ? "" : args[0].ToLower().Substring(1);

        // If we are debugging or if we have been passed the /NonService 
        // commandline, then start the program in non-service mode.

        if (System.Diagnostics.Debugger.IsAttached 
             || string.Equals(cmdLine, "NonService" , System.StringComparison.CurrentCultureIgnoreCase))
        {
            MainService ms = new MainService();
            ms.OnStart(null);
        }
        else
        {
            ServiceBase.Run(new MainService());
        }
    }
于 2012-08-23T13:39:06.220 に答える