C++ Log File Class

来源:互联网 发布:plc编程及应用第4版pdf 编辑:程序博客网 时间:2024/06/02 21:01

C++ can become verydifficult to use especially with large projects where you can't seeall the variables. Here's a very simple C++ logging class that can takelogs for your softwarewithout any effort. This will make you a better programmer as you won't have to rely ondebuggers like inMicrosoft's Visual Studio.


First you should create a project, with files like log.h and log.cpp. Let's show you the log.hfile:

#include<fstream>

using namespace std;

class Log {
  public:
    Log(char*filename);
    ~Log();
    void Write(char*logline);
  private:
    ofstream m_stream;
};

I included fstream forofstream (which is anoutput file stream).

The logging class is called Log, it has one private (non-accessible variable bynon-class-members) member called m_stream which will be thefile stream to write ourlogs.

I have 3 functions, one constructor called Log, which takes achar pointer input filename, and a destructor ~Log to close ourfile and avoid memory leaks, and finally a void Write functionwhich will take a logline char pointer.

Here's the log.cpp file:

#include "log.h"

Log::Log(char*filename) {
  m_stream.open(filename);
}

void Log::Write(char*logline){
  m_stream << logline<<endl;
}

Log::~Log(){
  m_stream.close();
}

I included the log.h, then defined the implementation for the 3functions.

The constructor will open the file delivered by filename on ourstream.

The Write function will take a string and write it to the logusing << operator, and will add a newline (endl) to the end of each call.

~Log the destructor will close the stream.

This really helps with debugging, so now I'll demonstrate how itcan be used in a project. Of course the code can be improved sothat you write less code in your main project.

#include "log.h"
#include<cstdlib>

int main(){
  Log*pLog = newLog("errors.log");
  pLog->Write("Going intoour loop");
  for(int i= 0; i < 10; i++){
    char c[50];
    sprintf(c, "Looped:%d times", i);
    pLog->Write(c);
  }
  return0;
}

I created a Log class pointer, with the parameter "errors.log"which will be my error logs file.

I call Write to write a line of errors to my log.

If you need to include integers or other variable types, it maybe an idea to use sprintf to add the integer i to a char, which youcan then write to your log.


 

Variadic Functions

If you want to avoid using sprintf, and just using Write withva_list, or variadic argument lists:

pLog->Write("Looped: %dtimes!", i);// no sprintf needed!

Using the following modification to Write function, you cancreate a C++ variadicfunction. This should allow you to avoid using sprintf everytime.

#include<stdarg.h>

void Log::Write(constchar* logline, ...){
  va_listargList;
  charcbuffer[1024];
  va_start(argList, logline);
  vsnprintf(cbuffer, 1024, logline, argList);
  va_end(argList);
  m_stream << cbuffer<<endl;
}

You can also modify it further, by adding time stamps and I havedone this.
Add the time.h and program.

voidSDRLog::Write(const char* logline, ...)
{
  va_listargList;
  charcbuffer[1024];
  va_start(argList,logline);
  vsnprintf(cbuffer, 1024,logline, argList);
 va_end(argList);

  charbuff[100];
  time_t now =time(0);
  struct tm*sTm;
  sTm =localtime(&now);//gmtime(&now);
  strftime(buff,sizeof(buff), "%Y-%m-%d %H:%M:%S", sTm);
  
  m_stream<< buff;
  m_stream<< ": ";
  m_stream<< cbuffer<< endl;
} 

now this code works well.