【发布时间】:2012-02-03 07:47:05
【问题描述】:
我想我错过了什么。我在类库 dll 中编写了一个自定义 log4net 附加程序,所以我想我也应该通过它公开 log4net。这样其他人只需添加带有 log4net 的单个日志记录类库,他们就可以获得自定义附加程序。
我需要包装 log4net 来执行此操作还是有其他方法可以公开它?
【问题讨论】:
我想我错过了什么。我在类库 dll 中编写了一个自定义 log4net 附加程序,所以我想我也应该通过它公开 log4net。这样其他人只需添加带有 log4net 的单个日志记录类库,他们就可以获得自定义附加程序。
我需要包装 log4net 来执行此操作还是有其他方法可以公开它?
【问题讨论】:
【讨论】:
我更喜欢封装 log4net 并为所有日志记录需求提供单点入口。 例如。
我的界面会是这样的
public interface ICustomLogger : ILog
{
}
我的记录器类将是这样的。
public class CustomLogger : ICustomLogger
{
private ILog log4netLogger;
public TMALogger(ILog logger)
{
log4netLogger = logger;
}
//Plus all the methods that you would need to implement for ICustomLogger
}
LogManager 会是这样的。
public class LogManager
{
public static ICustomLogger GetLogger(Type type)
{
ICustomLogger logger = null;
try
{
ILog log4netLogger = log4net.LogManager.GetLogger(type);
CustomLogger customLogger = new CustomLogger(log4netLogger);
logger = customLogger;
}
catch (Exception ex)
{
logger = null;
}
return logger;
}
}
最后记录器将在类中使用
private readonly ICustomLogger _logger = LogManager.GetLogger(typeof(ClassName));
我希望这会有所帮助。
【讨论】:
如果您编写了一个 appender,您需要做两件事才能使用它:配置它(像任何其他 appender 一样)并确保您的程序集已部署。
为了配置它,您需要在 log4net 配置中的某个地方为您的 appender 设置一个块:
<appender name="YourCustomAppenderName" type="YourAssemblyNameSpace.YourAppenderType">
....
</appender>
根据我的经验,当您 fully qualify 您的程序集时效果最好,但这并不是绝对必要的。第二部分可以由安装程序完成,但一种可能有点粗略但非常有效的方法是在应用程序中创建对 appender 程序集的引用。这样程序集将始终被复制到输出目录。
为此不需要编写包装器。编写包装器可能是有原因的,但如果您希望能够拥有附加功能(例如接受附加参数的方法),则应该这样做。包装器的另一个原因可能是您可以用其他东西替换 log4net(尽管更新所有配置文件仍然需要一些工作)
【讨论】: