Tag: appender

使用log4net的RichTextBoxAppender

有没有办法使用log4net以编程方式创建RichTextBoxAppender? 换句话说没有xml app.config?

log4net BufferingForwardingAppender性能问题

编辑2:我已经解决了问题(请参阅下面的答案)请注意,该问题可能会影响所有使用BufferingForwardingAppender修饰的appender以及从BufferingAppenderSkeletoninheritance的所有appender(分别为:AdoNetAppender,RemotingAppender,SmtpAppender和SmtpPickupDirAppender)* 我正在做一些非常基本的log4net工作台,我试图用BufferingForwardingAppender修饰RollingFileAppender。 我通过BufferingForwardingAppender而不是直接通过RollingFileAppender遇到了糟糕的性能,我真的没有理由。 这是我的配置: 这是基准(非常简单的代码): var stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < 100000; i++) { Log.Debug("Hello"); } stopWatch.Stop(); Console.WriteLine("Done in {0} ms", stopWatch.ElapsedMilliseconds); 直接通过RollingFileAppender输出的是: 完成时间为511毫秒 而通过BufferingForwardingAppender装饰RollingFileAppender: 签订于14261毫秒 这大约慢了30倍。 我认为通过在将它们写入文件之前缓冲一定量的日志来获得一些速度,但是由于某种原因它会使事情变得更糟。 在我看来配置是好的,所以这真的很奇怪。 有人知道吗? 谢谢! 编辑1: 通过包装/装饰FileAppender甚至是ConsoleAppender,行为是完全相同的(在log4net官方配置示例中仍然有一个基本的BufferingForwardingAppender包装/装饰ConsoleAppender的例子..并没有具体提到处理性能)。 经过一些调查/分析后,我可以看到大部分时间都在BufferingForwardingAppender中被破坏,更具体地说是在调用WindowsIdentity.GetCurrent()…被调用时我们调用Log.Debug() 。在上一个样本中(上面的示例源中100K次)。 已知对此方法的调用非常昂贵,应该避免或最小化,我真的不明白为什么它会被调用每个日志事件。 我真的完全错误地配置了某些东西/没有看到明显的东西,或者某种错误是某种错误,这就是我现在想要解决的问题…… 部分调用堆栈是: AppenderSkeleton.DoAppend BufferingAppenderSkeleton.Append LoggingEvent.FixVolatileData LoggingEvent.get_UserName() 调用get_LocationInformation()也在FixVolatileData中完成,也会导致高性能(每次捕获堆栈跟踪)。 我现在试图理解为什么这个极其昂贵的FixVolatileData调用(至少对于修复问题)在这个上下文中发生的每个日志事件,而直接通过包装的appender(直接通过ConsoleAppender / FileAppender ..)不会执行这种操作。 即将到来的更新,除非有人得到了所有这些的答案;) […]

在Log4Net消息到达appender之前编辑它们

我有一个安全工具,通过电子邮件向用户发送新密码。 当阈值为VERBOSE时,生产电子邮件模块(我不拥有并且不想更改)将使用Log4Net记录整个html电子邮件消息正文。 由于电子邮件包含明文的域用户密码,因此我希望在日志消息到达appender之前从中删除密码。 有没有办法让我临时插入一个对象到Log4Net堆栈,这将允许我搜索LoggingEvent消息并更改它以掩盖我找到的任何密码? 我想插入对象,调用电子邮件模块,然后删除该对象。