首页 > 技术文章 > net core中动态给log4net添加日志类型

qiywtc 2018-10-23 16:36 原文

        private static object m_Lock = new object();

        /// <summary>
        /// 根据类型获取对应的日志操作类
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        public static ILog GetLog(string typeName)
        {
            lock (m_Lock)
            {
          //这里在初始化时要先创建Repository,如:LogManager.CreateRepository("MeIsTestRepository");//创建之后才能在这里获取到
var testRepository = LogManager.GetRepository("MeIsTestRepository"); var log = LogManager.Exists("MeIsTestRepository", typeName); if (log != null) { return log; } CreateXMLLog(testRepository, typeName); return LogManager.GetLogger("MeIsTestRepository", typeName); } } /// <summary> /// 动态添加日志类型 /// </summary> /// <param name="log"></param> /// <param name="typeName"></param> private static void CreateXMLLog(log4net.Repository.ILoggerRepository logRepository, string typeName) { var xmlDoc = new System.Xml.XmlDocument(); xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null)); var configuration = xmlDoc.CreateElement("configuration"); var root = xmlDoc.CreateElement("log4net"); var appender = xmlDoc.CreateElement("appender"); appender.SetAttribute("name", typeName + "Appender"); appender.SetAttribute("type", "log4net.Appender.RollingFileAppender"); var param = xmlDoc.CreateElement("param"); param.SetAttribute("name", "Encoding"); param.SetAttribute("value", "utf-8"); appender.AppendChild(param); var file = xmlDoc.CreateElement("file"); file.SetAttribute("value", "logfile/"); appender.AppendChild(file); var appendToFile = xmlDoc.CreateElement("appendToFile"); appendToFile.SetAttribute("value", "true"); appender.AppendChild(appendToFile); var rollingStyle = xmlDoc.CreateElement("rollingStyle"); rollingStyle.SetAttribute("value", "Composite"); appender.AppendChild(rollingStyle); var staticLogFileName = xmlDoc.CreateElement("staticLogFileName"); staticLogFileName.SetAttribute("value", "false"); appender.AppendChild(staticLogFileName); var DatePattern = xmlDoc.CreateElement("DatePattern"); DatePattern.SetAttribute("value", $"yyyy/yyyy-MM/{typeName}-yyyy-MM-dd.TXT"); appender.AppendChild(DatePattern); var maxSizeRollBackups = xmlDoc.CreateElement("maxSizeRollBackups"); maxSizeRollBackups.SetAttribute("value", "10"); appender.AppendChild(maxSizeRollBackups); var maximumFileSize = xmlDoc.CreateElement("maximumFileSize"); maximumFileSize.SetAttribute("value", "1MB"); appender.AppendChild(maximumFileSize); var layout = xmlDoc.CreateElement("layout"); layout.SetAttribute("type", "log4net.Layout.PatternLayout"); var conversionPattern = xmlDoc.CreateElement("conversionPattern"); conversionPattern.SetAttribute("value", "$$%date%message%newline"); layout.AppendChild(conversionPattern); appender.AppendChild(layout); var logger = xmlDoc.CreateElement("logger"); logger.SetAttribute("name", typeName); var level = xmlDoc.CreateElement("level"); level.SetAttribute("value", "DEBUG"); var appender_ref = xmlDoc.CreateElement("appender-ref"); appender_ref.SetAttribute("ref", typeName + "Appender"); logger.AppendChild(level); logger.AppendChild(appender_ref); root.AppendChild(appender); root.AppendChild(logger); configuration.AppendChild(root); xmlDoc.AppendChild(configuration); var array = Encoding.ASCII.GetBytes(xmlDoc.OuterXml); var stream = new MemoryStream(array); var reader = new StreamReader(stream); log4net.Config.XmlConfigurator.Configure(logRepository, reader.BaseStream); }

一开始,是想着可以动态将不同的日志写到不同的文件中去,这样方便分类,后面类型太多,不想在log4net.config中一个个添加,所以干脆就动态生成日志配置项好了。

注意,以上方法生成的日志配应该是保存在内存中的,如果停止运行会消失,不会保存到log4net.config文件中。

 

类似在config文件中的:

<logger name="TestLog">
      <level value="DEBUG"/>
      <appender-ref ref="TestLogAppender" />
    </logger>
    <appender name="TestLogAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logfile/" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <staticLogFileName value="false" />
      <datePattern value="yyyy/yyyy-MM/TestLog-yyyy-MM-dd.TXT" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message%newline" /> </layout> </appender>

 

 

net core 版本2.0/2.1都测试过了。   net framework 4.6也测过可以了。

log4net版本2.0.8

测试代码太简单就不放了。

 

可能存在的问题:

生成的日志文件数量超过maxSizeRollBackups设定的值(现在是10)后,会将之前的日志内容替换掉。

所以如果实在是要记录多数据的,可以把这个值调大点,比如10000什么的……

 

另外,datePattern的值“yyyy/yyyy-MM/TestLog-yyyy-MM-dd.TXT",是将文件按分年文件夹,底下再分年-月文件夹,然后才是普通的日志文件。

推荐阅读