我有一个带有log4net的C#项目。 log4net配置打印每行的堆栈跟踪详细信息,例如:
<param name="LogPattern" value="[%date] %stacktracedetail{3} %m" />
然而,由于堆栈跟踪会为每个方法打印完全限定的类名,因此这会使行变得有点不可读。甚至参数名称都以System
为前缀:
[2018-03-14 12:14:02,265] a.b.class1.myMethod(System.String param1, System.Int32 param2) > a.b.class2.myMethod(System.String param1, System.Int32 param2) > a.b.class3.myMethod(System.String param1, System.Int32 param2) logmessage
如何删除完全限定的类名?例如:
[2018-03-14 12:14:02,265] class1.myMethod(String param1, Int32 param2) > class2.myMethod(String param1, Int32 param2) > class3.myMethod(String param1, Int32 param2) logmessage
答案 0 :(得分:1)
据我所知,单凭配置无法做到这一点。如果您确实希望这样做,我建议您通过扩展您当前使用的任何追加者(例如Appender
)并覆盖log4net.Appender.RollingFileAppender
方法来创建自己的RenderLoggingEvent(TextWriter writer, LoggingEvent loggingEvent)
。
在您的重写方法中,您将要调用基类RenderLoggingEvent(LoggingEvent loggingEvent)
以将事件呈现为字符串。现在你已经得到了你的字符串,你可以使用正则表达式来删除你不希望在日志中看到的任何内容。
如下所示(注意:这只是头码,它可能无法正常工作,只是为了说明)
public class MySpecialFileAppender : log4net.Appender.RollingFileAppender
{
protected void RenderLoggingEvent(TextWriter writer, LoggingEvent loggingEvent)
{
var rendered = RenderLoggingEvent(loggingEvent);
var adjusted = AdjustText(rendered);
writer.Write(adjusted);
}
private string AdjustText(string inputText)
{
return "HELLO WORLD!!!";
}
}
这是一个快速而肮脏的解决方案,因为正确地执行此操作会要求您write your own Pattern Layout Converter基于现有的stacktracedetail
转换器,该转换器引用内部的类log4net.Layout.Pattern.StackTraceDetailPatternConverter
。所以...是的,那将是很多工作。