首页 > 其他分享 >log4net 日期和文件大小滚动Composite模式 删除自定义几天前的日志

log4net 日期和文件大小滚动Composite模式 删除自定义几天前的日志

时间:2022-09-29 15:33:52浏览次数:90  
标签:log4net 文件大小 string 自定义 System using 日志

  • 官方配置信息

Apache log4net – Apache log4net: Config Examples - Apache log4net

  • 官方示例实现RollingFileAppender

logging-log4net/DerivedAppender.cs at 3f2b32ca3259f0099358107dfcb032d15a56cdb8 · apache/logging-log4net (github.com)

  • Stack Overflow

c# - How I can set log4net to log my files into different folders each day? - Stack Overflow

  • 1、上log4net.conf 配置信息
<?xml version="1.0" encoding="utf-8" ?>
<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <root>
        <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
        <level value="ALL" />
        <appender-ref ref="ErrorRollingFileAppender" />
        <appender-ref ref="WarnRollingFileAppender" />
        <appender-ref ref="InfoRollingFileAppender" />
        <appender-ref ref="DebugRollingFileAppender" />
    </root>

    <!--一般错误日志定义,用于记录已知需处理的与未捕获的异常-->
    <!--日志输出格式:[时间]:类名 线程号 消息-->
    <appender name="ErrorRollingFileAppender" type="System.MyRollingFileAppender">
        <!--  自定义删除几天前的日志 -->
        <param name= "MyOutDateDays" value= "30"/>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>

        <filter type="log4net.Filter.DenyAllFilter" />
        <file value="logs/" />
        <rollingStyle value="Composite" />
        <!--保留文件的数量-->
        <maxSizeRollBackups value="20" />
        <!--保留文件的大小  可用的单位:KB|MB|GB-->
        <maximumFileSize value="300MB" />
        <datePattern value="yyyy-MM-dd/&quot;Error.log&quot;" />
        <staticLogFileName value="false" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="【%d{HH:mm:ss.fff}】  %c T%t %n%m%n" />
        </layout>
    </appender>

    <!--警告日志定义,用于记录已知不需处理的异常,系统警告信息-->
    <!--日志输出格式:[时间]:类名 线程号 消息-->
    <appender name="WarnRollingFileAppender" type="System.MyRollingFileAppender">
        <!--  自定义删除几天前的日志 -->
        <param name= "MyOutDateDays" value= "30"/>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="WARN" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
        <file value="logs/" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <!--保留文件的数量-->
        <maxSizeRollBackups value="20" />
        <!--保留文件的大小  可用的单位:KB|MB|GB-->
        <maximumFileSize value="300MB" />
        <datePattern value="yyyy-MM-dd/&quot;Warn.log&quot;" />
        <staticLogFileName value="false" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="[%d{HH:mm:ss.fff}] %c T%t %m%n" />
        </layout>
    </appender>

    <!--信息日志定义,用于记录用户相关信息-->
    <!--日志输出格式:[时间]:消息-->
    <appender name="InfoRollingFileAppender" type="System.MyRollingFileAppender">
        <!--  自定义删除几天前的日志 -->
        <param name= "MyOutDateDays" value= "30"/>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="INFO" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
        <file value="logs/" />
        <appendToFile value="true" />
        <!--保留文件的数量-->
        <maxSizeRollBackups value="20" />
        <!--保留文件的大小  可用的单位:KB|MB|GB-->
        <maximumFileSize value="300MB" />
        <rollingStyle value="Composite" />
        <datePattern value="yyyy-MM-dd/&quot;Info.log&quot;" />
        <staticLogFileName value="false" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="[%d{HH:mm:ss}] (%c) %m%n" />
        </layout>
    </appender>

    <!--信息日志定义,用于收集开发调试信息-->
    <!--日志输出格式:[时间]:类名 线程号 消息-->
    <appender name="DebugRollingFileAppender" type="System.MyRollingFileAppender">
        <!--  自定义删除几天前的日志 -->
        <param name= "MyOutDateDays" value= "30"/>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="DEBUG" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
        <file value="logs/" />
        <appendToFile value="true" />
        <!--保留文件的数量-->
        <maxSizeRollBackups value="20" />
        <!--保留文件的大小  可用的单位:KB|MB|GB-->
        <maximumFileSize value="300MB" />
        <rollingStyle value="Composite" />
        <datePattern value="yyyy-MM-dd/&quot;Debug.log&quot;" />
        <staticLogFileName value="false" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="[%d{HH:mm:ss.fff}] %c T%t: %m%n" />
        </layout>
    </appender>
