我的应用程序的不同部分调用记录器功能来记录详细信息。
记录器类
std::string filename = "blahblah"; // variable to store the location of the properties file
log4cpp::PropertyConfigurator::configure(filename);
void Logger::logging(const std::string& msg)
{
Log4cpp::Category& myLogger = log4cpp::Category::getRoot();
myLogger.log(log4cpp::Priority::INFO, msg);//only takes in string as input
}
致电课程
Logger logMe;
int a = 5;
double b = 6;
logMe.logging("log this msg" + a + "," + b);
我意识到上面的内容会给我错误,因为a
和b
属于不同类型。解决问题的一种方法是使用std::to_string
logMe.logging("log this msg" + std::to_string(a) + "," + std::to_string(b));
但是,我有数百次调用日志记录功能,编辑std::to_string
的每次调用都会非常耗时。是否有更简单的方法可以做到这一点?
哦,澄清一下,代码之前的工作原理是定义一个#define函数。
#Define logging(FLAG, X)\
do {\
...
clog << x; \
}while(0)
logging(LogFlag::Warning, "log this msg" << a << "," << b << endl);
但我现在正在重写部分代码以符合静态测试。
提前致谢。
答案 0 :(得分:5)
您可以使用logging
std::stringstream
重载并将其连接成一个字符串
在c ++ 17中,我们可以使用fold expression,例如
template <typename Args ...>
void Logger::logging(Args ... args)
{
std::stringstream ss;
(ss << ... << args);
Log4cpp::Category& myLogger = log4cpp::Category::getRoot();
myLogger.log(log4cpp::Priority::INFO, ss.str());
}
在c ++ 11或14中,我们必须是slightly more tricky
template <typename ... Args >
void Logger::logging(Args ... args)
{
std::stringstream ss;
std::initializer_list<int> unused{ (ss << args, 0)... };
Log4cpp::Category& myLogger = log4cpp::Category::getRoot();
myLogger.log(log4cpp::Priority::INFO, ss.str());
}
然后你打电话为例如。
logMe.logging("log this msg", a, ",", b);
答案 1 :(得分:4)
我建议在课程中添加operator<<()
class Logger
{
public:
Logger &operator<<(const std::string &s)
{
logging(s)
return *this;
};
Logger &operator<<(const char *s)
{
return operator<<(std::string(s));
}
template <class T>
Logger &operator<<(const T &v)
{
std::ostringstream s;
s << v;
return operator<<(logging(ss.str()));
};
// other stuff you have in your class, including the logging() function
};
// to use
logMe << "log this msg" << a << b;
使用它的语法与您所描述的完全相同,但它更常用。
答案 2 :(得分:3)
使用stringstream
相当容易。然后,您可以使用std::string
将其转换为str()
。
#include <sstream>
...
int a = 5;
double b = 6;
std::stringstream ss;
ss << "log this msg" << a << b;
std::cout << ss.str() << std::endl;
logMe.logging(ss.str());