一、前言
有现成的C库为什么要自己造轮子呢?我发现大家对造轮子情有独钟呀,所以我也来试一试,免得被C圈里面的人排挤.
二、上代码
-
头文件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,...);
-
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平台上,输出中文到文件里面,必须是宽字符,否则看不到输出内容,或者是乱码