如何在F#中实现log4net单例独立类?
F# 实现全局单例log4net日志类
转换思路
- C#中
static readonly的日志实例,在F#里可以通过模块级别的let绑定实现(F#模块默认是静态全局的,天然符合单例+全局调用的需求) - 替换C#里
MethodBase.GetCurrentMethod().DeclaringType的类型获取方式,直接用typeof<Logger>获取当前日志模块的类型,更符合F#语法习惯 - F#模块级别的let绑定是惰性初始化且线程安全的,正好满足单例实例只初始化一次的要求
完整实现代码
全局日志模块
namespace MyNamespace open log4net /// 全局可调用的单例日志模块 module Logger = // 惰性初始化的单例日志实例,对应C#的static readonly字段 let private log = LogManager.GetLogger(typeof<Logger>) // 封装常用日志方法,直接对外暴露 let debug message = log.Debug(message) let info message = log.Info(message) let warn message = log.Warn(message) let error message = log.Error(message) let fatal message = log.Fatal(message) // 带异常参数的重载方法 let errorWithEx message ex = log.Error(message, ex) let fatalWithEx message ex = log.Fatal(message, ex)
启动配置(结合你已有的代码)
在控制台应用入口处先执行日志配置初始化:
open MyNamespace [<EntryPoint>] let main argv = // 加载log4net配置 LoggerConfigure.configureLogging() // 测试全局日志调用 Logger.Info("应用启动完成") Logger.Error("测试错误日志输出") 0
关键说明
- 模块内的
log是私有惰性绑定,只会在第一次调用日志方法时初始化,天然保证单例特性 - 对外暴露封装好的日志方法,避免直接操作
ILog实例,使用更简洁直观 - 如果后续需要为不同类生成独立日志实例,可以在模块中扩展
getLogger (typ: System.Type)方法,但全局单例场景下默认实例足以满足需求
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

