首页 > 编程语言 >C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证

C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证

时间:2024-06-03 16:33:47浏览次数:14  
标签:log4net name C# System 动态创建 Logers using appender

C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证

 

参考了:https://www.cnblogs.com/-dawn/p/8598566.html

 

GetLog4netInstance:

using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Filter;
using log4net.Layout;
using log4net.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Text;

namespace ConsoleApp1
{
    public class GetLog4netInstance
    {

        private static Dictionary<string, ILog> Logers = new Dictionary<string, ILog>();

        /// <summary>
        /// 获取log实例
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static ILog GetLogger(string name)
        {
            if (Logers.ContainsKey(name))
                return Logers[name];
            else
            {
                lock (Logers)
                {
                    if (Logers.ContainsKey(name)) 
                        return Logers[name];
                    else
                    {
                        var newLoger = CreateLogerInstance(name);
                        Logers.Add(name, newLoger);
                        return newLoger;
                    }
                }
            }
        }

        /// <summary>
        /// 创建Log实例
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private static ILog CreateLogerInstance(string name)
        {
            // Pattern Layout
            //%d 时间,[%t] 线程ID,%-2.18M 方法名(最少2位,最多18位),%m%n 消息和换行
            string PatternStr = "%d [%t] %-2.18M - %m%n";            
            PatternLayout layout = new PatternLayout(PatternStr);

            // Level Filter
            LevelMatchFilter filter = new LevelMatchFilter();
            filter.LevelToMatch = Level.All;
            filter.ActivateOptions();
            // File Appender
            RollingFileAppender appender = new RollingFileAppender();
            // 目录
            //appender.File = $"logs\\{name}\\"; //按名称单独一个目录
            appender.File = "logs\\"; // 所有名称放同一目录

            // 立即写入磁盘
            appender.ImmediateFlush = true;
            // true:追加到文件;false:覆盖文件
            appender.AppendToFile = true;
            // 新的日期或者文件大小达到上限,新建一个文件
            appender.RollingStyle = RollingFileAppender.RollingMode.Composite;
            // 文件大小达到上限,新建文件时,文件编号放到文件后缀前面
            appender.PreserveLogFileNameExtension = true;
            // 时间模式
            //appender.DatePattern = "yyyyMMdd'.txt'"; // 日期.txt
            appender.DatePattern = "'" + name + "-'" + "yyyyMMdd'.txt'"; // 名称-日期.txt,"'名称-'yyyyMMdd'.txt'"
            // 最小锁定模型以允许多个进程可以写入同一个文件
            appender.LockingModel = new FileAppender.MinimalLock();
            appender.Name = name+"Appender";
            appender.AddFilter(filter);
            appender.Layout = layout;
            appender.ActivateOptions();
            // 文件大小上限
            appender.MaximumFileSize = "100MB";
            // 设置无限备份=-1 ,最大备份数为30
            appender.MaxSizeRollBackups = 999;
            appender.StaticLogFileName = false;
            //create instance
            string repositoryName = name+"Repository";
            ILoggerRepository repository = LoggerManager.CreateRepository(repositoryName);
            BasicConfigurator.Configure(repository, appender);
            //After the log instance initialization, we can get the instance from the LogManager by the special log instance name. Then you can start your logging trip.
            ILog logger = LogManager.GetLogger(repositoryName, name);
            return logger;
        }
    }

}

使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var AccountLoger = GetLog4netInstance.GetLogger("DD-子商户号");
                var BalanceLoger = GetLog4netInstance.GetLogger("A#.ZZ");

                int i = 0;
                while (i < 10)
                {
                    string msg = i + ":hello world。";
                    BalanceLoger.Debug(msg);
                    AccountLoger.Debug(msg);
                    i++;
                }                
            }
            catch (Exception ex)
            {
                Console.WriteLine("ex!"+ex.Message);
            }
            Console.WriteLine("结束!");
            Console.ReadKey();
        }
    }
}

 

效果:

END

标签:log4net,name,C#,System,动态创建,Logers,using,appender
From: https://www.cnblogs.com/runliuv/p/18229157

相关文章

  • ifconfig只显示特定行
    显示en0网卡所有信息,ifconfigen0 只显示IP,第5行字段信息ifconfigen0|awk'NR==5{print$0}'#NR==5,表示显示字段的第5行,第5行刚好为ip地址信息,print输出函数,$0表示打印整行,$1表示当前行的第一个字段,,$2表示当前行的第二个字段,后面以此类推 只显示mac地址......
  • C++实现线程池详解
    在现代软件开发中,高效地管理和利用计算资源是一项关键任务。线程池(ThreadPool)是一种非常有效的并发编程技术,它允许我们管理和重用一组线程,从而避免频繁创建和销毁线程带来的性能开销。1.线程池的基本概念线程池是一组预先创建的线程,这些线程等待并执行任务。当任务到达时,它......
  • 包含UPFC和风电场的分接输电线路差动保护方案(Matlab代码实现)
      ......
  • Pytorch根据论文手搓CoPE
    根据论文《ContextualPositionEncoding: LearningtoCountWhat’sImportant》编写的CoPE代码。具备多头计算能力,本人水平不高,个人代码未经验证,有问题和建议欢迎指出。CoPE代码为代替LlamaModel中的RoPE而设计,因此函数名称类似于LlamaModel的RoPE,但实际功能略有不同,有待商......
  • 电池电动汽车的健康状态 SOH 和充电状态 SOC 估计研究(Matlab代码实现)
     ......
  • Navicat 17 体验官火热招募中 | 优选好礼等您来
    体验官火热招募中......
  • Jetpack架构组件_LifeCycle组件
    1.LifeCycle组件     LifeCycle组件可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。       我们以百度定位为例,我们一般在Activity生命周期的onCreate回调函数里调用自定义类LocationService的Start()方法......
  • 政安晨【零基础玩转各类开源AI项目】:解析开源项目:Champ 利用三维参数指导制作可控且一
    目录论文题目Champ:利用三维参数指导制作可控且一致的人体图像动画安装创建conda环境:使用pip安装软件包推理1. 下载预训练模型2. 准备准备引导动作数据运行推理训练模型准备数据集运行训练脚本数据集政安晨的个人主页:政安晨欢迎 ......
  • Mac M1 使用 labelimg
    如果按照正常的流程下载完qypt5在终端中使用labelimg时会报这个错误下面直接讲使用方法首先进入labelimg的github网址下载网址:GitHub-HumanSignal/labelImg:LabelImgisnowpartoftheLabelStudiocommunity.ThepopularimageannotationtoolcreatedbyTzutal......
  • ../common/fdfs_global.h:17:26: fatal error: sf/sf_global.h: No such file or dire
    安装fastdfs之前需要安装一下libserverframe在解压后的fastdfs文件夹下的INSTALL里有说 打开链接:https://github.com/happyfish100/libserverframe/tags,选择一个合适的版本 [root@hqqfastdfs]#tar-zxvflibserverframe-1.2.3.tar.gz[root@hqqfastdfs]#cdlibserv......