log4Net困境

时间:2011-03-16 18:43:06

标签: c# logging log4net

我有一个包含多个C#项目的C#解决方案。我打算在其中添加日志记录。此日志记录应该在所有项目中都可用,并且最好使用带有滚动文件日志的log4Net。

有了上述前提,我可以想到两种方法。

  1. 在解决方案的入口点(程序类)初始化记录器&获取记录器实例&将它用作需要记录的每个类的成员变量。

  2. 添加另一个项目,Utilities&使用静态日志记录方法定义Logging类。该类应该在解决方案的入口点(程序类)中初始化。

  3. 什么是最好的解决方案?

5 个答案:

答案 0 :(得分:7)

我有类似的情况。我们所做的是为所有项目使用1 app config,并使用链接来引用它。

在app的app.config中设置log4net config部分

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

后来设置了Appender:

<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
...

在您要记录的每个班级中,您都会添加与此类似的行:

private static readonly ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

然后每个类抓取相同的记录器(单例)。 这对你有用吗?

答案 1 :(得分:0)

在我的项目中,我编写了一个围绕LOG4NET的包装器(理论上)将其与其他日志框架(如NLOG)交换而不会破坏我的代码。

我自己的日志记录类可以通过静态单例访问。它在这个单例中进行初始化。

(BTW:I published the source code over at the Code Project前段时间,也许它会给你一些灵感)

答案 2 :(得分:0)

如果你正考虑每次在入口点初始化某些东西,那么你就是在写自己的依赖注入案例。使用DI库(如Unity,Castle或您喜欢的任何风格),您可以执行构造函数注入或属性注入以自动初始化您的记录器类(或Log4Net)。

此外,您可以使用DI内核使其成为单身,因此您只有一个活动实例。

答案 3 :(得分:0)

基于Queso的答案,我们在运行时使用反射导入了.dll。为了让他们使用Log4Net,我们创建了一个包含所有相应配置部分的log4net.config文件。我们还使用相同的代码行来初始化Queso引用的每个类中的日志。单独的配置允许我们在整个应用程序域中使用它。

编辑我们还必须对appsettings文件进行修改以允许这样做。

http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

答案 4 :(得分:0)

选项1是要走的路。

如果使用静态方法,则无法使用分层记录器。此功能允许您为各个类甚至整个子系统配置不同的日志输出,例如YourNameSpace.Security。这个tutorial详细阐述了这一主题(其他章节也是一本很好的解读)。

构建包装器当然不是一个坏主意,但并不是绝对必要的。它确实允许一些事情:更改日志框架,使用DI,添加额外的日志级别(例如log.Verbose())或不同的重载进行日志记录...

顺便说一下。我会像这样初始化记录器:

ILog log = LogManager.GetLogger(typeof(YourClass));