• log4net 动态创建文件名


    通常使用log4net,都是用xml配置,然后代码调用ilog来记录日志。但这就有一个限制,日志名必须在xml里设定好,如果想动态创建日志文件名是不行的。

    原始方式如下:

    配置xml:

    <?xml version="1.0" encoding="utf-8" ?> 
    	<log4net>
    		<appender name="BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
    			<bufferSize value="100" />
    			<lossy value="false" />
    			<appender-ref ref="InfoLog" />
    		</appender>
    		<appender name="InfoLog" type="log4net.Appender.RollingFileAppender"> 
    		
    			<file value="Log/"/>
    			
    		
    			<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    			<Encoding value="UTF-8" />
    		
    			<maxSizeRollBackups value="-1" /> 
    			<rollingStyle value="Composite" />
    	<appendToFile value="true" />
    			<!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]此处按日期产生文件夹,文件名固定。注意" 的位置-->
    			<datePattern value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />
    			<!--这是按日期产生文件夹,并在文件名前也加上日期-->
    			<!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log""  />-->
    			<!--这是先按日期产生文件夹,再形成下一级固定的文件夹-->
    			<!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log""  />-->
    
    			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。-->
    			<!--可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
    			<maximumFileSize value="1000KB" />
    			<preserveLogFileNameExtension value="true"/>
    			<!--计数类型为1,2,3… 启用后会在日志文件后追加计数,如:2020-06-24.txt1-->
    			<CountDirection value="1" />
    
    		 
    			<!--过滤设置,LevelRangeFilter为使用的过滤器。 -->
    			<filter type="log4net.Filter.LevelRangeFilter">
    				<levelMin value="DEBUG" />
    				<levelMax value="WARN" />
    			</filter>
    			<!--布局(向用户显示最后经过格式化的输出信息)-->
    			<layout type="log4net.Layout.PatternLayout">
    				<conversionPattern value="%date | 线程:%thread | 日志级别:%-5level | %logger%newline-------------------------------------------%newline%message%newline-------------------------------------------%newline%newline" />
    			</layout>
    		</appender>
     
    			<!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
    			<!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
    
    	<!-- Set root logger level to DEBUG and its only appender to A1 -->
    	<root>
    		<level value="DEBUG" />
    		<appender-ref ref="BufferingForwarder" />
    	</root>
    	<logger name="dd">
    		<level value="all" />
    		<appender-ref ref="InfoLog"/>
    	</logger>
    </log4net>
    

       调用方式如下:

      ILog log = LogManager.GetLogger("dd");
                log.Info("123");
    

    这种方式,配置是固定的,只能生成一种类型【文件名】的日志文件。如想生成不同的文件,需要不断加配置,不好维护。因此 if you want dynamic create log4net file name you can do follow:

    use log4net  config in code :

      

     public class Log4NetWrapper
        {
    
            /// <summary>
            /// 公共方法,记录日志到固定的文件名
            /// </summary>
            /// <param name="logFileName">日志要保存的文件名</param>
            /// <param name="logInfo">日志信息</param>
            public static void WriteToOutput(string logFileName, string logInfo)
            {
                if (_ilogDict == null || !_ilogDict.ContainsKey(logFileName))
                {
                    InitOutput(logFileName);
                }
    
                _ilogDict[logFileName].Info(dataStr);
            }
    
            /// <summary>
            /// 日志对象的字典。key=日志文件名,value=ilog日志对象
            /// </summary>
            static Dictionary<string, log4net.ILog> _ilogDict;
    
    
            /// <summary>
            /// 初始化日志对象
            /// </summary>
            /// <param name="logFileName">日志文件名,日志对象</param>
            private static void InitOutput(string logFileName)
            {
                if (_ilogDict == null)
                {
                    _ilogDict = new Dictionary<string, log4net.ILog>();
                }
    
                
                try
                {
                    if (!_ilogDict.ContainsKey(logFileName))
                    {
                        //创建日志目录
                        log4net.LogManager.CreateRepository(logFileName);
                        //获取日志对象
                        log4net.ILog logger = log4net.LogManager.GetLogger(logFileName, logFileName);
    
                        _ilogDict.Add(logFileName, logger);
    
                        //配置输出日志格式。%m表示message即日志信息。%n表示newline换行
                        log4net.Layout.PatternLayout layout = new log4net.Layout.PatternLayout(@"%m%n");
                        layout.ActivateOptions();
    
                        //配置日志级别为所有级别
                        LevelMatchFilter filter = new LevelMatchFilter();
    
                        filter.LevelToMatch = Level.All;
    
                        filter.ActivateOptions();
    
                        //配置日志【循环附加,累加】
                        RollingFileAppender appender = new RollingFileAppender();
    
                        appender.File = string.Format("log//");
    
                        appender.ImmediateFlush = true;
                        appender.MaxSizeRollBackups =0;
                     
                        appender.StaticLogFileName = false;
    
                        appender.DatePattern = $"yyyyMMdd//'{name}.txt'";
    
                        appender.LockingModel = new FileAppender.MinimalLock();
    
                        appender.CountDirection = 0;
                        appender.PreserveLogFileNameExtension = true;
                        
                        appender.AddFilter(filter);
    
                        appender.Layout = layout;
                        appender.AppendToFile = true;
                        appender.ActivateOptions();
    
                        //配置缓存,增加日志效率
                        var aa = new BufferingForwardingAppender();
                        aa.AddAppender(appender);
                        aa.BufferSize = 500;
                        aa.Lossy = false;
                        aa.Fix = FixFlags.None;
                        aa.ActivateOptions();
    
                        log4net.Config.BasicConfigurator.Configure(log4net.LogManager.GetRepository(logFileName), aa);
    
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Ошибка при создании log-файла " + fileName);
                    Console.WriteLine(e.Message);
                }
            }
    
        }

    至此,日志文件名就可以动态创建了。

    使用方式是:

    Log4NetWrapper.WriteToOutput("xxxxx","asdg哈哈哈哈哈")
  • 相关阅读:
    NAVICAT 拒绝链接的问题
    .net垃圾回收-原理浅析
    C#中标准Dispose模式的实现
    Windbg调试托管代码
    C#泛型基础
    .Net垃圾回收和大对象处理
    C++ 小知识点
    C++之虚函数表
    C++之指针与引用,函数和数组
    C++之const关键字
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/15254373.html
Copyright © 2020-2023  润新知