49

我试图找到比我更聪明的人来验证我写的一些语法。这个想法是将我的 RollingFileAppender 的文件名配置为程序集的名称,以使其对我的项目更具可重用性。

我已经看过这篇以前的 SO 文章,但它并不能完全回答我的问题......

我有一段时间试图了解 Log4net 的内部组件,这就是我想出的(位于 Global.asax 文件中 - Application_Start 方法):

// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root = 
  log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy;

if (root != null)
{
  // Bind to the RollingFileAppender
  log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");

  if (rfa != null)
  {
    // Set the file name based on the assembly name
    string filePath = 
      string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);

    // Assign the value to the appender
    rfa.File = Server.MapPath(filePath);

    // Apply changes to the appender
    rfa.ActivateOptions();
  }
}

谁能告诉我,“这太可怕了”,或者“这应该可以正常工作”?另外,如果我动态设置文件,我仍然可以期望 log4net 行为根据 log4net.config 文件设置来轮换文件吗?

非常感激!

4

4 回答 4

116

你这样做很艰难!在应用程序的配置文件中将 log4net 配置定义为 XML 并使用%property{}

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

这是动态的——你只需要在初始化 log4net之前LogName设置 log4net 属性“ ” 。因此,在您配置 log4net 之前的任何时候,在您的代码中设置此属性的所需值:

string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;

当然,您可以使用任何属性名称。我为一个简单的示例选择了“LogName”,但是如果您愿意,您可以为每个应用程序设置一个,只要您的代码知道正确的属性名称是什么以及正确的值应该是什么。

于 2009-02-21T02:28:09.850 回答
13

这是在运行时设置或更改第一个附加程序的日志文件的方法:

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();
于 2016-03-23T13:08:00.433 回答
9

2015年,我们这样做:

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

无需其他代码。

应用程序域是执行程序集的文件名。

于 2015-07-03T13:40:19.060 回答
5

它对我有用 <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

于 2018-12-27T16:26:36.720 回答