分级别打印日志

博客介绍了在Linux环境下,使用C/C++进行日志操作的相关内容。包括在log.h文件中定义打印日志的接口,给出使用实例a.c,介绍了a.c的编译、执行结果,还提及通过编译选项将宏加到代码中,INFO_OUTPUT可写成具体数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口定义log.h

该文件中定义了打印日志的接口。

#ifndef _LOG_H_
#define _LOG_H_

#define INFO_OUTPUT      3
#define WARNING_OUTPUT   2
#define DEBUG_OUTPUT     1
#define ERROR_OUTPUT     0

#define LOG_INFO(args,...)\
do{\
    if (DEBUG_LEVEL >= INFO_OUTPUT)\
    {\
        printf("[I] "args" (%s, %d)\n", ##__VA_ARGS__, __FILE__, __LINE__);\
    }\
}while(0)

#define LOG_WARNING(args,...)\
do{\
    if (DEBUG_LEVEL >= WARNING_OUTPUT)\
    {\
        printf("[W] "args" (%s, %d)\n", ##__VA_ARGS__, __FILE__, __LINE__);\
    }\
}while(0)

#define LOG_DEBUG(args,...)\
do{\
    if (DEBUG_LEVEL >= DEBUG_OUTPUT)\
    {\
        printf("[D] "args" (%s, %d)\n", ##__VA_ARGS__, __FILE__, __LINE__);\
    }\
}while(0)

#define LOG_ERROR(args,...)\
do{\
    if (DEBUG_LEVEL >= ERROR_OUTPUT)\
    {\
        printf("[E] "args" (%s, %d)\n", ##__VA_ARGS__, __FILE__, __LINE__);\
    }\
}while(0)

#endif

使用实例a.c

 #include <stdio.h>
 #include "log.h"
 /*通过这个宏来控制打印日志的级别,这个宏也可以在编译的时候当作编译选项添加进去。*/
 #define DEBUG_LEVEL INFO_OUTPUT
 int main()
 {
     LOG_INFO("I'm Info");
     LOG_WARNING("I'm Warning");
     LOG_DEBUG("I'm Debug");
     LOG_ERROR("I'm Error");
     return 0;
 }

编译a.c

gcc -c a.c

执行编译的结果a.out

有些终端有关键字高亮的话,看起来很是舒服,这里看不到结果,我贴图大家参考下,顺便说下,我用的是MobaXterm,感觉用起来还不错。

[I] I'm Info (a.c, 6)
[W] I'm Warning (a.c, 7)
[D] I'm Debug (a.c, 8)
[E] I'm Error (a.c, 9)

我的这个Debug不能高亮 不知道怎么设置, 如果你知道了麻烦告诉我下-
我的这个Debug不能高亮 不知道怎么设置, 如果你知道了麻烦告诉我下~

通过编译选项将宏加到代码中去,请看下面的编译命令

gcc a.c -D DEBUG_LEVEL=INFO_OUTPUT

这里的INFO_OUTPUT也可以写成具体的数字,不过这样更明了一些。

### 配置和打印不同日志级别的方法 在 Python 的 `logging` 模块中,可以通过多种方式来配置和打印不同的日志级别。以下是具体实现的方法: #### 1. 使用 `basicConfig` 方法配置日志级别 通过调用 `logging.basicConfig()` 函数可以设置全局的日志级别以及其他参数,例如日志文件名、输出格式等。 ```python import logging # 设置基本配置 logging.basicConfig( level=logging.DEBUG, # 设置最低的日志级别为 DEBUG format='%(asctime)s - %(levelname)s - %(message)s', # 定义日志输出格式 datefmt='%Y-%m-%d %H:%M:%S' # 定义日期时间格式 ) # 打印不同级别日志 logging.debug("This is a debug message.") # 调试信息 logging.info("This is an info message.") # 基本信息 logging.warning("This is a warning message.") # 警告信息 logging.error("This is an error message.") # 错误信息 logging.critical("This is a critical message.") # 致命错误信息 ``` 上述代码设置了日志的最低级别为 `DEBUG`,因此所有级别日志都会被打印到控制台[^2]。 --- #### 2. 创建自定义 Logger 对象并添加 Handler 除了使用 `basicConfig` 外,还可以创建一个自定义的 `Logger` 对象,并为其添加多个 `Handler` 来别处理不同类型的日志输出(如写入文件或输出到控制台)。 ```python import logging # 创建 logger 实例 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 设置 logger 的最低日志级别 # 创建 ConsoleHandler 并设置其日志级别 ch = logging.StreamHandler() # 输出到控制台 ch.setLevel(logging.WARNING) # 控制台只显示 WARNING 及以上级别日志 # 创建 FileHandler 并设置其日志级别 fh = logging.FileHandler('app.log') # 将日志写入文件 app.log fh.setLevel(logging.DEBUG) # 文件会记录所有的调试信息 # 定义 Formatter 并将其应用到 handler 中 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) # 将 handler 添加到 logger 中 logger.addHandler(ch) logger.addHandler(fh) # 测试日志输出 logger.debug("Debug Message") # 此消息只会写入文件 logger.info("Info Message") # 同上 logger.warning("Warning Message") # 此消息会同时写入文件和输出到控制台 logger.error("Error Message") # 同上 logger.critical("Critical Message") # 同上 ``` 在这个例子中,`StreamHandler` 和 `FileHandler` 别用于将日志输出到控制台和保存到文件中。每种处理器都可以独立设置自己的日志级别[^3]。 --- #### 3. 动态调整日志级别 如果需要动态更改日志级别,可以直接修改 `Logger` 或者某个特定 `Handler` 的日志级别属性。 ```python # 修改整个 logger 的日志级别 logger.setLevel(logging.ERROR) # 修改 StreamHandler 的日志级别 ch.setLevel(logging.CRITICAL) # 继续测试日志输出 logger.debug("New Debug Message") # 不会被记录 logger.info("New Info Message") # 不会被记录 logger.warning("New Warning Message") # 不会被记录 logger.error("New Error Message") # 仅写入文件 logger.critical("New Critical Message") # 写入文件并输出到控制台 ``` 这种方式非常适合在程序运行过程中根据需求灵活调整日志行为。 --- ### 总结 通过 `logging.basicConfig()` 可以快速完成简单日志配置;而通过创建自定义 `Logger` 和添加多样的 `Handler` 则能够满足更复杂的需求场景。无论是静态还是动态调整日志级别,Python 的 `logging` 模块都提供了强大的支持[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值