用c造一个日志记录的轮子

 

一、前言

有现成的C库为什么要自己造轮子呢?我发现大家对造轮子情有独钟呀,所以我也来试一试,免得被C圈里面的人排挤.

二、上代码

  1. 头文件logger.h

    #ifndef LOGGER_H_
    #define LOGGER_H_
       
    #include <Windows.h>
    #include <tchar.h>
    #include <stdio.h>
       
    #if !defined(LOG_TAG)
    #define LOG_TAG          L"NO_TAG"
    #endif
       
    #include <stdarg.h>
    #include <time.h>
       
    #define __STR2WSTR(str) L##str
    #define _STR2WSTR(str) __STR2WSTR(str)
    #define __FUNCTIONW__ _STR2WSTR(__FUNCTION__)
       
       
    /*日志级别枚举类型*/
    enum Level { L_DEBUG, L_INFO, L_ERROR };
    /*打印debug级别的日志*/
    #define log_d(...) PrintLog(L_DEBUG,LOG_TAG,__FUNCTIONW__,__LINE__,__VA_ARGS__) 
    /*打印info级别的日志*/
    #define log_i(...) PrintLog(L_INFO,LOG_TAG,__FUNCTIONW__,__LINE__,__VA_ARGS__)
    /*打印error级别的日志*/
    #define log_e(...) PrintLog(L_ERROR,LOG_TAG,__FUNCTIONW__,__LINE__,__VA_ARGS__)
       
    #endif // LOGGER_H
       
       
    //打印日志
    void PrintLog(int level,TCHAR * tag,TCHAR * func,long line,TCHAR * format,...);
    
  2. c文件

    #include "Logger.h"
       
    //日志的最大长度
    #define LOG_MAX_BUF_SIZE 1024
    /*时间字符串最大64*/
    #define TIME_BUFLEN 64
    #define TIME_FORMAT L"%Y-%m-%d %H:%M:%S"
    /*日志前面部分的格式 [时间]  日志级别  标签*/
    #define LOG_FORMAT L"[%20s %s] %s/%s %s:%ld:   "
       
    static TCHAR * leveInfo[] = { L"D",L"I",L"E" };
    static TCHAR logBuf[LOG_MAX_BUF_SIZE];
       
       
    //获取当前系统时间
    TCHAR* GetTime() {
    	static TCHAR timeStr[TIME_BUFLEN];
    	time_t t = time(NULL);
    	struct tm * local = localtime(&t);
    	_tcsftime(timeStr, TIME_BUFLEN, TIME_FORMAT, local);
    	return timeStr;
    }
    //获取进程ID
    TCHAR *GetPID() {
    	static TCHAR pidBuf[10];
    	long pid = GetCurrentProcessId();
    	_stprintf(pidBuf, L"PID:%04ld", GetCurrentProcessId());
       
    	return pidBuf;
    }
       
       
       
    //打印日志
    void PrintLog(int level, TCHAR * tag, TCHAR * func, long line, TCHAR * format, ...) {
    	//时间
    	TCHAR* timeStr = GetTime();
    	//日志等级
    	TCHAR* levelStr = leveInfo[level];
    	TCHAR* pid = GetPID();
    	int index = _stprintf(logBuf, LOG_FORMAT,timeStr, pid, levelStr,tag, func,line);
    	va_list args;
    	va_start(args,format);
    	_vsntprintf(logBuf + index, LOG_MAX_BUF_SIZE - index, format,args);
    	va_end(args);
    	//打印日志,这个FILE 自己定义,可以是console,也可以是文件
    	_ftprintf(FILE,logBuf);
       	
    }
    
    • 注意在windows平台上,输出中文到文件里面,必须是宽字符,否则看不到输出内容,或者是乱码