3

同じプログラムの2つのインスタンスは、別々のファイルにログインするように構成されています。これが私のlog4net.configです。

<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%utcdate] %-5level %logger: %message%newline%exception"/>
    </layout>
  </appender>

  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="Log/svc-%property{ServiceName}"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value="'-'yyyy'-'MM'-'dd'.log'"/>
    <staticLogFileName value="false"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%utcdate] %-5level %logger: %message%newline%exception"/>
    </layout>
  </appender>

 <root>
    <level value="DEBUG"/>
    <appender-ref ref="ConsoleAppender"/>
    <appender-ref ref="RollingFileAppender"/>
  </root>
</log4net>

そして、これが私がログをインスタンス化する方法です:

    log = LogManager.GetLogger(ServiceName);
    GlobalContext.Properties["ServiceName"] = ServiceName;
    XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));

現在、サービスは「Service1」、「Service10」、「Service2」などと呼ばれています。

テストしているサービス1と10を開始すると、両方ともログファイルを作成します。

svc-BettweenSvc1-2011-07-26.log
svc-BettweenSvc10-2011-07-26.log

ただし、2番目のサービスが開始されると、最初のサービスのログが2番目のログに追加され始め、そのサービスは使用されなくなります。

log4netを使用してWindowsサービスでログファイルを正しく分離するためにログを記録するにはどうすればよいですか?

4

2 に答える 2

0

問題は、log4netリポジトリが1つしか構成されていないことだと思います(ほとんどの場合、デフォルトのリポジトリです)。したがって、log4netログファイル名を変更すると、すべてのロガーが新しいファイル名へのログ記録を開始します。

同時にアクティブにする個別のログファイルごとに個別のリポジトリを構成する必要があると思います。

申し訳ありませんが、これ以上お役に立てず、現在ほぼ同じ問題に苦しんでいます(とりわけ、より差し迫った問題)。

幸運を!

編集:考えられる解決策については、この質問/回答を確認してください: how-to-stop-log4net-from-writing-to-two-separate-files

于 2011-07-26T16:29:25.097 に答える
0

記録のために、これは機能しますが、私がテストしているものではありません。それでも私のサービスでは機能しません。他の人を助けるために投稿します。

namespace log4netMultiLogTester
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Process.Start(new ProcessStartInfo("log4netMultiLogTester.exe", "testApp1"));
                Process.Start(new ProcessStartInfo("log4netMultiLogTester.exe", "testApp2"));
            }
            else
            {
                var logId = args[0];
                var log = LogManager.GetLogger(logId);

                GlobalContext.Properties["ServiceName"] = logId;
                XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));

                log.Info("Starting log: {0}".FormatWith(logId));

                do
                {
                    log.Info("Log: {0}, latest entry is {1}".FormatWith(logId,DateTime.Now.Ticks));
                } while (Console.ReadKey().Key != ConsoleKey.R);
            }
        }
    }

    public static class StringExtensions
    {
        public static string FormatWith(this string text,params object[] args)
        {
            return string.Format(text, args);
        }
    }
}
<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%utcdate] %-5level %logger: %message%newline%exception"/>
    </layout>
  </appender>

  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="Log/svc-%property{ServiceName}"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value="'-'yyyy'-'MM'-'dd'.log'"/>
    <staticLogFileName value="false"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%utcdate] %-5level %logger: %message%newline%exception"/>
    </layout>
  </appender>

 <root>
    <level value="DEBUG"/>
    <appender-ref ref="ConsoleAppender"/>
    <appender-ref ref="RollingFileAppender"/>
  </root>
</log4net>
于 2011-07-26T20:11:08.440 に答える