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哈哈哈哈哈")

 

posted @ 2021-09-11 13:09  灰主流  阅读(1343)  评论(0编辑  收藏  举报