首页 > 其他分享 >Log4netHelper, 支持自定义日志文件生成间隔

Log4netHelper, 支持自定义日志文件生成间隔

时间:2023-08-08 16:23:58浏览次数:42  
标签:log4net direction 自定义 rollingFileAppender Log4netHelper static time using 日志

using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static log4net.Appender.FileAppender;

namespace AJR.Acquisition.Platform.Core.Helpers;

/// <summary>
/// Log4net帮助类
/// </summary>
public static class Log4Helper
{
    static object lockObj = new object();
    const string _defaultPath = @"logs\";
    const string _defaultLogName = "log4Default";
    static log4net.Filter.LevelRangeFilter levRangeFilter = new log4net.Filter.LevelRangeFilter();
    static log4net.Layout.PatternLayout logLayout = new log4net.Layout.PatternLayout("%date [线程:%thread] %logger %newline %-5level [%class.%method 行%L]:%newline %message%newline%newline");

    static ConcurrentDictionary<string, ILoggerRepository> repositoryList = new ConcurrentDictionary<string, ILoggerRepository>();
    static Log4Helper()
    {
        levRangeFilter.LevelMax = log4net.Core.Level.Fatal;
        levRangeFilter.LevelMin = log4net.Core.Level.Debug;
        levRangeFilter.ActivateOptions();
        initRepository();
    }
    static void repositoryCreateByDirection(string direction)
    {
        lock (lockObj)
        {
            if (repositoryList.ContainsKey(direction))
            {
                return;
            }
            var repository = LogManager.CreateRepository(direction);
            BasicConfigurator.Configure(repository, AppenderCreator(direction));
            repositoryList.AddOrUpdate(direction, repository, (k, v) => repository);
        }
    }
    static void initRepository()
    {
        repositoryCreateByDirection(_defaultLogName);
    }
    static RollingOverThirtyMinutesFileAppender AppenderCreator(string logerDirection)
    {
        RollingOverThirtyMinutesFileAppender rollingFileAppender = new RollingOverThirtyMinutesFileAppender();
        rollingFileAppender.Name = logerDirection;
        rollingFileAppender.File = Path.Combine(_defaultPath, logerDirection, "log");
        rollingFileAppender.Encoding = System.Text.Encoding.UTF8;
        rollingFileAppender.AppendToFile = true;
        rollingFileAppender.RollingStyle = RollingFileAppender.RollingMode.Composite;
        rollingFileAppender.DatePattern = "\"_\"yyyyMMddHHmm\".log\"";
        rollingFileAppender.MaxSizeRollBackups = 1000;
        rollingFileAppender.MaximumFileSize = "15MB";
        rollingFileAppender.AddFilter(levRangeFilter);
        rollingFileAppender.LockingModel = new MinimalLock();
        rollingFileAppender.Layout = logLayout;
        rollingFileAppender.ActivateOptions();
        return rollingFileAppender;
    }
    public static ILog log
    {
        get
        {
            if (!repositoryList.ContainsKey(_defaultLogName))
            {
                initRepository();
            }
            return LogManager.GetLogger(repositoryList[_defaultLogName].Name, _defaultPath);
        }
    }

    /// <summary>
    /// 允许将日志文件输出到自定义的路径里; D 为 direction 缩写<br/>
    /// 路径为日志根目录的相对目录, 不要用完整路径;<br/>
    /// 不要用日期或时间创建路径, 以免文件自动删除配置不起效<br/>
    /// </summary>
    /// <param name="direction"></param>
    /// <returns></returns>
    public static ILog D(string direction)
    {
        if (repositoryList.ContainsKey(direction))
        {
            return LogManager.GetLogger(repositoryList[direction].Name, direction);
        }
        repositoryCreateByDirection(direction);
        return LogManager.GetLogger(repositoryList[direction].Name, direction);
    }
    /// <summary>
    /// 授权日志
    /// </summary>
    public static ILog AuthorizeDirection
    {
        get
        {
            return D("Authorize");
        }
    }
}

