C:记录器设计,行/函数信息作为函数参数
发布时间:2020-12-16 09:44:51 所属栏目:百科 来源:网络整理
导读:我的应用程序有一个简单的记录器.这是一个(简化的)界面: class ILogger{public: virtual void LogUnsafe(const LogPriority priority,const boost::format message) = 0; virtual void Log(const LogPriority priority,const boost::format message) { if (
我的应用程序有一个简单的记录器.这是一个(简化的)界面:
class ILogger { public: virtual void LogUnsafe(const LogPriority& priority,const boost::format& message) = 0; virtual void Log(const LogPriority& priority,const boost::format& message) { if (priority <= logPriority_) { std::unique_lock<std::mutex> lock(loggerMutex_); LogUnsafe(priority,message); } } void Log(const LogPriority& priority,const std::string& message) { Log(priority,boost::format(message)); } template<typename T,typename... Args> void Log(const LogPriority& priority,boost::format &format,const T &v,Args... args) { Log(priority,boost::format(format) % v,args ...); } template<typename... Args> void Log(const LogPriority& priority,const char *format,Args... args) { boost::format fmt(format); Log(priority,fmt,args ...); } }; 现在我需要(为了便于错误检测)在每条日志消息中包含行和函数信息(使用__LINE__和__FUNCTION__).合理地它应该作为函数参数传递.而且,像往常一样,我不希望每次写日志消息时都键入所有这些宏.所以我在这里遇到了麻烦.如何在没有在每条日志消息中明确写入它的情况下优雅地将它们传递给日志记录功能? 提前致谢. 解决方法
我发现执行此操作的“最好”方法是使用通过宏创建的日志对象,如上所述.关于它的“好”之处在于它封装了站点上可用的所有信息,因此可以将其传递给不同的记录器.例如,您可以拥有一系列“记录器”,通过网络发送它,将其发送到磁盘和系统监视器(如Windows事件日志).此外,您还可以使用生产者 – 消费者日志记录线程来提高性能.
class LogEntry{ LogEntry(const boost::format& traceMsg,const unsigned int lineNumber,const std::string& file){ //set members } std::string print(){ // Do print logic... } // Getters... Allow the logger instance build its own log from the info. } 然后使用宏: #define LOG( format ) sendToLogQueue( LogEntry( format,__LINE__,std::string(__FILE__) ) ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |