C++语言编写写日志类_C 语言

使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。
主要提供以下接口:

  • 1、设置写日志的级别
  • 2、写关键日志信息
  • 3、写错误日志信息
  • 4、写警告日志信息
  • 5、写一般日志信息
#ifndef COMMAND_DEFINE_H
#define COMMAND_DEFINE_H
//日志级别的提示信息
static const char * KEYINFOPREFIX = " Key: \n";
static const char * ERRORPREFIX = " Error: \n";
static const char * WARNINGPREFIX = " Warning: \n";
static const char * INFOPREFIX  = " Info: \n";

static const int MAX_STR_LEN = 1024;
//日志级别枚举
typedef enum EnumLogLevel
{
 LogLevelAll = 0, //所有信息都写日志
 LogLevelMid,  //写错误、警告信息
 LogLevelNormal,  //只写错误信息
 LogLevelStop  //不写日志
};

#endif
#ifndef LOGGER_H_
#define LOGGER_H_
#include <Windows.h>
#include <stdio.h>
#include "CommandDefine.h"
/*
 * 类名:Logger
 * 作用:提供写日志功能,支持多线程,支持可变形参数操作,支持写日志级别的设置
 * 接口:SetLogLevel:设置写日志级别
   TraceKeyInfo:忽略日志级别,写关键信息
   TraceError:写错误信息
   TraceWarning:写警告信息
   TraceInfo:写一般信息
*/
class Logger
{
public:
 //默认构造函数
 Logger();
 //构造函数
 Logger(const char * strLogPath, EnumLogLevel nLogLevel = EnumLogLevel::LogLevelNormal);
 //析构函数
 virtual ~Logger();
public:
 //写关键信息
 void TraceKeyInfo(const char * strInfo, ...);
 //写错误信息
 void TraceError(const char* strInfo, ...);
 //写警告信息
 void TraceWarning(const char * strInfo, ...);
 //写一般信息
 void TraceInfo(const char * strInfo, ...);
 //设置写日志级别
 void SetLogLevel(EnumLogLevel nLevel);
private:
 //写文件操作
 void Trace(const char * strInfo);
 //获取当前系统时间
 char * GetCurrentTime();
 //创建日志文件名称
 void GenerateLogName();
 //创建日志路径
 void CreateLogPath();
private:
 //写日志文件流
 FILE * m_pFileStream;
 //写日志级别
 EnumLogLevel m_nLogLevel;
 //日志的路径
 char m_strLogPath[MAX_STR_LEN];
 //日志的名称
 char m_strCurLogName[MAX_STR_LEN];
 //线程同步的临界区变量
 CRITICAL_SECTION m_cs;
};

#endif
#include "Logger.h"
#include <imagehlp.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>

#pragma comment(lib, "DbgHelp.lib")

//默认构造函数
Logger::Logger()
{
 //初始化
 memset(m_strLogPath, 0, MAX_STR_LEN);
 memset(m_strCurLogName, 0, MAX_STR_LEN);
 m_pFileStream = NULL;
 //设置默认的写日志级别
 m_nLogLevel = EnumLogLevel::LogLevelNormal;
 //初始化临界区变量
 InitializeCriticalSection(&m_cs);
 //创建日志文件名
 GenerateLogName();
}

//构造函数
Logger::Logger(const char * strLogPath, EnumLogLevel nLogLevel):m_nLogLevel(nLogLevel)
{
 //初始化
 m_pFileStream = NULL;
 strcpy(m_strLogPath, strLogPath);
 InitializeCriticalSection(&m_cs);
 CreateLogPath();
 GenerateLogName();
}

//析构函数
Logger::~Logger()
{
 //释放临界区
 DeleteCriticalSection(&m_cs);
 //关闭文件流
 if(m_pFileStream)
  fclose(m_pFileStream);
}

