log4net 使用
1:在代理中使用log4net,代理在另一个程序集中,console程序中不能LogManager.GetLogger得到logger,需要在主程序集中先LogManager.GetLogger一遍。
window service中也需要主程序集先调用一次,并且需要修改window service的目标框架为.net 4.0而不是client profile
如果同时设置了<root>和<logger name="logA">,LogManager.GetLogger("logA")方式取得logger,会输出两条一样的日志记录。
不能同时通过文本和邮件输出同一条信息;fileLogger.Error();smtpLogger.Error();后面的一次输出不起作用。
配置如下:
log4net.config:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!--定义输出到文件中-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="D:/MainUpdateLog/log4netfile.txt"/>
<appendToFile value="true"/>
<!--<rollingStyle value="Date"/>-->
<datePattern value="yyyyMMdd-HH:mm:ss"/>
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Leon"/>
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"/>
</layout>
<!--OFF>FATAL>ERROR>WARN>INFO>DEBUG>ALL-->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="OFF" />
</filter>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<logger name="UtilityLogger">
<!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="INFO" />
<appender-ref ref="LogFileAppender"></appender-ref>
</logger>
<root>
<!--文件形式记录日志-->
<appender-ref ref="LogFileAppender"/>
<!--控制台控制显示日志
<appender-ref ref="ConsoleAppender"/>-->
</root>
</log4net>
程序集特性
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
配置文件中使用的参数
PatterLayout格式化字符表
转换字符 |
效果 |
a |
等价于appdomain |
appdomain |
引发日志事件的应用程序域的友好名称。(使用中一般是可执行文件的名字。) |
c |
等价于 logger |
C |
等价于 type |
class |
等价于 type |
d |
等价于 date |
date |
发生日志事件的本地时间。 使用 DE>%utcdate 输出UTC时间。date后面还可以跟一个日期格式,用大括号括起来。DE>例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date后面什么也不跟,将使用ISO8601 格式 。 日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。 另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如:%date{ISO8601}或%date{ABSOLUTE}。 它们的性能要好于ToString。 |
exception |
异常信息 日志事件中必须存了一个异常对象,如果日志事件不包含没有异常对象,将什么也不输出。异常输出完毕后会跟一个换行。一般会在输出异常前加一个换行,并将异常放在最后。 |
F |
等价于 file |
file |
发生日志请求的源代码文件的名字。 警告:只在调试的时候有效。调用本地信息会影响性能。 |
identity |
当前活动用户的名字(Principal.Identity.Name). 警告:会影响性能。(我测试的时候%identity返回都是空的。) |
l |
等价于 location |
L |
等价于 line |
location |
引发日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。 警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。 |
level |
日志事件等级 |
line |
引发日志事件的行号 警告:会影响性能。 |
logger |
记录日志事件的Logger对象的名字。 可以使用精度说明符控制Logger的名字的输出层级,默认输出全名。 注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c", 输出模型为%logger{2} ,将输出"b.c"。 |
m |
等价于 message |
M |
等价于 method |
message |
由应用程序提供给日志事件的消息。 |
mdc |
MDC (旧为:ThreadContext.Properties) 现在是事件属性的一部分。 保留它是为了兼容性,它等价于 property。 |
method |
发生日志请求的方法名(只有方法名而已)。 警告:会影响性能。 |
n |
等价于 newline |
newline |
换行符 |
ndc |
NDC (nested diagnostic context) |
p |
等价于 level |
P |
等价于 property |
properties |
等价于 property |
property |
输出事件的特殊属性。例如: %property{user} 输出user属性。属性是由loggers或appenders添加到时间中的。 有一个默认的属性"DE>log4net:HostName"总是会有。DE> %property将输出所有的属性 。 (扩展后可以使用)
|
r |
等价于 timestamp |
t |
等价于 thread |
timestamp |
从程序启动到事件发生所经过的毫秒数。 |
thread |
引发日志事件的线程,如果没有线程名就使用线程号。 |
type |
引发日志请求的类的全名。. 可以使用精度控制符。例如: 类名是 "log4net.Layout.PatternLayout", 格式模型是%type{1} 将输出"PatternLayout"。(也是从右开始的。) 警告:会影响性能。 |
u |
等价于 identity |
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, DateTimeDateFormatter和Iso8601DateFormatter。例如:%date{ISO8601}或%date{ABSOLUTE}。 它们的性能要好于ToString。 |
w |
等价于 username |
x |
等价于 ndc |
X |
等价于 mdc |
% |
%%输出一个百分号
|