问题 如何将log4net输出到当前工作目录?


是否可以让log4net将其日志文件相对于当前工作目录而不是应用程序所在的目录?

换句话说,如果我运行.. \ myapp.exe,我不希望日志文件在.. \我希望它们在。\


5980
2017-12-17 15:17


起源



答案:


我最终查看了log4net源,并确定我可以实现自己的扩展器,扩展FileAppender并覆盖File属性。

class CWDFileAppender : FileAppender
{
    public override string File
    {
        set
        {
            base.File = Path.Combine(Directory.GetCurrentDirectory(), value);
        }
    }
}

我只是在配置中使用CWDFileAppender。


14
2017-12-17 16:07



嘿kiko,把这些更新放在你的答案中。保持线程干净,除非你对自己的问题有正确的答案...... - Peter Lillevold
这是我自己问题的“正确”答案。 - Ken Goodridge
虽然我继承自RollingFileAppender,但这对我来说效果很好。我也将它放在我使用的公共库中,这样我就可以在我的所有项目中使用它。如果这样做,请记住在配置中指定程序集。 <appender name =“LogFileAppender”type =“My.Library.CurrentDirectoryRollingFileAppender,My.Library”> - Stuntbeaver
这对我有用。 - RClemens


答案:


我最终查看了log4net源,并确定我可以实现自己的扩展器,扩展FileAppender并覆盖File属性。

class CWDFileAppender : FileAppender
{
    public override string File
    {
        set
        {
            base.File = Path.Combine(Directory.GetCurrentDirectory(), value);
        }
    }
}

我只是在配置中使用CWDFileAppender。


14
2017-12-17 16:07



嘿kiko,把这些更新放在你的答案中。保持线程干净,除非你对自己的问题有正确的答案...... - Peter Lillevold
这是我自己问题的“正确”答案。 - Ken Goodridge
虽然我继承自RollingFileAppender,但这对我来说效果很好。我也将它放在我使用的公共库中,这样我就可以在我的所有项目中使用它。如果这样做,请记住在配置中指定程序集。 <appender name =“LogFileAppender”type =“My.Library.CurrentDirectoryRollingFileAppender,My.Library”> - Stuntbeaver
这对我有用。 - RClemens


根据配置文件不可能 这里。如果您从程序内部手动配置它,则可能:

public static log4net.Appender.IAppender CreateFileAppender(string name,
string fileName)
{
  log4net.Appender.FileAppender appender = new
log4net.Appender.FileAppender();
  appender.Name = name;
  appender.File = fileName;
  appender.AppendToFile = true;

  log4net.Layout.PatternLayout layout = new
log4net.Layout.PatternLayout();
  layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
  layout.ActivateOptions();

  appender.Layout = layout;
  appender.ActivateOptions();

  return appender;
}

然后,您可以将其与记录器关联,如下所示:

AddAppender("Log4net.MainForm", CreateFileAppender("FileAppender",   
Path.Combine(Directory.GetCurrentDirectory(), "foo.log")));

2
2017-12-17 15:28



这证实了我的想法。我用一种非常简单的方法发布了我自己的答案,使其可配置。 - Ken Goodridge