У меня есть настраиваемая система ведения журнала, которая позволяет мне отправлять информацию в файл журнала и консоль в зависимости от выбранного в данный момент многословия. Прямо сейчас, проблема, с которой я столкнулась, связана с выходом в файл, с выходом на консоль, работающим нормально.Перенаправление ostream в файл не работает
Вот пример:
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 Выход журнала не покажет ничего, кроме оператора «Test», который я добавил, чтобы убедиться, что файл журнала настроен правильно. Консоль покажет это (для конкретного заявления выше): Локальный IP: 192.168.144.128 | Имя хоста: localhost.localdomain – BSchlinker