使用C语言设计编写程序日志,实现时间戳、 日志级别、日志内容、 日志输出、 日志轮转功能,同时结合程序日志的配置文件,并给出配置文件的内容,给出具体的.c,.h和测试文件代码,其中程序日志的名称是创建时间
时间: 2024-02-16 19:04:51 浏览: 88
C语言写日志代码
好的,我明白了。以下是程序日志的设计实现与测试文件的代码。
## 程序日志设计实现
### 头文件 logger.h
```c
#ifndef LOGGER_H
#define LOGGER_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#define LOGGER_INFO 0
#define LOGGER_WARNING 1
#define LOGGER_ERROR 2
#define LOGGER_BUFFER_SIZE 1024
typedef struct logger_s {
FILE *fp;
int level;
int rotation;
char filename[256];
char filepath[256];
} logger_t;
logger_t *logger_create(const char *filepath, const char *filename, int level, int rotation);
void logger_destroy(logger_t *logger);
void logger_log(logger_t *logger, int level, const char *format, ...);
#endif /* LOGGER_H */
```
### 实现文件 logger.c
```c
#include "logger.h"
static void logger_rotate(logger_t *logger) {
char buf[256];
char oldpath[256];
char newpath[256];
time_t now;
struct tm *timeinfo;
time(&now);
timeinfo = localtime(&now);
snprintf(buf, sizeof(buf), "%s/%s.%04d%02d%02d%02d%02d%02d",
logger->filepath, logger->filename,
timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday,
timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
snprintf(oldpath, sizeof(oldpath), "%s/%s", logger->filepath, logger->filename);
snprintf(newpath, sizeof(newpath), "%s/%s.%d", logger->filepath, logger->filename, logger->rotation);
if (access(oldpath, F_OK) == 0) {
rename(oldpath, newpath);
}
logger->fp = fopen(buf, "a");
logger->rotation++;
if (logger->rotation > 9) {
logger->rotation = 0;
}
}
logger_t *logger_create(const char *filepath, const char *filename, int level, int rotation) {
logger_t *logger;
logger = (logger_t *)malloc(sizeof(logger_t));
if (logger == NULL) {
return NULL;
}
logger->fp = NULL;
logger->level = level;
logger->rotation = rotation;
strncpy(logger->filename, filename, sizeof(logger->filename) - 1);
strncpy(logger->filepath, filepath, sizeof(logger->filepath) - 1);
logger_rotate(logger);
return logger;
}
void logger_destroy(logger_t *logger) {
if (logger) {
if (logger->fp) {
fclose(logger->fp);
}
free(logger);
}
}
void logger_log(logger_t *logger, int level, const char *format, ...) {
va_list args;
char buf[LOGGER_BUFFER_SIZE];
time_t now;
struct tm *timeinfo;
if (level < logger->level) {
return;
}
time(&now);
timeinfo = localtime(&now);
snprintf(buf, sizeof(buf), "[%04d-%02d-%02d %02d:%02d:%02d] %s - ",
timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday,
timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec,
level == LOGGER_INFO ? "INFO" : (level == LOGGER_WARNING ? "WARNING" : "ERROR"));
va_start(args, format);
vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf) - 1, format, args);
va_end(args);
fprintf(logger->fp, "%s\n", buf);
fflush(logger->fp);
if (ftell(logger->fp) >= 1024 * 1024 * 10) { /* 10MB */
fclose(logger->fp);
logger_rotate(logger);
}
}
```
## 测试文件 main.c
```c
#include "logger.h"
int main(int argc, char *argv[]) {
logger_t *logger;
logger = logger_create(".", "test.log", LOGGER_WARNING, 0);
logger_log(logger, LOGGER_INFO, "This is an info message.");
logger_log(logger, LOGGER_WARNING, "This is a warning message.");
logger_log(logger, LOGGER_ERROR, "This is an error message.");
logger_destroy(logger);
return 0;
}
```
## 配置文件 logger.conf
```
loglevel = warning
logfile = test.log
logpath = .
logrotation = 0
```
### 解释
配置文件中定义了以下四个配置项:
- loglevel:日志级别,可以为 info、warning、error 中的任意一个,默认为 warning。
- logfile:日志文件名,不包括路径,默认为 test.log。
- logpath:日志文件路径,默认为当前目录。
- logrotation:日志文件轮转次数,默认为 0。
## 实现说明
程序日志的主要功能是将程序运行过程中的信息记录到日志文件中,方便开发人员进行故障排查和问题跟踪。程序日志一般包括时间戳、日志级别、日志内容等信息。
在本程序中,我们设计了一个 logger_t 结构体,用于保存日志文件的相关信息,例如日志文件名、日志文件路径、当前日志级别、当前日志文件句柄等。我们还设计了三个函数,分别用于创建和销毁 logger_t 结构体,以及向日志文件中写入日志信息。其中,logger_create 函数接收四个参数,分别是日志文件路径、日志文件名、日志级别和日志文件轮转次数。logger_log 函数接收三个参数,分别是 logger_t 结构体指针、日志级别和日志内容,可以使用可变参数列表(va_list)来接收日志内容。logger_rotate 函数用于实现日志文件的轮转功能。
在测试文件中,我们创建了一个 logger_t 结构体,并分别向日志文件中写入了三条日志信息,日志级别分别为 info、warning、error。在实际使用中,我们可以根据实际需要调整日志级别和日志文件轮转次数,以达到最佳的日志记录效果。
在配置文件中,我们定义了四个配置项,用于配置日志级别、日志文件名、日志文件路径和日志文件轮转次数。程序启动时,我们可以读取配置文件中的配置项,然后根据配置项来创建 logger_t 结构体,从而实现日志的配置化。
阅读全文