日志输出模块log.h

本文介绍了C语言中三个预定义宏__FILE__,__LINE__,和__FUNCTION__的用途,它们分别用于标识代码所在的文件名、行号和函数名。在调试代码时,这些宏常被用来生成日志信息,例如DEBUG_INFO,DEBUG_WARN和DEBUG_ERR宏定义,用于不同级别的调试输出,并通过USART发送到终端。
摘要由CSDN通过智能技术生成

C语言中的__FILE__、LINE__和__FUNCTION

1、FILE 用于指示本行代码所在源文件的文件名;

2、__LINE__用于指示本行代码所在源文件中的位置(行数);

3、__FUNCTION__用于指示本行代码所在函数(函数名);

注:

1)"FILE "、"LINE"、"FUNCTION"等均大小写敏感

2)支持需要添加头文件#include<stdio.h>

#define DEBUG_EN (1u)
 
#if (DEBUG_EN)
 
#define DEBUG_MAX_SIZE 512
extern char szBuf[DEBUG_MAX_SIZE];
 
#define DEBUG_INFO( format, ... ) do{\
    u16 unLen = 0;\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[INFO][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\
}while(0)
 
#define DEBUG_WARN( format, ... ) do{\
    u16 unLen = 0;\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[WARN][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\
}while(0)
 
#define DEBUG_ERR( format, ... ) do{\
    u16 unLen = 0;\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[ERR][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\
}while(0)
 
#elif 
 
#define DEBUG_INFO(...)
#define DEBUG_WARN(...)
#define DEBUG_ERR(...)
 
#endif
很抱歉,我无法提供完整的代码,因为这是一个比较复杂的项目,需要根据具体的要求进行设计和编写。但是,我可以为您提供一些思路和参考资料,希望对您有所帮助。 首先,您需要设计一个日志模块,包括 log.c 和 log.h 两个文件。在 log.h 文件中,您需要定义日志级别和日志输出函数,例如: ```c typedef enum { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARN, LOG_LEVEL_ERROR, LOG_LEVEL_FATAL } log_level_t; void log_debug(const char *format, ...); void log_info(const char *format, ...); void log_warn(const char *format, ...); void log_error(const char *format, ...); void log_fatal(const char *format, ...); ``` 在 log.c 文件中,您需要实现这些函数,并支持时间戳和日志轮转功能。具体而言,您可以使用标准 C 库中的时间函数来获取当前时间,例如: ```c #include <time.h> void get_current_time(char *buffer, size_t size) { time_t now = time(NULL); struct tm *tm = localtime(&now); strftime(buffer, size, "%Y-%m-%d %H:%M:%S", tm); } ``` 这个函数可以将当前时间格式化成字符串,例如 "2021-10-26 16:30:15"。您可以在输出日志时调用这个函数,例如: ```c void log_debug(const char *format, ...) { char buffer[1024]; va_list args; va_start(args, format); vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); char timestamp[20]; get_current_time(timestamp, sizeof(timestamp)); printf("[%s] [DEBUG] %s\n", timestamp, buffer); } ``` 这个函数会在输出日志时添加时间戳和日志级别,例如 "[2021-10-26 16:30:15] [DEBUG] hello, world"。类似地,您可以实现其他日志级别的输出函数。 至于日志轮转功能,您可以在 log.c 文件中使用文件系统 API 来创建和删除日志文件。例如,您可以在程序启动时创建一个新的日志文件,并将其保存在 temp 目录下,例如 "temp/log_1.txt"。当这个文件达到一定大小时,您可以创建一个新的日志文件,例如 "temp/log_2.txt",并将日志输出到新的文件中。当所有日志文件都达到一定大小时,您可以删除最早生成的一个日志文件,例如 "temp/log_1.txt"。 具体而言,您可以使用标准 C 库中的文件操作函数来创建和删除文件,例如: ```c #include <stdio.h> FILE *open_log_file(const char *filename) { FILE *file = fopen(filename, "a"); if (file == NULL) { fprintf(stderr, "failed to open log file '%s'\n", filename); } return file; } void close_log_file(FILE *file) { fclose(file); } void delete_log_file(const char *filename) { remove(filename); } ``` 这些函数分别用于打开、关闭和删除日志文件。您可以在 log.c 文件中实现一个函数,每次输出日志时检查当前日志文件的大小,如果超过一定限制,则创建一个新的日志文件。 最后,您需要编写一个测试代码,调用日志模块中的函数输出日志。例如: ```c #include "log.h" int main() { log_debug("hello, world"); log_info("hello, world"); log_warn("hello, world"); log_error("hello, world"); log_fatal("hello, world"); return 0; } ``` 这个测试代码会输出五个不同级别的日志信息。 希望这些思路和参考资料能够对您有所帮助,祝您编写顺利!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值