2016-11-29 210 views
0

我无法找到关于我正在寻找的信息。基本上需要能够即时创建日志文件。详细地说,我们希望能够根据某些事件更改日志文件的位置。log4net动态创建日志文件

例如: 所以我从C:\ Type1Logs \ Log.txt开始,并正常写入文件。接下来会出现一个事件,它会要求在C:\ Type2Logs \ Logs.dat中创建的新文件以及发送到该文件的所有新日志消息。

以下是我用作原型的一些简单代码。我添加了hier进行调试,看看我是否可以使用该路线进行更改。它确实让我发现我现在的代码创建了另一个appender,而不是改变现有的appender。

using log4net; 
using log4net.Appender; 
using log4net.Config; 
using log4net.Core; 
using log4net.Layout; 
using log4net.Repository.Hierarchy; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace TestConsoleApp 
{ 
    class Program 
    { 
     private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); 

     static void Main(string[] args) 
     { 
      string Input = ""; 

      Logger.ConfigureFileAppender("log.txt"); // This only has to be called once. 

      while (Input.ToUpper() != "QUIT") 
       { 
       Console.WriteLine("Enter text to write to the log"); 
       Input = Console.ReadLine(); 

       if (Input.Length > 7 && Input.ToUpper().Substring(0,6) == "NEWLOG") 
       { 
        Logger.ConfigureFileAppender(Input.Substring(6)); 
        Hierarchy hier = log4net.LogManager.GetRepository() as Hierarchy; 


       } 

       Log.Info(Input); 
      } 

     } 
    } 


class Logger 
    { 
     public static void ConfigureFileAppender(string logFile) 
     { 
      var fileAppender = GetFileAppender(logFile); 
      BasicConfigurator.Configure(fileAppender); 
      ((Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug; 
     } 

     private static IAppender GetFileAppender(string logFile) 
     { 
      var layout = new PatternLayout("%date %-5level %logger - %message%newline"); 
      layout.ActivateOptions(); // According to the docs this must be called as soon as any properties have been changed. 

      var appender = new FileAppender 
      { 
       File = logFile, 
       Encoding = Encoding.UTF8, 
       Threshold = Level.Debug, 
       Layout = layout 
      }; 

      appender.ActivateOptions(); 

      return appender; 
     } 
    } 
} 
+0

看看这个帖子是你在寻找: [log4net的:以编程方式指定多个记录器(http://stackoverflow.com/ a/308544/2794484) –

+1

[This answer](http://stackoverflow.com/a/6963420/43846)显示如何更改现有appender上的文件位置 – stuartd

+0

感谢您的链接。 Stuartd的是我需要的。有趣的是,我只是在十分钟前找出答案,当我看到你的评论时即将发布答案:) –

回答

0

这段代码是我最终得到我需要的东西。我用下面的文章点我在正确的方向 - >http://blog.gfader.com/2010/05/log4net-how-to-change-settings-of.html

// Get the Hierarchy object that organizes the loggers 
        Hierarchy hier = log4net.LogManager.GetRepository() as Hierarchy; 
        if (hier != null) 
        { 
         // Get Appender 
         FileAppender fileAppender = 
          (FileAppender)hier.GetAppenders().Where(
           appender => appender.Name.Equals("MyLogger", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); 

         if (fileAppender != null) 
         { 
          fileAppender.File = Input.Substring(6); 

          //refresh settings of appender 
          fileAppender.ActivateOptions();       
         } 
        }