参考页面:

http://www.yuanjiaocheng.net/CSharp/csharprumenshili.html

http://www.yuanjiaocheng.net/entity/mode-first.html

http://www.yuanjiaocheng.net/entity/database-first.html

http://www.yuanjiaocheng.net/entity/choose-development-approach.html

http://www.yuanjiaocheng.net/entity/query-with-edm.html

项目过程中, 不可避免的, 需要使用到日志功能. 在我接触过的项目中, 也有自己弄一套日志的, 但是更多的, 还是使用别人成熟的dll, 比如log4.

log4相关的文档, 真是非常的多, 也非常的全, 但是本着温故而知新的目的, 还是想把这个过一遍.

先放一个小Demo在上面

<appender name="TraceLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Logs\trace.txt" />
  <MaxSizeRollBackups value="20" />
  <StaticLogFileName value="false" />
  <DatePattern value="yyyyMMdd'.txt'" />
  <RollingStyle value="Size" />
  <MaximumFileSize  value="10MB"/>
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" />
    <footer value="[END LOGGING AT %date]%newline%newline" type="log4net.Util.PatternString" />
    <ConversionPattern value="%d [%t] %-5p %c - %m%n" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter,log4net">
    <levelMin value="DEBUG" />
    <levelMax value="INFO" />
  </filter>
</appender>

主要有五个组成部分: Appenders, Filters, Layouts, Loggers, Object Renders

1. Appenders

用来定义日志的输出方式. 可以通过配置Filters和Layout来实现日志的过滤和输出格式.

他的输出方式有很多种, 这里主要介绍几种项目中最常用的.

AdoNetAppender  将日志记录到数据库中
FileAppender 将日志输出到文件
RollingFileAppender 将日志以回滚文件的形式写到文件中
SmtpAppender 将日志写到邮件中

2. Filters

过滤器可以过滤掉Appender输出的内容.

DenyAllFilter 阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录

3. Layouts

用于控制Appender的输出格式, 可以使线性的, 也可以使Xml. 但是一个Appender只能有个一个Layout. 配置了这个之后, 可以不用在程序中再去自定义一个格式了.

最常用的, 应该还是自定义格式的PatternLayout. 接下来看一下 ConversionPattern 里面的格式和意义

<ConversionPattern value="%d [%t] %-5p %c - %m%n" />

a

appdomain

引发日志事件的应用程序域的名称

c (小写)

logger

记录日志事件的Logger对象的名字

可以使用精度说明符控制Logger的名字的输出层级,  默认输出全名

注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c", 输出模型为 %logger{2} ,将输出"b.c"

C (大写)

class

type

引发日志请求的类的全名

可以使用精度控制符. 例如: 类名是 "log4net.Layout.PatternLayout",

格式模型是 %type{1}将输出"PatternLayout"。(也是从右开始的。)

警告:会影响性能。

d

date

记录当前本地时间.  如 %d{HH:mm:ss,fff} 或 %d{dd MMM yyyy HH:mm:ss,fff}

建议还是使用自定义格式的时间吧.

exception

异常信息

日志中必须存一个异常对象, 如果日志事件不包含没有异常对象, 那么什么也输出不了.

异常输出完毕后, 会跟一个换行. 一般会在输出异常前加一个换行, 并将异常放在最后.

F

file

发生日志请求的源代码文件的名字

警告:只在调试的时候有效。调用本地信息会影响性能。

U

identity

当前活动用户的名字(Principal.Identity.Name).

警告:会影响性能。(我测试的时候%identity返回都是空的。)

l (L的小写)

location

引发日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。

警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。

L

p

level  

 日志等级
 line  引发日志的行号

m

message

由应用程序提供给日志的消息

M

method

发生日志请求的方法名(只有方法名而已)。

警告:会影响性能。

X

mdc

P

property

propertites

输出事件的特殊属性。例如: %property{user} 输出user属性。

属性是由loggers或appenders添加到时间中的。 有一个默认的属性"DE<log4net:HostName"总是会有。

DE<%property将输出所以的属性 。

n

newline

换行符

r

timestamp

从程序启动到事件发生所经过的毫秒数。

t

thread

引发日志事件的线程,如果没有线程名就使用线程号。

w

username

当前用户的WindowsIdentity。(类似:HostName\Username)

