通常使用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哈哈哈哈哈")