文章

一种简易的log输出方式

代码:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#define LOG_QUIET 0
#define LOG_COUT_FILE 1
#define LOG_COUT_LINE 1

#if LOG_QUIET
#define LogTrace(...)
#define LogDebug(...)
#define LogInfo(...)
#define LogWarn(...)
#define LogError(...)
#define LogFatal(...)
#else
#define LogTrace(...) LogBase(_LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define LogDebug(...) LogBase(_LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define LogInfo(...) LogBase(_LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define LogWarn(...) LogBase(_LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
#define LogError(...) LogBase(_LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define LogFatal(...) LogBase(_LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)
#endif

enum
{
    _LOG_TRACE,
    _LOG_DEBUG,
    _LOG_INFO,
    _LOG_WARN,
    _LOG_ERROR,
    _LOG_FATAL
};

static const char *level_strings[] = {
    "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"};

void LogBase(int level, const char *file, int line, const char *fmt, ...);

int main(int argc, char **argv)
{
    LogTrace("trace:%d\n", 7);
    LogDebug("debug\n");
    LogInfo("info:%d\n", 4);
    LogError("error:%d\n", -1);
    return 0;
}

/**
 * @brief output debug information
 *
 * @param level information level
 * @param file filename
 * @param line line
 * @param fmt the output format
 * @param ... specific parameters
 */
void LogBase(int level, const char *file, int line, const char *fmt, ...)
{
    char str[256] = {0};
    va_list args;
    va_start(args, fmt);
#if 0
    int fprintf(FILE *stream, const char *format, ...);
    int vfprintf(FILE *stream, const char *format, va_list arg_list);
    /*fprintf函数中的可变参数列表是直接传递给函数的,
    vfprintf函数中的可变参数列表是先打包成一个va_list对象,再传递给函数。*/
#endif
    // fprintf(stdout, "%-5s %s:%d: ", level_strings[level], file, line);
    // vfprintf(stdout, fmt, args);
    printf("%-5s %s:%d: ", level_strings[level], file, line);
    vsnprintf(str, sizeof(str), fmt, args);
    printf("%s", str);
    va_end(args);
}

本文由作者按照 CC BY 4.0 进行授权