3

ここで何が起こっているのかわかりませんが、すべての呼び出しでXmlConfigurator.Configure()を呼び出さない限り、ロギングコードはrollingFileAppenderに書き込まれません。次のコードでデバッグをオンにしました。コンストラクターでConfigureが1回だけ呼び出された場合、構成がプルされているように見えますが、Log()が実際に呼び出された場合、ログファイルに何も起こりません。デバッグウィンドウに表示されます。Log()でConfigure()の呼び出しのコメントを解除し、呼び出しごとに再構成させると、問題なく機能しますが、それが意図された使用法ではないと思います。

ボーナスポイント!--log.Info()の最初の呼び出しはログに記録されていませんが、プロセスの各実行での後続の呼び出しはすべて正常です。

ありがとう!

  public static class LogToFile
{
    public const string RollingFileAppenderName = "RollingFileLogger";

    static LogToFile()
    {
        log4net.Config.XmlConfigurator.Configure();
    }

    public static void Log(string fileNameBase, string message, string context)
    {
        if (fileNameBase == null) throw new ArgumentNullException("fileNameBase");
        if (message == null) throw new ArgumentNullException("message");
        if (context == null) throw new ArgumentNullException("context");

        //log4net.Config.XmlConfigurator.Configure();

        string fileName = string.Format("{0}_{1}.log", fileNameBase, context);
        string fullFileName = Path.Combine(Properties.Settings.Default.LogFilePath, fileName);

        if (!Directory.Exists(Properties.Settings.Default.LogFilePath)) Directory.CreateDirectory(Properties.Settings.Default.LogFilePath);

        LogicalThreadContext.Properties["LogName"] = string.Format(fullFileName);
        ILog log = LogManager.GetLogger(RollingFileAppenderName);

        log.Info(message);
    }
}

    <appender name="rollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="%property{LogName}" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="2MB" />
  <countDirection value="-1"/>
  <LockingModel value="log4net.Appender.FileAppender+MinimalLock"/>
  <staticLogFileName value="false" />
  <immediateFlush value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="AlertMessageHandler Message : %-25date [%thread] - %newline%message%newline" />
  </layout>
</appender>
4

3 に答える 3

2

構成ファイルには、実行時に変更するLogNameプロパティを使用するようにログファイル名が設定されていることが示されています。アペンダーを再初期化する(ActivateOptionsを呼び出す)か、XmlConfigurator.Configure()を呼び出すことなく、実行時にアペンダーのプロパティを変更することは許可されていないといつも思っていました。

また、logメソッドで、 LogNameを設定する前にXmlConfigurator.Configure()を呼び出すと、最初の呼び出しが失敗し(nullに書き込もう)、2番目の呼び出しがで使用されるはずのファイルに書き込まれると思われます。最初の呼び出し。

LogNameを設定した後でXmlConfigurator.Configure()を移動すると、正しく機能するはずです。

于 2012-04-19T14:58:32.883 に答える
1

そのように、メソッドの外部でログ変数を宣言してみてください。

private static readonly ILog log = LogManager.GetLogger(typeof(LogToFile));

それが私がそれを使う方法であり、私は問題を抱えなければなりません。ただし、私の場合、静的クラスにはログインしません。

また、アペンダー情報は、XmlConfigurator.Configure()関数で指定したファイルにあります。

log4net.Config.XmlConfigurator.Configure(new FileInfo(configFile));
于 2012-04-19T14:01:54.177 に答える
1

実際のsgmooreのアドバイスは、私を解決策に導きました。構成ファイルのプロパティをいじる代わりに、Appenderオブジェクトのログファイルに名前を付けることができれば、ActivateOptionsの呼び出しは問題なく機能します。これが動作するコードです。ありがとう!

public static class LogToFile
{
    public const string RollingFileLoggerName = "RollingFileLogger";

    public const string RollingFileAppenderName = "rollingFileAppender";

    private static readonly ILog Logger = LogManager.GetLogger(RollingFileLoggerName);

    /// <summary>
    /// Logs to log4net rollingFileAppender
    /// </summary>
    /// <param name="fileNameBase">prefix of log filename</param>
    /// <param name="message">log4net message property</param>
    /// <param name="context">files grouped by context</param>
    public static void Log(string fileNameBase, string message, string context)
    {
        if (fileNameBase == null) throw new ArgumentNullException("fileNameBase");
        if (message == null) throw new ArgumentNullException("message");
        if (context == null) throw new ArgumentNullException("context");

        string fileName = string.Format("{0}_{1}.log", fileNameBase, context);
        string fullFileName = Path.Combine(Properties.Settings.Default.LogFilePath, fileName);

        if (!Directory.Exists(Properties.Settings.Default.LogFilePath)) Directory.CreateDirectory(Properties.Settings.Default.LogFilePath);

        ActivateAppenderOptions(string.Format(fullFileName));

        Logger.Info(message);
    }

    /// <summary>
    /// Update the appender in log4net after setting the log file path
    /// </summary>
    /// <param name="filename"></param>
    private static void ActivateAppenderOptions(string filename)
    {
        var hierarchy = (Hierarchy)LogManager.GetRepository();
        var appenders = hierarchy.GetAppenders();
        foreach (
            var rfa in appenders.OfType<RollingFileAppender>().Where(rfa => rfa.Name == RollingFileAppenderName))
        {
            rfa.File = filename;
            rfa.ActivateOptions();
        }
    }
}
于 2012-04-19T15:34:15.143 に答える