//写关键信息接口
void Logger::TraceKeyInfo(const char * strInfo, ...)
{
 if(!strInfo)
  return;
 char pTemp[MAX_STR_LEN] = {0};
 strcpy(pTemp, GetCurrentTime());
 strcat(pTemp, KEYINFOPREFIX);
 //获取可变形参
 va_list arg_ptr = NULL;
 va_start(arg_ptr, strInfo);
 vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr);
 va_end(arg_ptr);
 //写日志文件
 Trace(pTemp);
 arg_ptr = NULL;

}

//写错误信息
void Logger::TraceError(const char* strInfo, ...)
{
 //判断当前的写日志级别,若设置为不写日志则函数返回
 if(m_nLogLevel >= EnumLogLevel::LogLevelStop)
  return;
 if(!strInfo)
  return;
 char pTemp[MAX_STR_LEN] = {0};
 strcpy(pTemp, GetCurrentTime());
 strcat(pTemp, ERRORPREFIX);
 va_list arg_ptr = NULL;
 va_start(arg_ptr, strInfo);
 vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr);
 va_end(arg_ptr);
 Trace(pTemp);
 arg_ptr = NULL;
}

//写警告信息
void Logger::TraceWarning(const char * strInfo, ...)
{
 //判断当前的写日志级别,若设置为只写错误信息则函数返回
 if(m_nLogLevel >= EnumLogLevel::LogLevelNormal)
  return;
 if(!strInfo)
  return;
 char pTemp[MAX_STR_LEN] = {0};
 strcpy(pTemp, GetCurrentTime());
 strcat(pTemp, WARNINGPREFIX);
 va_list arg_ptr = NULL;
 va_start(arg_ptr, strInfo);
 vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr);
 va_end(arg_ptr);
 Trace(pTemp);
 arg_ptr = NULL;
}

//写一般信息
void Logger::TraceInfo(const char * strInfo, ...)
{
 //判断当前的写日志级别,若设置只写错误和警告信息则函数返回
 if(m_nLogLevel >= EnumLogLevel::LogLevelMid)
  return;
 if(!strInfo)
  return;
 char pTemp[MAX_STR_LEN] = {0};
 strcpy(pTemp, GetCurrentTime());
 strcat(pTemp,INFOPREFIX);
 va_list arg_ptr = NULL;
 va_start(arg_ptr, strInfo);
 vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr);
 va_end(arg_ptr);
 Trace(pTemp);
 arg_ptr = NULL;
}

//获取系统当前时间
char * Logger::GetCurrentTime()
{
 time_t curTime;
 struct tm * pTimeInfo = NULL;
 time(&curTime);
 pTimeInfo = localtime(&curTime);
 char temp[MAX_STR_LEN] = {0};
 sprintf(temp, "%02d:%02d:%02d", pTimeInfo->tm_hour, pTimeInfo->tm_min, pTimeInfo->tm_sec);
 char * pTemp = temp;
 return pTemp;
}

//设置写日志级别
void Logger::SetLogLevel(EnumLogLevel nLevel)
{
 m_nLogLevel = nLevel;
}

//写文件操作
void Logger::Trace(const char * strInfo)
{
 if(!strInfo)
  return;
 try
 {
  //进入临界区
  EnterCriticalSection(&m_cs);
  //若文件流没有打开,则重新打开
  if(!m_pFileStream)
  {
   char temp[1024] = {0};
   strcat(temp, m_strLogPath);
   strcat(temp, m_strCurLogName);
   m_pFileStream = fopen(temp, "a+");
   if(!m_pFileStream)
   {
    return;
   }
  }
  //写日志信息到文件流
  fprintf(m_pFileStream, "%s\n", strInfo);
  fflush(m_pFileStream);
  //离开临界区
  LeaveCriticalSection(&m_cs);
 }
 //若发生异常,则先离开临界区,防止死锁
 catch(...)
 {
  LeaveCriticalSection(&m_cs);
 }
}

