【问题标题】:Does log4net provides Max Rate feature i.e. maximum speed allowed to write logs to the file?log4net 是否提供最大速率功能,即允许将日志写入文件的最大速度?
【发布时间】:2020-01-08 13:16:31
【问题描述】:

我有兴趣限制每秒的日志行数。我只需要限制每秒的日志行数,因为与可能生成可记录事件的子系统相比,记录子系统通常很慢。如果没有某种保护,攻击者可能会压倒审计服务器,或者让设备忙于发送重复的审计消息以致核心功能停止工作。

【问题讨论】:

  • 您希望如何处理超出 MaxRate 值的日志?您在 1 秒内收到 100 个条目,但您只允许 10 个。
  • 我只想限制每秒日志行数以保护我的应用程序崩溃。如果日志超过我们的最大速率,我想简单地删除该日志。有什么方法可以使用 log4net 让我知道。谢谢!
  • 在 log4net 中没有开箱即用的东西可以做到这一点。您最好的选择是实现您自己的 ForwardingAppender 从现有的继承:github.com/apache/logging-log4net/blob/master/src/Appender/… 之后,您可以指定自己的不同阈值和过滤器。
  • 好的..谢谢!
  • @Peska 再告诉我一件事。目前我在我们的应用程序中使用 RollingFileAppender。我需要一个单独的类或单独的 XML 标记来在配置文件中实现 ForwardingAppender。

标签: c# .net performance security log4net


【解决方案1】:

正如我在 cmets 中提到的,您可以编写自己的 ForwardingAppender。这是控制台应用程序中的一个示例:

程序.cs

using log4net;
using log4net.Config;
using log4net.Repository;
using System;
using System.IO;
using System.Reflection;
using System.Threading;

namespace MaxRateExample
{
    public static class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            ILoggerRepository logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

            for (int i = 0; i < 1000; i++)
            {
                Console.WriteLine($"item-{i}");
                log.Info($"item-{i}");

                Thread.Sleep(10);
            }
        }
    }
}

MaxRateForwardingAppender.cs

using log4net.Appender;
using log4net.Core;
using System;
using System.Collections.Generic;

namespace MaxRateExample
{
    public class MaxRateForwardingAppender : ForwardingAppender
    {
        // Maximum 10 events per second. You can move this to config file.
        private const int MaxRateSeconds = 1;
        private const int MaxRateEvents = 10;

        private List<DateTime> Dates { get; }

        public MaxRateForwardingAppender()
        {
            Dates = new List<DateTime>();
        }

        protected override void Append(LoggingEvent loggingEvent)
        {
            if (LogEvent())
                base.Append(loggingEvent);
        }

        protected override void Append(LoggingEvent[] loggingEvents)
        {
            if (LogEvent())
                base.Append(loggingEvents);
        }

        private bool LogEvent()
        {
            Dates.RemoveAll(x => (DateTime.Now - x).Seconds > MaxRateSeconds);

            if (Dates.Count <= MaxRateEvents)
            {
                Dates.Add(DateTime.Now);
                return true;
            }

            return false;
        }
    }
}

log4net.config

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\Logs\MyLog.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="'.'yyyyMMdd'.log'" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %message%newline" />
      </layout>
    </appender>
    <appender name="MaxRateForwardingAppender" type="MaxRateExample.MaxRateForwardingAppender, MaxRateExample">
      <appender-ref ref="RollingFileAppender" />
    </appender>
    <root>
      <appender-ref ref="MaxRateForwardingAppender" />
    </root>
  </log4net>

日志文件的示例输出:

2020-01-09 15:50:05,396 INFO  item-0
2020-01-09 15:50:05,419 INFO  item-1
2020-01-09 15:50:05,430 INFO  item-2
2020-01-09 15:50:05,441 INFO  item-3
2020-01-09 15:50:05,452 INFO  item-4
2020-01-09 15:50:05,463 INFO  item-5
2020-01-09 15:50:05,474 INFO  item-6
2020-01-09 15:50:05,485 INFO  item-7
2020-01-09 15:50:05,496 INFO  item-8
2020-01-09 15:50:05,507 INFO  item-9
2020-01-09 15:50:05,518 INFO  item-10
2020-01-09 15:50:07,403 INFO  item-183
2020-01-09 15:50:07,425 INFO  item-185
2020-01-09 15:50:07,436 INFO  item-186
2020-01-09 15:50:07,447 INFO  item-187
2020-01-09 15:50:07,458 INFO  item-188
2020-01-09 15:50:07,469 INFO  item-189
2020-01-09 15:50:07,480 INFO  item-190
2020-01-09 15:50:07,491 INFO  item-191
2020-01-09 15:50:07,502 INFO  item-192
2020-01-09 15:50:07,513 INFO  item-193
2020-01-09 15:50:07,538 INFO  item-194
2020-01-09 15:50:09,406 INFO  item-366
2020-01-09 15:50:09,427 INFO  item-368
2020-01-09 15:50:09,438 INFO  item-369
2020-01-09 15:50:09,449 INFO  item-370
2020-01-09 15:50:09,460 INFO  item-371
2020-01-09 15:50:09,472 INFO  item-372

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2021-07-02
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多