Orchard学习 01、orchard日志
一、日志模块类图


publicclassNullLogger:ILogger
{
privatestaticreadonlyILogger _instance =newNullLogger();
publicstaticILoggerInstance
{
get
{
return _instance;
}
}
#region ILogger 成员 public bool IsEnabled(LogLevel level)
{
returnfalse;
} publicvoidLog(LogLevel level,Exception exception,string format,paramsobject[] args)
{ } #endregion
}
publicclassLoggingModule:Module
{
privatereadonlyConcurrentDictionary<string,ILogger> _loggerCache; publicLoggingModule()
{
_loggerCache =newConcurrentDictionary<string,ILogger>();
} protectedoverridevoidLoad(ContainerBuilder moduleBuilder)
{
// by default, use Orchard's logger that delegates to Castle's logger factory
moduleBuilder.RegisterType<CastleLoggerFactory>().As<ILoggerFactory>().InstancePerLifetimeScope();
moduleBuilder.RegisterType<OrchardLog4netFactory>().As<Castle.Core.Logging.ILoggerFactory>().InstancePerLifetimeScope().WithParameter(newNamedParameter("isFullTrust",false)); // call CreateLogger in response to the request for an ILogger implementation
moduleBuilder.Register(CreateLogger).As<ILogger>().InstancePerDependency();
} protectedoverridevoidAttachToComponentRegistration(IComponentRegistry componentRegistry,IComponentRegistration registration)
{
var implementationType = registration.Activator.LimitType; // build an array of actions on this type to assign loggers to member properties
var injectors =BuildLoggerInjectors(implementationType).ToArray(); // if there are no logger properties, there's no reason to hook the activated event
if(!injectors.Any())
return; // otherwise, whan an instance of this component is activated, inject the loggers on the instance
registration.Activated+=(s, e)=>
{
foreach(var injector in injectors)
injector(e.Context, e.Instance);
};
} privateIEnumerable<Action<IComponentContext,object>>BuildLoggerInjectors(Type componentType)
{
// Look for settable properties of type "ILogger"
var loggerProperties = componentType
.GetProperties(BindingFlags.SetProperty|BindingFlags.Public|BindingFlags.Instance)
.Select(p =>new
{
PropertyInfo= p,
p.PropertyType,
IndexParameters= p.GetIndexParameters(),
Accessors= p.GetAccessors(false)
})
.Where(x => x.PropertyType==typeof(ILogger))// must be a logger
.Where(x => x.IndexParameters.Count()==)// must not be an indexer
.Where(x => x.Accessors.Length!=|| x.Accessors[].ReturnType==typeof(void));//must have get/set, or only set // Return an array of actions that resolve a logger and assign the property
foreach(var entry in loggerProperties)
{
var propertyInfo = entry.PropertyInfo;
yield return(ctx, instance)=>
{
string component = componentType.ToString();
if(component != instance.GetType().ToString())
{
return;
}
var logger = _loggerCache.GetOrAdd(component, key => ctx.Resolve<ILogger>(newTypedParameter(typeof(Type), componentType)));
propertyInfo.SetValue(instance, logger,null);
};
}
} privatestaticILoggerCreateLogger(IComponentContext context,IEnumerable<Parameter> parameters)
{
// return an ILogger in response to Resolve<ILogger>(componentTypeParameter)
var loggerFactory = context.Resolve<ILoggerFactory>();
var containingType = parameters.TypedAs<Type>();
return loggerFactory.CreateLogger(containingType);
}
}
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<root> <priority value="ERROR"/>
<appender-refref="error-file"/>
</root> <logger name="NHibernate.Cache">
<priority value="ERROR"/>
</logger> <logger name="NHibernate.AdoNet.AbstractBatcher">
<priority value="ERROR"/>
</logger> <logger name="NHibernate.Util.ADOExceptionReporter">
<priority value="ERROR"/>
</logger> <appender name="error-file" type="Orchard.Logging.OrchardFileAppender">
<file value="orchard-error"/>
<appendToFile value="true"/>
<immediateFlush value="false"/>
<staticLogFileName value="false"/>
<rollingStyle value="Date"/>
<datepattern value="-yyyy.MM.dd'.log'"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %logger - %P{Tenant} - %message%newline %P{Url}%newline"/>
</layout>
</appender>
</log4net>
/// <summary>
/// 要使用日志的类型
/// </summary>
publicclassThing
{
publicThing()
{
Logger=NullLogger.Instance;
}
/// <summary>
/// 设置类型为 ILogger 的属性
/// </summary>
publicILoggerLogger
{
get;
set;
}
publicvoidTestMethod()
{
//这使用Log方法则 Logger属性 会被设置为 CastleLogger类;使用Error方法 Logger属性 会被设置为OrchardLog4netLogger类
Logger.Log(Orchard.Logging.LogLevel.Error,newException("测试异常"),"测试异常使用CastleLogger类型");
Logger.Error(newException("测试异常"),"测试异常使用OrchardLog4netLogger类型");
}
}
publicvoidCreateTest()
{
var builder =newContainerBuilder();//构建autofac容器
builder.RegisterModule(newLoggingModule());//注册LoggingModule
builder.RegisterType<Thing>();//注册 Thing类型
var container = builder.Build();//Build 容器
var thing = container.Resolve<Thing>();//从容器中解析 Thing类型
thing.TestMethod();//调用TestMethod方法,则会调用日志
}
Orchard学习 01、orchard日志的更多相关文章
- Orchard 学习-安装Orchard
前段时间使用一个ABP的框架进行了一个简单CMS开发.但感觉自己开发CMS不够灵活和通用,所以还是学习一下Orchard.学习的第一步,阅读官方的文档.由于是英文,所以我对其进行了翻译和记录,方便自己 ...
- 200. Orchard学习 目录
201. Orchard学习 一.基础 210. Orchard学习 二.启动 211. Orchard学习 二 1.Application_Start 212. Orchard学习 二 2.Manu ...
- Orchard学习笔记
1.下载Orchard sourcrs资源文件,同时也可以去百度下载中文包 资源地址(https://github.com/OrchardCMS/Orchard/releases/download/1 ...
- Orchard学习系列-----如何运行的
感慨:当接触到微软这套程序时,代码实在是太好了,好的几乎都读不懂.很久之前就对这个套开源程序特别感兴趣,但读不明白也让人郁闷. 背景(Orchard官网): 可组装系统的CMS系统,OrChard在运 ...
- ThinkPhp学习01
原文:ThinkPhp学习01 一.ThinkPHP的介绍 MVC M - Model 模型 工作:负责数据的操作 V - View 视图(模板 ...
- spring学习(01)之IOC
spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- Java虚拟机JVM学习01 流程概述
Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...
- Android Testing学习01 介绍 测试测什么 测试的类型
Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...
随机推荐
- MT【112】单变量化
评:降维,单变量是我们不懈的追求
- 【题解】 [POI2012]FES-Festival (差分约束)
懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...
- PyCharm远程开发配置及一些问题的解决方案
PyCharm远程开发配置 具体请参考:https://www.jianshu.com/p/79df9ac88e96 Tips:必须要安装PyCharm专业版 实践过程中遇到的问题 背景 因项目需要, ...
- Problem A: 道路建设 解题报告
一定存在一个最优解是一条链 否则可以接上去,不会更差 边权最小的边一定在这条链上 这个比较显然 可以把所有边都减去这个最后加上就行了 把链上的边按距离当前根的深度从小到大排列,设第一个零边位置为\(k ...
- linux ------ 硬连接和软连接(软连接也叫符号连接)
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号 (Inode Index).在Linux中,多个文件名指向同一索引节点是存在的.一般这种连接就是硬连接 ...
- ElasticStack系列之十九 & bulk时 index 和 create 的区别
区别: 两篇文章 id 都一样的情况下,index 是将第二篇文章覆盖第一篇:create 是在第二篇插入的时候抛出一个已经存在的异常 解释: 在批量请求的时候最好使用 create 方式进行导入.假 ...
- bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3106 白棋如果第一步不能赢,那么一定输 因为可以黑棋走的距离比白棋大,黑棋可以下一步吃掉白棋,也可以 ...
- My latest news
2018.04.12 0:01 本站点停止更新,启用0x7c00.vip站点. 2018.03.23 复试报道(心态不太平稳).每一行的深入都是需要知识的积累和时间的沉淀,就像学法律.计算机等等.愿 ...
- django2.0 官方中文文档地址
django2.0 官方开始发布中文文档了,之前还想着一直翻译完成所有有必要的内容,想着可以省事一些了,打开以后看了一下,发现官方的中文文档还没翻译完成, 现在(2018-7-10)最新章节是是 编 ...
- Tornado实现多线程、多进程HTTP服务
背景 线上有一个相关百科的服务,返回一个query中提及的百科词条.该服务是用python实现的,以前通过thrift接口访问,现要将其改为通过HTTP访问.之前没有搭建HTTPServer的经验,因 ...