我有一个包含多个C#项目的C#解决方案。我打算在其中添加日志记录。此日志记录应该在所有项目中都可用,并且最好使用带有滚动文件日志的log4Net。
有了上述前提,我可以想到两种方法。
在解决方案的入口点(程序类)初始化记录器&获取记录器实例&将它用作需要记录的每个类的成员变量。
添加另一个项目,Utilities&使用静态日志记录方法定义Logging类。该类应该在解决方案的入口点(程序类)中初始化。
什么是最好的解决方案?
答案 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));