【发布时间】:2010-07-06 19:12:02
【问题描述】:
我有一个自定义日志系统,它允许我根据当前选择的详细程度将信息发送到日志文件和控制台。现在,我遇到的问题是文件的输出,控制台的输出工作正常。
这是一个例子:
ilra_talk << "Local IP: " << systemIP() << " | Hostname: " << systemhostname() << endl;
// the systemIP() and systemhostname() functions have already been defined
这应该会导致系统的当前本地 IP 和主机名被打印到文件中。然而,它只会导致信息被打印到控制台,尽管函数是如何重载导致它打印到两者的。
我已经概述了下面的代码。感谢任何帮助(一如既往)。
当前存在 ilra_talk 的定义,这会导致创建新的类对象:
#define ilra_talk ilra(__FUNCTION__,0)
类定义如下:
class ilra
{
static int ilralevel_set; // properly initialized in my main .cpp
static int ilralevel_passed; // properly initialized in my main .cpp
static bool relay_enabled; // properly initialized in my main .cpp
static bool log_enabled; // properly initialized in my main .cpp
static ofstream logfile; // properly initialized in my main .cpp
public:
// constructor / destructor
ilra(const std::string &funcName, int toset)
{
ilralevel_passed = toset;
}
~ilra(){};
// enable / disable irla functions
static void ilra_verbose_level(int toset){
ilralevel_set = toset;
}
static void ilra_log_enabled(bool toset){
log_enabled = toset;
if (log_enabled == true){
// get current time
time_t rawtime;
time ( &rawtime );
// name of log file (based on time of application start)
stringstream logname_s;
string logname = "rclient-";
logname_s << rawtime;
logname.append(logname_s.str());
// open a log file
logfile.open(logname.c_str());
}
}
// output
template <class T>
ilra &operator<<(const T &v)
{
if(log_enabled == true){ // log_enabled is set to true
logfile << v;
logfile << "Test" << endl; // test will show up, but intended information will not appear
}
if(ilralevel_passed <= ilralevel_set)
std::cout << v;
return *this;
}
ilra &operator<<(std::ostream&(*f)(std::ostream&))
{
if(log_enabled == true) // log_enabled is set to true
logfile << *f;
if(ilralevel_passed <= ilralevel_set)
std::cout << *f;
return *this;
}
}; // end of the class
【问题讨论】:
-
日志文件输出是什么样的?控制台输出是什么样的?
-
@Adam 除了我为确保日志文件设置正确而添加的“测试”语句外,日志输出不会显示任何内容。控制台会显示这个(针对上面的特定语句):本地 IP:192.168.144.128 |主机名:localhost.localdomain
标签: c++ logging file-io operator-overloading