网上很多关于自定义输出的都需要定义新类,一个自定义属性要关联一个新类,要用的自定义字段要是很多,不是很方便。
好在Log4net是开源的,查看源码,发现Convert类中有一个Optain属性,用此属性定义一个公共类
namespace TestLog4net
{
public class CustomLayout:log4net.Layout.PatternLayout
{
public CustomLayout()
{
this.AddConverter("Custom", typeof(CustomConvert));
}
}
public class CustomConvert : log4net.Layout.Pattern.PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (!string.IsNullOrEmpty(Option))
{
object obj = loggingEvent.MessageObject;
if (obj != null)
{
PropertyInfo info = obj.GetType().GetProperty(Option);
if (info != null)
{
object cusMsg = info.GetValue(obj, null);
writer.Write(cusMsg);
}
}
}
}
}
}
配置文件:
<!--定义输出到文件中-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="D:/log4netfile.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyyMMdd-HH:mm:ss"/>
<layout type="TestLog4net.CustomLayout">
<conversionPattern value="%n %-5level %logger [%property{NDC}] - %Custom{LogName}%Custom{Info}%n"/>
</layout>
</appender>
红色的为自定义类的属性名
public class LogInfo
{
[DataMember]
public string LogName
{
get;
set;
}
[DataMember]
public string Info
{
get;
set;
}
public override string ToString()
{
return string.Format("[LogName:{0}],[Info:{1}]", LogName, Info);
}
}