</log4net>

2、自定义RollingFileAppender

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace System
{
    public class MyRollingFileAppender : log4net.Appender.RollingFileAppender
    {
        /// <summary>
        /// 自动删除N天之前的日志 须大于0
        ///例如日志处于D:\bin\Debug\Logs\2022-09-28\20220928_Error.log  -> D:\bin\Debug\Logs\下文件夹  大于天数的日志文件夹会被删除
        /// </summary>
        public int MyOutDateDays { get; set; }

        protected override void OpenFile(string fileName, bool append)
        {

            base.OpenFile(fileName, append);
        }
        /// <summary>
        /// 自定义自己的操作
        /// </summary>
        public override void ActivateOptions()
        {
            base.ActivateOptions();
            //自定义删除操作
            DeleteLogFilesForOutDate();
        }

        private void DeleteLogFilesForOutDate()
        {
            try
            {
                string pBasepath = System.IO.Path.GetDirectoryName(File);
                //获取目录
                string strBasepath = Path.GetDirectoryName(pBasepath);
                foreach (string dirs in Directory.GetDirectories(strBasepath))
                {
                    DeleteDirtorys(dirs);
                }
            }
            catch (Exception ex)
            {

            }

        }

        private void DeleteDirtorys(string dir)
        {
            try
            {
                string datetimename = Path.GetFileNameWithoutExtension(dir);
                if (DateTime.TryParse(datetimename, out var dirWithSuccessTime) == false)
                {
                    //不是日期开始文件夹结束
                    return;

                }

                //当前的减去文件夹的名称时间天数
                if ((DateTime.Now - dirWithSuccessTime).TotalDays > MyOutDateDays && MyOutDateDays > 0)
                {
                    try
                    {
                        //强制删除文件夹
                        Directory.Delete(dir, true);
                    }
                    catch (Exception ex)
                    {
                    }

                }
            }
            catch (Exception ex)
            {
            }

        }
    }
}

 

  •  3、效果明细,自定义RollingFileAppender类读取和新增文件时,自动检查上两级下的目录是否为日期类型,检查日期名称距离今天是否大于配置的天数,删除目录下日志

 

标签:log4net,文件大小,string,自定义,System,using,日志
From: https://www.cnblogs.com/JohnnyLui/p/16741769.html

相关文章

  • Springboot自定义工具类中调用mapper或者service接口方式
    1、该类使用@Component注解2、添加一个本类类型的静态字段3、创建一个初始化方法,贴上@PostConstruct标签,用于注入bean4、创建方法调用mapper或service接口5、最后直接......
  • wangEditor增加自定义工具栏暨百度编辑器上传WORD文档并保留源格式自动填充到编辑框
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘......
  • Django当中自定义的用户模型类(继承django中的AUTH模型类)
    Django认证系统中提供的用户模型类及方法很方便,我们可以使用这个模型类,但是字段有些无法满足项目需求,因此需要自己再自定义字段。Django提供了django.contrib.auth.models.......
  • Log4net配置与使用
    Log4net的优点:几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系......
  • SpringBoot系列——加载自定义配置文件
    Java开发过程中,一些配置信息不想写到application.properties里面去,想自己弄一个配置文件,然后加载。例子如下:Employee.java类核心代码:@Configuration//用来标注一个自定......
  • 【Java基础】自定义异常类
    1.自定义异常类(1)继承现有异常类:比如RuntimeException、Exception。(2)提供全局常量:serialVersionUID。(3)提供重载构造器。publicclassValueExceptionextendsException......
  • Go基础编程:自定义函数
    定义格式函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。Go语言函数定义格式如下:funcFuncName(/*参......
  • element的el-table表格自定义表头解决数据不更新问题
    解决方法element官网上el-table上使用插槽slot=“header”来实现自定义表头,在表头中使用el-select组件选择不同的状态,无法展示选择后的状态,或者其他需要动态更新表头数......
  • 自定义toString()方法检测对象类型时的返回值[object x](JS)
    如果想通过 Object.prototype.toString()方法来检测对象类型,则需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用toString()方法。......
  • Vue3.0 如何写自定义指令
    背景问:什么是指令?答:指令就是DOM与逻辑行为的媒介,本质就是DOM绑定的独立逻辑行为函数。除了核心功能默认内置的指令(例如v-model和v-show),Vue也允许注册自定义指令。Vu......