警告:会影响性能。

utcdate

发生日志事件的UTC时间。DE<后面还可以跟一个日期格式,用大括号括起来。

DE<例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}

如果utcdate后面什么也不跟,将使用ISO8601 格式 。

日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。

另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表AbsoluteTimeDateFormatter,DateTimeDateFormatterIso8601DateFormatter

例如: %date{ISO8601}%date{ABSOLUTE}

它们的性能要好于ToString。

x

ndc

 NDC (nested diagnostic context)

%

%%输出一个百分号

上面demo中的-5是什么意思呢? 接着看

Format modifier left justify minimum width maximum width comment
%20logger false 20 none

如果logger名不足20个字符,就在左边补空格。

%-20logger true 20 none

如果logger名不足20个字符,就在右边补空格。

%.30logger NA none 30

超过30个字符将截断。

%20.30logger false 20 30

logger名要在20到30之间,少了在左边补空格,多了截断。

%-20.30logger true 20 30

logger名要在20到30之间,少了在右边补空格,多了截断。

4. Loggers

Logger是直接和应用程序交互的组件. Logger只是产生日志, 然后由它引用的Appender记录到指定的地方, 并有Layout控制输出格式.

Logger提供了多种方式来记录一个日志消息, 也可以有多个Logger同时存在. 每个实例化的Logger对象被log4net作为命名实体来维护.

log4net使用继承体系, 两个Logger, a 和 a.b, a是a.b的祖先. 每个Logger都继承了它祖先的属性.

日志的等级有如下几级:

  OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL.

5. Object Renders

我对Object Renders的理解是这样的。它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(你可能注意到了,ILog中定义的接口接收的参数是Object,而不是String。)

例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。

不过我没有测试过,具体怎么做还是看文档吧。

参考:

  log4net使用手册 (这一篇都是从这里拷贝过来的, 链接里面更加详细)

Log4net - 规则简介的更多相关文章

  1. Log4net - 规则简介(续)

    之前对于配置并没有结束, 中间插了一个demo进去, 能够更直观的看到日志是怎么使用的. 这一篇, 我加了一些自己的东西进去, 可以更直观的来理解这些配置内容. 这里就继续介绍配置文件中的内容. 1. ...

  2. Java基础-正则表达式(Regular Expression)语法规则简介

    Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...

  3. Emmet(Zen Coding)语法规则简介

    ———Emmet(Zen Coding)语法规则简介——— [Zen Coding可谓快速开发HTML和CSS的利器,主要采用仿css类选择器方式编写代码,以下是该利器的基本语法规则和代码示例] 基础 ...

  4. 【2016-08-21】Linux内核版本编号规则简介

    我们已经了解可以使用下面的几天命令来查看Linux内核版本及Ubuntu发行版本的信息: uname -r uname -a cat /proc/version lsb-release -a 等等 可 ...

  5. 自动构建Makefile(1)--C/C++编译流程&Makefile规则简介

      前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建 ...

  6. Rewrite规则简介

    Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必须先 ...

  7. 自定义 Lint 规则简介

    上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话.深受启发之后,笔者想就此话题做进一步的探索. 定义 如果 ...

  8. log4net使用简介

    平常我们在开发网站时,有一些比较重要的地方需要添加日志记录.一般日志记录分为两种:1)在数据库中添加一张日志表,用来记录用户操作并给用户提醒(用户可以看到). 2)在系统中添加一个日志文件,用来记录一 ...

  9. 第一篇 Rewrite规则简介

    1.Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必 ...

随机推荐

  1. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  2. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索

    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...

  3. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  4. 继电器是如何成为CPU的(1)

    继电器是如何成为CPU的(1) ——<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的 ...

  5. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  6. SQLServer执行命令出现“目录无效的提示”

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...

  7. Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

    前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...

  8. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  9. CSS垂直居中的11种实现方式

    今天是邓呆呆球衣退役的日子,在这个颇具纪念意义的日子里我写下自己的第一篇博客,还望前辈们多多提携,多多指教! 接下来,就进入正文,来说说关于垂直居中的事.(以下这11种垂直居中的实现方式均为笔者在日常 ...

  10. vs15 preview5 离线安装包

    1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.microsoft.com/visualstudio/2016/10/05/announ ...