log4net 用代码记录日志
今天在开发项目的时候,遇到跨域调用log4net中的类,出现了一个bug,提示LogImpl未标记可序列化,此时,我靠,麻烦了,这个类又不是咱们自己的,改源码我想应该不是很实际了把,然后有以下方案:
1.改源码;
2.从子域抛异常到主域,然后在主域里记录;
3.在子域配置app.cofig;
4.在子域用代码创建log;
方案4可用,其他都不可用;
方案一:修改源码:最后出现在System类中去了,此时,我靠,这个方案肯定不行,系统类肯定没法修改了;【果断排除】
方案二:从子域抛异常到主域,然后在主域里记录,此方案还算可以,只是主域和子域都会记录日志的;【不是很好】
方案三:在子域配置app.cofig,这个肯定不行,配置了,当子域中要用到时,两个会冲突;【果断排除】
方案四:在子域用代码创建log【下面这个类】,但也折腾了好几天,老是记录不到,经过调试发现:IsDebugEnabled =fasle;
这个属性是否记录日志;
问题找到了,所以就得找解决办法,又折腾了好久,通过源码找到了问题;
本想直接修改这个IsDebugEnabled=true;可是它是只读的不允许修改;
原来老大在这里啊,你害的我找了半天;由此为了让更多人少走弯路,才总结了此博客,也为自己做备忘;
Configured这个属性决定着IsDebugEnabled;
var hierarchy = new Hierarchy { Configured = true };
logger.Hierarchy = hierarchy;
创建日志记录;
1 public class ProjectsLog 2 { 3 /// <summary> 4 /// 创建Log 5 /// </summary> 6 public static ILog CreateLog(string name) 7 { 8 var appender = CreateAppender(name); 9 var log = LogManager.GetLogger(name); 10 var logger = (Logger)log.Logger; 11 logger.RemoveAllAppenders(); 12 logger.AddAppender(appender); 13 logger.Level = Level.Info; 14 var hierarchy = new Hierarchy { Configured = true }; 15 logger.Hierarchy = hierarchy; 16 return log; 17 } 18 19 /// <summary> 20 /// 创建Appender 21 /// </summary> 22 private static IAppender CreateAppender(string name) 23 { 24 var baseDir = AppDomain.CurrentDomain.BaseDirectory; 25 dir = Path.Combine(baseDir , name); 26 27 var appender = new RollingFileAppender 28 { 29 AppendToFile = true, 30 DatePattern = "yyyy-MM-dd'.log'", 31 File = dir + "/" 32 }; 33 34 var layout = new PatternLayout { ConversionPattern = "-------------------------------------------------------------------------------%n[%d] %-5level - %m%n" }; 35 layout.ActivateOptions(); 36 37 appender.Layout = layout; 38 appender.MaxSizeRollBackups = 30; 39 appender.RollingStyle = RollingFileAppender.RollingMode.Date; 40 appender.StaticLogFileName = false; 41 appender.Name = name; 42 appender.ActivateOptions(); 43 return appender; 44 } 45 }