zoukankan      html  css  js  c++  java
  • log4net通过代码控制按分类输出

    应用场景:

    比如我们系统有5个任务,每个任务都是独立的流程,按照传统的方式这些流程的数据会输出到一起,这无疑给我们排查问题增加了难度,因为我们需要的是每一个任务一个独立的输出文件,比如任务A输出到log/a/log.log,任务B输出到log/b/log.log。

    上面提到了场景,下面说几个log4net的概念

    Repository:存储库,表示一个日志记录全局对象,我们可以理解为平时使用的一个xml配置文件映射出来就是一个存储库

    Logger:日志记录器,一个存储库下面有多个日志记录器,日志记录器可以通过名称来区分。

    Appender:输出源,一个日志记录器可以有多个输出源(如:文件、控制台等)

    下面说一下具体思路:我们如果要按照不同任务输出不同路径,理论上定义一个全局的Repository,然后里面根据不同任务定义不同的Logger,每个Logger下定义一个或多个Appender即可。但是我查看了代码,没有找到如何在Repository中定义多个Logger。因此我这边就使用了变通的办法,每一个任务定义一个Repository。

    LogHelper代码如下:

    public class LogHelper
    {
        private static object lockObj = new object();
        private static Dictionary<string, ILog> diction = new Dictionary<string, ILog>();
    
        public static ILog GetLog(string logName)
        {
            if (!diction.ContainsKey(logName))
            {
                lock (lockObj)
                {
                    if (!diction.ContainsKey(logName))
                    {
                        var repositoryName = "rep" + logName;
                        var repository = LogManager.CreateRepository(repositoryName);
                        repository.ResetConfiguration();
    
                        //根据名称生成ILog对象
                        RollingFileAppender append = new RollingFileAppender();
                        append.Name = logName;
                        append.File = "logs/" + logName + "/log.log";
                        append.AppendToFile = true;
                        append.MaxSizeRollBackups = 100;
                        append.MaximumFileSize = "5MB";
                        append.StaticLogFileName = false;
                        append.LockingModel = new FileAppender.MinimalLock();
                        append.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;
                        string pattern = "记录时间:%date%n线程ID:[%thread] %n日志级别:%-5level%n记录位置:%location%n异常:%exception%n消息:%message%newline%n------------------------------------------%n";
                        PatternLayout layout = new PatternLayout(pattern);
                        append.Layout = layout;
                        append.ActivateOptions();
                        log4net.Config.BasicConfigurator.Configure(repository, append);
    
                        diction.Add(logName, LogManager.GetLogger(repositoryName, logName));
                    }
    
                }
            }
            return diction[logName];
        }
    }

    使用方法:

    LogHelper.GetLog("IIM").DebugFormat("请求的路径是:{0}",path);

    说明:
    1. append.ActivateOptions();是让当前这个appender激活,否则是不能生效的。
    2. log4net.Config.BasicConfigurator.Configure(repository, append);是将append配置到repository里面

  • 相关阅读:
    基于Linux C的socketEthereal程序和Package分析 (一个)
    [Firebase + PWA] Keynote: Progressive Web Apps on Firebase
    [Redux] Navigating with React Router <Link>
    [Redux] Adding React Router to the Project
    [Redux] Refactoring the Entry Point
    [Redux] Persisting the State to the Local Storage
    [Redux] Supplying the Initial State
    [PWA] Caching with Progressive libraries
    [TypeScript] Understanding Generics with RxJS
    [React + Mobx] Mobx and React intro: syncing the UI with the app state using observable and observer
  • 原文地址:https://www.cnblogs.com/duanjt/p/11103887.html
Copyright © 2011-2022 走看看