概述
最近因为工作关系,开始转投C#阵营,基于公司的一个产品作二次开发。公司产品的现状让我有点诧异,居然没有记录日志,如果程序报错,就会弹出一个可恶的对话框。除了调试源码没有任何办法知道是什么原因引起的。
C#的同事建议写一个简单的日志API,可能因为JAVA的开源精神的影响,还是决定采用开源组件,为什么要重复造轮子呢?
哈哈,于是决定引入log4net组件,本篇文章只是记录一下使用log4net的QuickStart,并提出遇到的一些问题。
下载
添加引用
在工程中添加log4net.dll动态库的引用。
配置log4net
要配置log4net有多种方式,这里采用个人认为比较简单的方法,首先需要在AssemblyInfo.cs中添加如下代码块:
java 代码
- [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = false)]
上述代码表示log4net的配置文件名称为log4net.config,watch表示是否需要实时监听log4net.config配置文件的改变。接着需要添加log4net.config文件,配置相关参数,具体的参数含义和log4j很类似,这里就不详述了,下面是一个示例的配置文件:
java 代码
- <?xml version="1.0" encoding="utf-8" ?>
- <log4net>
- <appender name="FileAppender" type="log4net.Appender.FileAppender">
- <file value="logs/log.txt" />
- <appendToFile value="true" />
- <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
- <mapping>
- <level value="ERROR" />
- <foreColor value="White" />
- <backColor value="Red, HighIntensity" />
- </mapping>
- <mapping>
- <level value="DEBUG" />
- <backColor value="Green" />
- </mapping>
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
-
- <root>
- <level value="INFO" />
- <appender-ref ref="ColoredConsoleAppender" />
- <appender-ref ref="FileAppender" />
- </root>
- </log4net>
记录日志
现在就可以在程序中使用log4net组件记录日志了,步骤如下:
- 使用using log4net;语句引用log4net组件。
- 构建ILog实例,类似如下:
java 代码
- private static readonly ILog LOG = LogManager.GetLogger(typeof(DbDynamicShipProvider));
- 在需要记录日志的地方,调用ILog的相应方法,比如LOG.info。
一点想法
最困难的事情不是如何做,而是做什么。对于使用开源组件也是一样的道理,最困难的不是怎么样记录日志,而是在什么情况下记录什么。
有很多项目都五脏俱全,但是很多设施并没有起到真正的作用。比如日志,当出了问题的时候从日志中很快地判断问题所在区域,还是必须调试程序才能找到原因。
在哪些地方需要记录日志,使用什么级别,这才是最关键的问题。
待解决问题
如果一个解决方案中包含一个或者多个Assembly,希望每个Assembly都可以使用log4net 记录日志,并记录到同一个文件?
如果按照JAVA的作法,在每个Assembly都使用如上同样的配置,最后所有的日志都会失效。去网上查的原因是log4net会锁住日志文件,可以通过repository来实现,但是具体如何实现呢?我还没有找到解决方案,目前只能一个解决方案包含一个单一的项目。