首页 > 其他分享 >动态创建log4net 实例

动态创建log4net 实例

时间:2023-10-19 11:57:58浏览次数:104  
标签:log4net name 动态创建 Logers instance 实例 appender log

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

 

根据业务类型,动态的创建日志实例,将日志写到不同目录。常见的配置文件中统一配置,不能满足需求。
  • 引用log4net

nuget安装命令: Install-Package log4net -Version 2.0.8

  • 日志实例创建类

我这里log实例的相关参数都是直接写死的,你可以根据需要读取配置文件。参数都配有备注,更多参数的含义,网上都可以搜到。

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
            PatternLayout layout = new PatternLayout("%date{yyyy-MM-dd HH:mm:ss} %-5level[%L] %message% %F%newline");
            // Level Filter
            LevelMatchFilter filter = new LevelMatchFilter();
            filter.LevelToMatch = Level.All;
            filter.ActivateOptions();
            // File Appender
            RollingFileAppender appender = new RollingFileAppender();
            // 目录
            appender.File = $"logs\\{name}\\";
            // 立即写入磁盘
            appender.ImmediateFlush = true;
            // true:追加到文件;false:覆盖文件
            appender.AppendToFile = true;
            // 新的日期或者文件大小达到上限,新建一个文件
            appender.RollingStyle = RollingFileAppender.RollingMode.Composite;
            // 文件大小达到上限,新建文件时,文件编号放到文件后缀前面
            appender.PreserveLogFileNameExtension = true;
            // 时间模式
            appender.DatePattern = $"yyyyMMdd'.txt'";
            // 最小锁定模型以允许多个进程可以写入同一个文件
            appender.LockingModel = new FileAppender.MinimalLock();
            appender.Name = $"{name}Appender";
            appender.AddFilter(filter);
            appender.Layout = layout;
            appender.ActivateOptions();
            // 文件大小上限
            appender.MaximumFileSize = "200MB";
            // 设置无限备份=-1 ,最大备份数为30
            appender.MaxSizeRollBackups = 30;
            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;
        }
    }
  • 调用实例。

创建实例的时候,相关参数直接写死了,所以不需要写配置文件。引用log4net以后,直接调用即可。

static void Main(string[] args)
        {

            var AccountLoger = GetLog4netInstance.GetLogger("Account");
            var BalanceLoger = GetLog4netInstance.GetLogger("Balance");

            int i = 0;
            while (i < 500)
            {
                BalanceLoger.Debug(i);
                AccountLoger.Debug(i);
                i++;
            }

            Console.WriteLine("结束!");
            Console.ReadKey();

        }
C# 复制 全屏

参考:
["How to programmatically create log instance by Log4Net library"][1]
[1]: https://blogs.perficient.com/delivery/blog/2016/04/20/how-to-programmatically-create-log-instance-by-log4net-library/ "How to programmatically create log instance by Log4Net library"

标签:log4net,name,动态创建,Logers,instance,实例,appender,log
From: https://www.cnblogs.com/chinasoft/p/17774385.html

相关文章

  • Ajax前后端交互实例
    什么是前后端联调?在我们开发的过程中,发送请求的ajax数据都不是后端返回的真数据,而是我们自己通过接口mock模拟的假数据,当前端的代码编写完成后,后端的接口也写好后,我们就需要把mock数据换点,尝试使用后端提供的数据,进行一个前后端的调试,我们会把这个过程叫做前后端接口联调。  ......
  • 多个程序使用同一个 log4net 配置
    多个程序使用同一个log4net配置,AssemblyInfo.cs文件加上:[assembly:log4net.Config.XmlConfigurator(ConfigFile="log4net.config",ConfigFileExtension="config",Watch=true)]初始化log4net:log4net.GlobalContext.Properties["program"]="......
  • springbatch 实例
    packagecom.jeesite.modules.sdbatch.service;importcom.jeesite.common.idgen.IdGen;importcom.jeesite.modules.medrec.service.MedRecMainService;importcom.jeesite.modules.sdcommon.DateUtils;importcom.jeesite.modules.sdform.service.SdCourseService;imp......
  • Java(Spring) 通过反射classforName获取对象实例导致@Autowired注入失效
    使用策略模式多态获取具体的策略问题描述:classforName在代码中使用反射获取对象实例后,对象实例中通过@Autowrite注解注入的属性值为null(注入失败),导致带反射获取的对象实例调用方法时出现空指针等情况。问题原因:通过反射获取对象实例相当于“new”了一个对象,所以这个对象并没有被......
  • 优维产品使用最佳实践:实例拓扑
    背景实例拓扑可以帮助我们直观地了解整个系统的架构和组成情况,该拓扑图是通过已有的实例的关联关系自动生成,当实例数据和关系变化时拓扑图也能实时更新,我们可以快速直观的查看当前实例下所有资源的之间的网状关系和资源数量。实例拓扑支持以下功能:过滤实例,可以只看符合的规则的实......
  • Java大文件上传详解及实例代码
    前言:上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120。但还是不行,有时候10分钟就崩了。同事说,可能是客户这里服......
  • Python 练习实例22
    题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。程序源代码:实例#!/usr/bin/python#-*-coding:UTF-8-*-foriinrange(ord('x'),ord('z')+1):......
  • Python 练习实例23
    题目:打印出如下图案(菱形):*************************程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。程序源代码:实例#!/usr/bin/python#-*-coding:UTF-8-*-fromsysimportstdoutforiinrange(4)......
  • Python 练习实例21
    题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。程序分析:采取逆向思维的方法,从后往前推断。程......
  • 锐捷交换机MSTP(多实例生成树协议)配置
    一、组网需求内网有4个vlan,vlan10和20的生成树根桥在核心交换机A上,vlan30,40的vlan根桥在核心交换机B上。 二、组网拓扑:   三、配置要点:开启生成树功能创建不同的实例为实例配置优先级 四、配置步骤:注意:配置之前建议使用Ruijie#showinterfacestatus查看接口......