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

一、前言#

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

二、上代码#

  1. 头文件logger.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #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文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #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平台上,输出中文到文件里面,必须是宽字符,否则看不到输出内容,或者是乱码
感谢您的阅读,本文由 Onew 版权所有。如若转载,请注明出处:Onew(https://onew.me/2018/10/08/c-logger/
windows用c创建进程
windows解决logback中文乱码,以及高亮问题