//创建日志文件的名称
void Logger::GenerateLogName()
{
 time_t curTime;
 struct tm * pTimeInfo = NULL;
 time(&curTime);
 pTimeInfo = localtime(&curTime);
 char temp[1024] = {0};
 //日志的名称如:2013-01-01.log
 sprintf(temp, "%04d-%02d-%02d.log", pTimeInfo->tm_year+1900, pTimeInfo->tm_mon + 1, pTimeInfo->tm_mday);
 if(0 != strcmp(m_strCurLogName, temp))
 {
  strcpy(m_strCurLogName,temp);
  if(m_pFileStream)
   fclose(m_pFileStream);
  char temp[1024] = {0};
  strcat(temp, m_strLogPath);
  strcat(temp, m_strCurLogName);
  //以追加的方式打开文件流
  m_pFileStream = fopen(temp, "a+");
 }

}

//创建日志文件的路径
void Logger::CreateLogPath()
{
 if(0 != strlen(m_strLogPath))
 {
  strcat(m_strLogPath, "\\");
 }
 MakeSureDirectoryPathExists(m_strLogPath);
}

以上就是本文的全部内容,希望对大家的学习C++有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
日志
java 日志埋点编写、java log日志编写、perl编写日志分析脚本、java编写hdfs日志、java编写日志,以便于您获取更多的相关知识。

时间: 2024-09-24 04:36:55

C++语言编写写日志类_C 语言的相关文章

使用C语言编写圣诞表白程序_C 语言

快到圣诞节啦,男票女票都有了嘛?没有的话,有没有喜欢的女孩子或者男孩子啊?今天就给你们分享一个圣诞节的表白程序,希望你们喜欢咯,效果是这样的: 圣诞节快到了,让我们用C语言制作一个圣诞表白程序 具体代码如下咯: // GreetingCardDemoDlg.cpp : 实现文件 // #include "stdafx.h" #include "GreetingCardDemo.h" #include "GreetingCardDemoDlg.h"

把c++语言转换成c语言-如何把C++语言编写的代码转换成C语言

问题描述 如何把C++语言编写的代码转换成C语言 #include <stdlib.h>#include <stdio.h> #include <string.h>#include <conio.h>#include <iostream.h>#define N 50 //系统中学生的最大数量int n=3; //学生数量的初始值struct student { int sid; char name[10]; char num[14]; float

c++制作的时间函数类_C 语言

实现类的定义,以及调用 Clock时间类的头文件Clock.h //#pragma once #ifndef _CLOCK_H_ #define _CLOCK_H_ class Clock { public: void Init(int hour, int minute, int second); void Display(); void Update(); int GetHour(); int GetMinute(); int GetSecond(); void SetHour(int hou

C实现与 uint64_t 相同功能的类_C 语言

实现与 uint64_t 相同的类,如果平台不支持 uint64_t 的话,可以代替之. 目前只完成部分功能,其他功能敬请期待. uint64.hpp #include <endian.h> #include <cstdint> #include <type_traits> #include <array> #define MC_BEGIN_NAMESPACE namespace mc { #define MC_END_NAMESPACE } MC_BEGI

C语言转义字符实例详解_C 语言

在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么.这类字符称为可显示字符,如a.b.c.$.+和空格符等都是可显示字符. 另一类字符却没有这种特性.它们或者在键盘上找不到对应的一个键(当然可以用特殊方式输入),或者当按键以后不能显示键面上的字符.其实,这类字符是为控制作用而设计的,故称为控制字符. 在C语言中,构成字符常量的控制字符必须用转义字符表示.转义字符是一种以"\"开头的字符.例如退格符用'\b'表示,换行符用'\

C语言指针入门学习面面观_C 语言

这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,

linux下基于C语言的信号编程实例_C 语言

本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

C语言读写配置文件的方法_C 语言

本文实例讲述了C语言读写配置文件的方法.分享给大家供大家参考.具体如下: CException.h如下: /************************************************************************/ /* make0000@msn.com */ /************************************************************************/ /***********************

C语言实现程序开机自启动_C 语言

程序比较简单,用到了C语言获得自身路径和系统路径,修改注册表项等,某些函数不理解可以查看MSDN #include<stdio.h> #include<windows.h> char *GetFilename(char *p) //得到一个路径的纯文件名 { int x=strlen(p); char ch='\\'; char *q=strrchr(p,ch); return q; } int main() { char *filepath; char modlepath[256