XmlConfigurator.ConfigureAndWatch(): 这是一个log4net库提供的方法,用于动态配置log4net日志记录器。它通过读取一个log4net配置文件,如XML文件,来配置日志系统。这个方法还会启动一个后台线程,监视配置文件的更改,当配置文件更改时,重新加载配置信息,从而使得日志系统可以动态地改变日志的输出行为。
举例说明:假设有一个项目使用log4net记录日志,配置文件为log4net.config,使用XmlConfigurator.ConfigureAndWatch(new FileInfo(“log4net.config”))方法可以让log4net实时监测配置文件是否发生更改。
LogHelperBridge.UpdateSaveDirectory(“”): 这是一个日志记录器的工具类,用于更新日志保存路径。它通常是一个桥接类,将具体的日志记录器类和日志系统的管理器进行解耦。通过该方法,可以在不修改日志记录器类的情况下,动态更改日志保存路径。
举例说明:假设有一个Web应用程序,在每次用户访问网站时,需要记录访问日志。使用LogHelperBridge.UpdateSaveDirectory(“D:\Logs”)方法,可以将日志保存到D盘的Logs目录下。
LogHelper.UpdateSaveDirectory(): 这是一个具体的日志记录器类,它封装了log4net库的API,提供了更加便捷的日志记录方式。通过该类,可以实现日志记录的级别、格式、输出目的地等多种定制化。
举例说明:在Web应用程序中,可以通过LogHelper.Info(“User Access Web Site!”)方法记录一条信息级别的日志,内容为“用户访问网站”。
LogManager 类是 log4net 框架的核心类,用于管理日志记录器。GetLogger 方法根据参数类型返回一个 ILogger 接口的实例,这个实例就是用于记录日志的对象。ILog 接口是 ILogger 接口的一个包装器,它提供了一些额外的功能,比如定义了更简单的日志级别,以及写日志信息的方法。
举个例子,如果一个项目有多个类需要记录日志,我们可以在每个类中都使用 GetLogger 方法获取一个记录器对象,然后根据需要写入日志信息。例如:
public class MyClass
{
private readonly ILog log = LogManager.GetLogger(typeof(MyClass));
public void DoSomething()
{
log.Info("Method DoSomething called.");
// do something
log.Debug("Method DoSomething finished.");
}
}
这个示例中,MyClass 类中有一个 DoSomething 方法需要记录日志。在类的构造函数中使用 GetLogger 方法创建了一个 ILog 类型的 log 对象。然后在 DoSomething 方法中使用 log 对象写入了两条日志信息,一条是 INFO 级别的,一条是 DEBUG 级别的。
在CAD实现日志记录:
- 在 Visual Studio 中,打开 C#Cad 项目。
- 在解决方案资源管理器中,右键单击您的项目并选择“管理 NuGet 包”。
- 在 NuGet 管理器中,搜索并安装 log4net 包。
- 在代码中添加 using 声明以导入 log4net 命名空间。
- 在代码中,初始化 log4net。可以使用以下代码:
using log4net;
using log4net.Config;
// ...
XmlConfigurator.Configure(); // 初始化 log4net
ILog log = LogManager.GetLogger(typeof(YourClassName));
- 在的代码中,使用 log4net 记录您想要记录的操作。可以使用以下代码:
log.Info("Your message here");
还可以使用其他日志级别,例如 Debug、Warn、Error 和 Fatal。
- 在项目中,添加一个 log4net 配置文件。该文件指定日志输出位置、格式等配置。以下是一个示例 log4net 配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\mylog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
该配置文件指定将日志输出到控制台和一个名为“mylog.txt”的文件中。
- 在代码中,添加以下行以读取 log4net 配置文件:
XmlConfigurator.Configure(new FileInfo("log4net.config"));
完整代码示例:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
namespace App
{
public class AppStart
{
private readonly ILog log = LogManager.GetLogger(typeof(AppStart));
static AppStart()
{
XmlConfigurator.Configure(new FileInfo("log4net.config"));
}
[CommandMethod("CreateDemo")]
public void CreateDemo()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
using (doc.LockDocument())
{
Application.ShowAlertDialog("Hello!");
log.Info($"方法:{nameof(CreateDemo)}" );
string logFilePath = Path.Combine(AppDomain.CurrentDomain.ass,"logs","mylogs.txt");
if (File.Exists(logFilePath))
{
Application.ShowAlertDialog($"日志生成成功,路径:{logFilePath}");
}
else
{
Application.ShowAlertDialog("日志生成失败!");
}
}
}
}
}
private readonly ILog log = LogManager.GetLogger(typeof(AppStart)); 这行代码的意思是创建一个 log 对象,它的类型是 ILog 接口,它使用 LogManager 类的 GetLogger 方法获取一个 AppStart 类型的日志记录器对象。
编写配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="mylog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
以上是一个 log4net 配置文件的示例。该文件指定了两个附加器 (appender),分别是 ConsoleAppender 和 RollingFileAppender。
ConsoleAppender 指定将日志输出到控制台。其中,PatternLayout 用于指定日志输出的格式。该示例中使用的格式是:
%date [%thread] %-5level %logger - %message%newline
该格式中包含以下转换字符:
%date:输出日期和时间。
[%thread]:输出线程 ID。
%-5level:输出日志级别(这里的“-”表示左对齐,5 表示最大宽度为 5 个字符)。
%logger:输出记录日志的类名。
-%message%newline:输出日志消息并换行。
RollingFileAppender 指定将日志输出到名为“mylog.txt”的文件中。其中,rollingStyle 指定以日期方式滚动日志文件(即每天生成一个新文件),datePattern 指定文件名日期格式为“yyyyMMdd”。
最后,root 元素指定根日志记录器的配置。level 元素指定日志级别(ALL 表示记录所有级别的日志),appender-ref 元素指定要使用的附加器。在本示例中,同时使用了 ConsoleAppender 和 RollingFileAppender。