我们只需要在config文件的file的值用参数来赋值,不过还是有要注意的地方。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="log\%property{LogName}.log"/>
<appendToFile value="true"/>
<rollingStyle value="Composite"/>
<datePattern value="yyyyMMddhhmmss'asda.log'"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<root>
<level value="All"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
在设置file的值的时候,把value设置成带参数的值。%property{LogName}就是参数。还要设置file的类型,log4net.Util.PatternString。这种类型才会识别参数的写法
<file type="log4net.Util.PatternString" value="log\%property{LogName}.log"/>
下一步要在初始化log4net实例之前赋值给参数。 很多人喜欢像下面那样写。那么生成的日志文件名字就不是你所期待的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace log4net
{
class Program
{
private static log4net.ILog log =log4net.LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.GlobalContext.Properties["LogName"] = "Kenny";
log.Info("programme start");
Console.WriteLine("programme start");
Console.ReadKey();
}
}
}
结果:
所以必须在初始化log4net实例之前赋值给参数,因为log4net运行前会到config文件查找配置项目,所以要在配置前把参数赋值,否则就会变成null。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace log4net
{
class Program
{
private static log4net.ILog log;
static void Main(string[] args)
{
log4net.GlobalContext.Properties["LogName"] = "Kenny";
log = log4net.LogManager.GetLogger(typeof(Program));
log.Info("programme start");
Console.WriteLine("programme start");
Console.ReadKey();
}
}
}
这样写就对了。