/// <summary>
/// 每隔30分钟创建一个日志文件
/// </summary>
internal class RollingOverThirtyMinutesFileAppender : RollingFileAppender
{
    // 间隔时间
    const int _intervalMinutes = 30;
    private DateTime nextThirtyMinutes;
    public RollingOverThirtyMinutesFileAppender()
    {
        CalcNextThirtyMinutes(DateTime.Now);
    }
    /// <summary>
    /// 计算下一个三十分钟
    /// </summary>
    /// <param name="time"></param>
    private void CalcNextThirtyMinutes(DateTime time)
    {
        time = time.AddMilliseconds((double)-time.Millisecond);
        time = time.AddSeconds((double)-time.Second);
        int interNumber = time.Minute / _intervalMinutes;
        nextThirtyMinutes = time.AddMinutes((double)-(time.Minute - _intervalMinutes)).AddMinutes(_intervalMinutes * interNumber);
    }
    protected override void AdjustFileBeforeAppend()
    {
        DateTime now = DateTime.Now;

        if (now >= nextThirtyMinutes)
        {
            CalcNextThirtyMinutes(now);
            base.AdjustFileBeforeAppend();
        }
    }
}

  

标签:log4net,direction,自定义,rollingFileAppender,Log4netHelper,static,time,using,日志
From: https://www.cnblogs.com/cchong005/p/17614675.html

相关文章

  • 自定义类加载器
    自定义类加载器只需要继承java.lang.ClassLoader类,该类有两个核心方法,一个是loadClass(String,boolean),实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义类加载器主要是重写findClass方法。publicclassMyClassLoaderTest{staticclassTest......
  • 在langchain中使用自定义example selector
    简介在之前的文章中,我们提到了可以在跟大模型交互的时候,给大模型提供一些具体的例子内容,方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。如果例子内容少的话,其实无所谓,我们可以把所有的例子都发送给大语言模型进行处理。但是如......
  • 在langchain中使用自定义example selector
    简介在之前的文章中,我们提到了可以在跟大模型交互的时候,给大模型提供一些具体的例子内容,方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。如果例子内容少的话,其实无所谓,我们可以把所有的例子都发送给大语言模型进行处理。但是如......
  • 自定义类给窗体的控件赋值
    前面我们有说到 多线程给窗体的控件赋值 详见遇到问题-UI界面无响应,多线程解决UI界面无响应问题现在有一种新的情况,我想在另一个类中给窗体的控件赋值(这在记录程序执行进度的时候常用到),我们仍可以用委托 首先在自定义类的外面 声明一个委托模块 publicdelegate......
  • python监控强势票日志
    c:\python38\python.exeF:/GZH/demo/量化/easyquant/utils/ts/A实时监控近10天最强票+昨日涨停票.pyglobal_config_path:c:\python38\lib\site-packages\easytrader/config/global.json++++++++++++++++(近10日最强+昨日涨停票)+++++++++++++++++++++++++++++++:selectdist......
  • 云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)
    什么是OpenTelemetry?OpenTelemetry是一个开源的可观测性框架,由云原生基金会(CNCF)托管。它是OpenCensus和OpenTracing项目的合并。旨在为所有类型的可观测信号(如跟踪、指标和日志)提供单一标准。https://opentelemetry.iohttps://www.cncf.iohttps://opencensus.io......
  • Django 之日志配置
    Django之日志配置日志作为服务的,排查故障分析性能及问题的重要“帮手”,是服务必不可少的。 配置日志定义日志记录器定义了三个日志记录器,分别针对Django、自定义应用程序和自定义库。每个日志记录器都有不同的日志级别和处理器,例如控制台和文件处理器。Django日志记......
  • 基于Qt编写超精美自定义控件
    一、前言无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一些设置和处理,随着项目数量的增多,有些控件又专门提取出来共性,做成了通用的自定义控......
  • You are using the runtime-only build of Vue where the template compiler is not a
    使用vue-cli搭建的项目,页面自定义带template内容的组件无法渲染,控制台报错,页面不展示组件内容,代码如下:<template><divclass="hello">my-component:<my-component></my-component></div></template><script>importVuefrom"vue"......
  • 【JVM技术指南】「GC内存诊断-故障问题排查」一文教你如何打印及分析JVM的GC日志(实战
    当我们在开发Java应用程序时,JVM的GC(垃圾回收)是一个非常重要的话题。GC的作用是回收不再使用的内存,以便程序可以继续运行。在JVM中,GC的日志记录了GC的详细信息,包括GC的类型、时间、内存使用情况等。在本文中,我们将介绍JVMGC日志的格式、含义和分析方法。JVMGC日志格式JVMGC日志的......