Orchard学习 01、orchard日志
一、日志模块类图
1 publicclassNullLogger:ILogger 2 { 3 privatestaticreadonlyILogger _instance =newNullLogger(); 4 publicstaticILoggerInstance 5 { 6 get 7 { 8 return _instance; 9 } 10 } 11 #region ILogger 成员 12 13 public bool IsEnabled(LogLevel level) 14 { 15 returnfalse; 16 } 17 18 publicvoidLog(LogLevel level,Exception exception,string format,paramsobject[] args) 19 { 20 21 } 22 23 #endregion 24 }
View Code
1 publicclassLoggingModule:Module 2 { 3 privatereadonlyConcurrentDictionary<string,ILogger> _loggerCache; 4 5 publicLoggingModule() 6 { 7 _loggerCache =newConcurrentDictionary<string,ILogger>(); 8 } 9 10 protectedoverridevoidLoad(ContainerBuilder moduleBuilder) 11 { 12 // by default, use Orchard's logger that delegates to Castle's logger factory 13 moduleBuilder.RegisterType<CastleLoggerFactory>().As<ILoggerFactory>().InstancePerLifetimeScope(); 14 moduleBuilder.RegisterType<OrchardLog4netFactory>().As<Castle.Core.Logging.ILoggerFactory>().InstancePerLifetimeScope().WithParameter(newNamedParameter("isFullTrust",false)); 15 16 // call CreateLogger in response to the request for an ILogger implementation 17 moduleBuilder.Register(CreateLogger).As<ILogger>().InstancePerDependency(); 18 } 19 20 protectedoverridevoidAttachToComponentRegistration(IComponentRegistry componentRegistry,IComponentRegistration registration) 21 { 22 var implementationType = registration.Activator.LimitType; 23 24 // build an array of actions on this type to assign loggers to member properties 25 var injectors =BuildLoggerInjectors(implementationType).ToArray(); 26 27 // if there are no logger properties, there's no reason to hook the activated event 28 if(!injectors.Any()) 29 return; 30 31 // otherwise, whan an instance of this component is activated, inject the loggers on the instance 32 registration.Activated+=(s, e)=> 33 { 34 foreach(var injector in injectors) 35 injector(e.Context, e.Instance); 36 }; 37 } 38 39 privateIEnumerable<Action<IComponentContext,object>>BuildLoggerInjectors(Type componentType) 40 { 41 // Look for settable properties of type "ILogger" 42 var loggerProperties = componentType 43 .GetProperties(BindingFlags.SetProperty|BindingFlags.Public|BindingFlags.Instance) 44 .Select(p =>new 45 { 46 PropertyInfo= p, 47 p.PropertyType, 48 IndexParameters= p.GetIndexParameters(), 49 Accessors= p.GetAccessors(false) 50 }) 51 .Where(x => x.PropertyType==typeof(ILogger))// must be a logger 52 .Where(x => x.IndexParameters.Count()==0)// must not be an indexer 53 .Where(x => x.Accessors.Length!=1|| x.Accessors[0].ReturnType==typeof(void));//must have get/set, or only set 54 55 // Return an array of actions that resolve a logger and assign the property 56 foreach(var entry in loggerProperties) 57 { 58 var propertyInfo = entry.PropertyInfo; 59 yield return(ctx, instance)=> 60 { 61 string component = componentType.ToString(); 62 if(component != instance.GetType().ToString()) 63 { 64 return; 65 } 66 var logger = _loggerCache.GetOrAdd(component, key => ctx.Resolve<ILogger>(newTypedParameter(typeof(Type), componentType))); 67 propertyInfo.SetValue(instance, logger,null); 68 }; 69 } 70 } 71 72 privatestaticILoggerCreateLogger(IComponentContext context,IEnumerable<Parameter> parameters) 73 { 74 // return an ILogger in response to Resolve<ILogger>(componentTypeParameter) 75 var loggerFactory = context.Resolve<ILoggerFactory>(); 76 var containingType = parameters.TypedAs<Type>(); 77 return loggerFactory.CreateLogger(containingType); 78 } 79 }
View Code
1 <?xml version="1.0" encoding="utf-8"?> 2 <log4net> 3 <root> 4 5 <priority value="ERROR"/> 6 <appender-refref="error-file"/> 7 </root> 8 9 10 <logger name="NHibernate.Cache"> 11 <priority value="ERROR"/> 12 </logger> 13 14 <logger name="NHibernate.AdoNet.AbstractBatcher"> 15 <priority value="ERROR"/> 16 </logger> 17 18 <logger name="NHibernate.Util.ADOExceptionReporter"> 19 <priority value="ERROR"/> 20 </logger> 21 22 <appender name="error-file" type="Orchard.Logging.OrchardFileAppender"> 23 <file value="orchard-error"/> 24 <appendToFile value="true"/> 25 <immediateFlush value="false"/> 26 <staticLogFileName value="false"/> 27 <rollingStyle value="Date"/> 28 <datepattern value="-yyyy.MM.dd'.log'"/> 29 <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> 30 <layout type="log4net.Layout.PatternLayout"> 31 <conversionPattern value="%date [%thread] %logger - %P{Tenant} - %message%newline %P{Url}%newline"/> 32 </layout> 33 </appender> 34 </log4net>
View Code
1 /// <summary> 2 /// 要使用日志的类型 3 /// </summary> 4 publicclassThing 5 { 6 publicThing() 7 { 8 Logger=NullLogger.Instance; 9 } 10 /// <summary> 11 /// 设置类型为 ILogger 的属性 12 /// </summary> 13 publicILoggerLogger 14 { 15 get; 16 set; 17 } 18 publicvoidTestMethod() 19 { 20 //这使用Log方法则 Logger属性 会被设置为 CastleLogger类;使用Error方法 Logger属性 会被设置为OrchardLog4netLogger类 21 Logger.Log(Orchard.Logging.LogLevel.Error,newException("测试异常"),"测试异常使用CastleLogger类型"); 22 Logger.Error(newException("测试异常"),"测试异常使用OrchardLog4netLogger类型"); 23 } 24 }
View Code
1 publicvoidCreateTest() 2 { 3 var builder =newContainerBuilder();//构建autofac容器 4 builder.RegisterModule(newLoggingModule());//注册LoggingModule 5 builder.RegisterType<Thing>();//注册 Thing类型 6 var container = builder.Build();//Build 容器 7 var thing = container.Resolve<Thing>();//从容器中解析 Thing类型 8 thing.TestMethod();//调用TestMethod方法,则会调用日志 9 }
View Code
转载于:https://www.cnblogs.com/matchcolor/p/4091995.html
Orchard学习 01、orchard日志相关推荐
- orchard学习,
orchard,cms 学习, 下载,Orchard-1.10.2.zip 目录:Orchard-1.10.2\ 工程:Orchard-1.10.2\Orchard.sln 命令行工具:Orchard ...
- ThinkPhp学习01
原文:ThinkPhp学习01 一.ThinkPHP的介绍 MVC M - Model 模型 工作:负责数据的操作 V - View 视图 ...
- webservice学习01:wsdl文档结构
webservice学习01:wsdl文档结构 wsdl文档结构 WSDL文档示例 <wsdl:definitions xmlns:xsd="http://www.w3.org/200 ...
- MyBatis学习(01)之解决mapper绑定异常
MyBatis学习(01)之解决mapper绑定异常 参考文章: (1)MyBatis学习(01)之解决mapper绑定异常 (2)https://www.cnblogs.com/limn/p/858 ...
- hadoop2.x学习01
hadoop2.x学习01 最新的发行版本已经是2.7了,我围绕2.5展开学习. hadoop2.x是在hadoop0.23之后发行的正式版2.2. 本身是来自于lucene和nutch,在ggl的论 ...
- 强化学习(Reinforcement Learning)入门学习--01
强化学习(Reinforcement Learning)入门学习–01 定义 Reinforcement learning (RL) is an area of machine learning in ...
- 计算机编码二进制0001,二进制学习01(二进制,进制运算,数据宽度,无符号位有符号位编码规则)...
二进制学习01 进制 一.二进制简介 1)什么是二进制? 2)二进制的简写形式 二.进制运算 1)八进制运算表 (1) 加法运算表 (2)乘法运算表 (3)八进制简单运算题 三.数据宽度 1)什么是数 ...
- Java多线程学习——01
Java多线程学习--01 1.核心概念 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念 进程Process:是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单 ...
- Android Graphics Tests 程序学习01
转载自:http://zhoujinjian.cc/2018/12/20/Android%20Graphics%20Tests%20%E7%A8%8B%E5%BA%8F%E5%AD%A6%E4%B9% ...
最新文章
- 【ASP.NET 问题】Win7中IIS被防火墙阻止导致外网无法访问的解决方法。
- MemCached java client 1.5.1 性能测试
- 特斯拉大半夜「见鬼」!空无一人的路上,它却看见「幽灵」秒刹车
- 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?
- Shellz中awk的简单用法
- Rational rose的安装
- android模拟全局按键,android命令行模拟输入事件(文字、按键、触摸等)
- 推荐系统遇上深度学习(二十)-贝叶斯个性化排序算法原理及实战
- How to download ABAP development Tool from Fiori Launchpad
- nyoj--79--导弹拦截(动态规划)
- mvc js ajax实例,MVC ajax异步上传文件例子(ajaxFileUpload)
- 大规模数据作成时的注意点。
- 编译x264出现错误:No working C compiler found.
- 联想电脑尺寸在哪里看_联想笔记本电脑型号查看方式、含义介绍【图文教程】...
- Android 中 RecyclerView 的基本使用
- bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛*
- phpstorm安装jquery插件库
- wpf 字体模糊_WPF Effect 造成的字体模糊
- Python中获取两数相除的商和余数
- 程序员一般都需要什么学历?就业前景如何?