应用程序设计 - 糟糕的适配器模式和 Log4Net 设计案例






4.71/5 (10投票s)
本主题将涵盖适配器模式的概念以及如何使用 log4net 实现日志记录器。它还将涵盖什么是适配器模式,为什么需要它,在哪里以及何时使用它;什么是 Log4Net,使用适配器模式实现日志记录器,如何实现和添加自定义 SMTP appender 和配置。
应用程序设计
本主题的读者 - 应用程序架构师、开发人员
您将从主题中学到什么
如果您已经了解适配器模式,那么这不是为您准备的。无论如何,我猜您对 GOF 设计模式有初步了解。没有?如果没有,别担心。现在,我将介绍以下内容 –
适配器 -
- 什么是适配器模式
- 为什么我们需要
- 何时何地使用
Log4Net -
- 什么是 Log4Net
- 使用适配器模式实现日志记录器
- 如何实现和添加自定义 SMTP appender
- log4net.config 的配置
让我们深入了解基本概念
我的问题和认识
我正在开发一个项目,我需要一个第三方库。为什么?让我解释一下,我正在实现一个在线购物车来销售啤酒。客户将从我的网站购买产品。因此,如果在支付过程中发生任何事情,我需要知道错误日志。我的意思是,如果我的应用程序出现问题,我需要知道为什么会发生这种情况;这样,我就可以快速找出问题,如果我知道问题的原因,那么修复错误或错误等等就很容易了。
因此,我听说日志记录器可以解决我的问题。所以我需要一个日志记录器。
我很聪明,没有时间自己实现日志记录器。有许多第三方日志记录器。所以我计划使用第三方日志记录器。最后,我添加了一个。但问题是,如果我对第三方日志记录器说些什么,它不明白我在说什么。甚至,我无法控制修改它们的源代码。
所以我需要一个中间人来与我和第三方日志记录器沟通。
为什么需要适配器模式
我问你——为什么不使用适配器模式?你能在没有那个中间人的情况下解决我的问题吗?如果你能,你很聪明。但我不是,我懒得自己实现。
所以,如果我需要一个中间人来沟通我的功能和第三方库,而我无法控制修改它,那么我肯定会使用适配器模式。我不知道你会如何处理你的问题;那是你的麻烦。
什么是适配器模式
它就像两个不兼容接口之间的通信辅助桥梁。
它就像一个包装器。等等!包装器??我听说门面也是一个包装器,那么有什么区别呢?
门面 vs. 适配器模式
门面隐藏了子系统的复杂性。因此,它包装了多个对象,而适配器包装了一个对象。
更多…
等等!我还有另一个问题,Bridge 和 Adapter Pattern 或 Decorator 和 Adapter 有什么区别?
你问了两个问题。现在轮到你思考了…
日志工具
- Log4Net
- NLog
- Enterprise Library
- Logger.NET 等
什么是 Log4Net
它是一个很好的日志库,使用最广泛。您可以将错误相关消息记录到数据库或文件中,或通过电子邮件发送错误日志。它可配置且易于使用。
级别:它有 5 个级别,您可以从代码中调用。这些级别是 –
- Warn(警告)
- Debug
- Error(错误)
- Fatal(致命)
- 信息。
级别配置
Appender:在我的例子中,我将解释 3 个 appender -
- CustomSmtpAppender
- RollingLogFileAppender
- EventLogAppender
Log4Net vs. NLog
- 异步 appender 对于 Log4Net 来说很难;甚至,它在线程和任务方面也表现不佳。
- NLog 在这类问题上表现良好。
我们要做什么
现在我不需要比较哪个日志记录器最好。我已经决定在我的应用程序中使用 Log4Net。因此,我将使用 Log4Net 实现一个日志记录器。
从设计角度来看,我正在考虑适配器模式。
请注意 - 在此图中,Logger 类与 Log4Net 紧密耦合。因为我没有考虑未来。但将来,如果您想从 Log4Net 更改为 NLog 或其他,您可以在您的实现中使其松散耦合。思考!!
适配器模式
- 目标 (Target):客户端想要使用的接口。根据我们的类图,它是 ITargetAdapterForLogger 接口。
- 被适配者 (Adaptee):需要适配的实现。在这里,它是 Log4Net。
- 适配器 (Adapter):根据被适配者实现目标接口的类。在这里,它是 Logger 类。
- 请求 (Request):客户端需要的操作。在这里,它是 ClientDemo。
使用适配器模式实现日志记录器
为日志记录器创建项目
创建“Rony.Utility.LogMsg.AdapterPattern
”项目,如下所示 -
向项目添加引用
现在我将向“Rony.Utility.LogMsg.AdapterPattern
”项目添加 3 个引用,如下所示
- System.Deployment
- System.Web
- System.Windows.Forms
我需要这 3 个引用,因为我的项目中存在引用依赖。
如何将 Log4Net 添加到项目
步骤 1:右键单击(鼠标)项目 > 单击“管理 NuGet 包
”选项,如下所示 -
步骤 2:在左侧面板的搜索框中输入 Log4Net
,如下所示 -
步骤 3:单击 log4net 选项
,您将看到 Log4Net 安装
选项;单击安装
,如下所示 -
步骤 4 - 成功安装后,您会发现 Log4Net
引用已添加到项目引用文件夹中,如下所示 -
创建所需的类文件和接口
ITargetAdapterForLogger 接口
现在创建目标接口名称“ITargetAdapterForLogger.cs
”并声明其中方法和属性的签名。
Logger 类
创建 Logger.cs
类以实现 ITargetAdapterForLogger
接口的功能。
显示 Log4Net.Config 文件信息
我需要这个“log4net.config
”文件,因为配置参数都在这个文件中。有两种方法可以让项目知道我有一个 log4net.config
文件。
第一个选项:我可以将以下行添加到 AssemblyInfo.cs
文件中。
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile="log4net.config")]
第二个选项:我可以将以下行添加到 Logger.cs
文件中。
请记住 - 不要同时应用这两个选项;只使用一个选项。否则,您将收到编译错误。
我选择第二个选项;因为,如果我需要更改配置文件名,那么我会忘记我已经将配置信息添加到了 AssemblyInfo 中。
在这个 Rony.Utility.LogMsg.AdapterPattern
项目中,我添加了一个 log4net.config
文件。但您不需要添加它。我添加它是为了,如果我创建客户端项目,那么我将从那里复制配置到这里;否则,我会忘记将此文件添加到客户端项目中。
CustomSmtpAppender 模型类
“log4net.Appender.BufferingAppenderSkeleton
”将继承到此类中;我需要这个文件,因为我想通过电子邮件发送错误相关的日志文件。
创建演示项目
正在创建 Rony.Utility.LogMsg.AdapterPattern.Demo.Client
以查看日志记录器结果。
现在我将“Rony.Utility.LogMsg.AdapterPattern.Demo.Client
”作为引用添加到此项目中。
添加 log4net.config 文件
步骤 1:将配置文件添加到您的项目中。
步骤 2:选择 log4net.config
。现在转到属性并从“复制到输出目录
”中选择“如果较新则复制
”。
在此配置文件中,我添加了 3 个 appender。
- CustomSmtpAppender
- RollingLogFileAppender
- EventLogAppender
在 Log4net.config 中配置 RollingLogFileAppender
要启用 RollingLogFileAppender
,请找到 <root>
标签并启用
或禁用
调试或信息等级别。我已启用所有级别,如下所示 -
将文件名添加到 appender <file value="Logs\RonyUtilityLog" />
中,如下所示 -
创建 Logger 对象
在“Program.cs
”文件中,我创建了一个 Logger 实例。我调用了 logger
,如下所示 -
演示时间!!
现在运行控制台应用程序,您将看到如下所示 -
最后,转到客户端项目的位置,例如“…\ bin\Debug\Logs
”。您将找到日志文件,如下所示 -
哇!!我已经完成了实现。我太高兴了。
如果您不需要 CustomSmtpAppender 和 EventLogAppender,那么这对您来说就是结束。我已经添加了项目和源代码;请查看附件。
在 Log4net.config 中配置 CustomSmtpAppender
步骤 1:如果您想使用 CustomSmtpAppender
,请不要忘记添加您的程序集名称“Rony.Utility.LogMsg.AdapterPattern
”和 CustomSmtpAppender 的文件名的命名空间,如下所示 -“Rony.Utility.LogMsg.AdapterPattern.CustomSmtpAppender
”
步骤 2:将电子邮件相关信息添加到 CustomSmtpAppender
中
- 设置为“
true
”以启用错误日志的电子邮件发送,否则,设置为false
。
<enableEmailSent value="true"/>
- 对于多个收件人电子邮件地址,请使用 ';'
<to value="somebody@gmail.com; somebody@yahoo.com" />
- 还要配置 smtpHost、smtpPort、subject 等其他必需值。
在 Log4net.config 中配置 EventLogAppender
如果您将 ASP.NET 应用程序托管在 IIS 中,则下面提供了两种配置选项
- 更改应用程序池:以 LocalSystem 身份运行应用程序池
- 或设置应用程序名称,添加注册表项
以 LocalSystem 身份运行应用程序池
双击应用程序池 > ASP.NET v4.0 Classic >
转到右侧的“操作”面板 >“高级应用程序池”>“高级设置”>“进程模型”>“身份”> 将 ApplicationPoolIdentity 更改为 LocalSystem
设置应用程序名称,添加注册表项
步骤 1:点击“开始”
步骤 2:在搜索框或“运行”窗口中,输入以下内容
regedit,然后按 Enter。
步骤 3:转到
“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\
”
步骤 4:创建一个注册表项,名称为 YourAppSystem,它将是
“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\YourAppSystem
”
步骤 5:在此项中创建一个字符串值,命名为 EventMessageFile,并将其值设置为
“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll
”
请注意 YourAppSystem 是 EventLogAppender 中的 ApplicationName。
我喜欢在我的项目中使用模式和原则。如果我拥有知识,但无法将其应用到我的项目中,那么我不需要那些无用的知识。
你呢...??