在Log4Net记录log时,需要在log文件中记录当前log的行号,而Log4Net的%Line是输出当前语句所在的行,所以需要扩展Converter和Layout两个类。
以PatternLayout为例说明
新建两个类分别继承 PatternLayoutConverter 和 PatternLayout。两个类的实现如下:
public class LineIndexConvert : PatternLayoutConverter
{
private long index=1L;
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
writer.Write(index++);
}
}
public class LineIndexLayout : PatternLayout
{
public LineIndexLayout()
{
AddConverter("LineIndex", typeof(LineIndexConvert));
}
}
将代码或配置中的PatternLayout,替换成上面的LineIndexLayout,如在代码中配置如下:
LineIndexLayout patternLayout = new LineIndexLayout
{
ConversionPattern = "[%LineIndex]%date{yyyy-MM-dd HH:mm:ss.fff} %5level [%4thread] %message"
};
patternLayout.ActivateOptions();
其中的%LineIndex是每次输出的行号,如下
[1]2017-06-19 09:17:33.408 INFO [ 12] -SetWriteCommandObjec
[2]2017-06-19 09:17:33.416 INFO [ 12] -SetWriteCommandObject
[3]2017-06-19 09:17:33.417 INFO [ 12] -SetWriteCommandObject
[4]2017-06-19 09:17:33.419 INFO [ 12] -SetWriteCommandObject
[5]2017-06-19 09:17:33.421 INFO [ 12] -SetWriteCommandObject
[6]2017-06-19 09:17:33.423 INFO [ 12] -SetWriteCommandObject
[7]2017-06-19 09:17:33.425 INFO [ 12] -SetWriteCommandObject
[8]2017-06-19 09:17:33.426 INFO [ 12] -SetWriteCommandObject
[9]2017-06-19 09:17:33.428 INFO [ 12] -SetWriteCommandObject
[10]2017-06-19 09:17:33.430 INFO [ 12] -SetWriteCommandObject
[11]2017-06-19 09:17:33.432 INFO [ 12] -SetWriteCommandObject
[12]2017-06-19 09:17:33.433 INFO [ 12] -SetWriteCommandObject
[13]2017-06-19 09:17:33.435 INFO [ 12] -SetWriteCommandObject
[14]2017-06-19 09:17:33.437 INFO [ 12] -SetWriteCommandObject
[15]2017-06-19 09:17:33.438 INFO [ 12] -SetWriteCommandObject
[16]2017-06-19 09:17:33.440 INFO [ 12] -SetWriteCommandObject
[17]2017-06-19 09:17:33.442 INFO [ 12] -SetWriteCommandObject
[18]2017-06-19 09:17:33.444 INFO [ 12] -SetWriteCommandObject
[19]2017-06-19 09:17:33.445 INFO [ 12] -SetWriteCommandObject