利用文件操作实现日志记录的功能:
1.在软件运行中都需要使用日志模块,该模块主要负责记录软件运行状态,记录软件出错的信息提示,方便开发人员对软件运行状态和出错信息进行分析
2.日志记录就是将一些软件信息记录到文件中
3.项目要求:
1.设计一个日志记录模块具备以下功能:
2.基本功能,封装三个函数:
LogInit:
日志初始化,打开一个日志文件
LogWrite:
按照日志文件格式,向日志文件中写入信息
1.如何写入时间
2.如何写入告警级别
3.如何写入用户信息
4.是否需要切换当前写入的文件
LogDeinit
关闭日志文件
LogSetLevel
设定日志的级别,如果用户打印的日志级别超过设定日志级别,则写入文件中,如果没有超过则不写入
LogTreePrint
将所有日志文件路径信息打印在终端界面上(目录的遍历)
3.每天一个文件记录日志信息,分文件夹对日志信息存储
Log-----20231130
| |---debug_20231130.log
|---20231201
| |---debug_20231201.log
|---20231202
|---debug_20231202.log
debug_日期.log
4.要求日志分级别:
严重错误
告警
通知
信息
5.日志文件中要求格式为:
[年-月-日 时-分-秒][日志级别]用户打印内容
6.可以通过函数接口查看所有日志文件的文件名及路径信息
#include <stdio.h>
#include "log.h"
int main(int argc, const char *argv[])
{
int ret = 0;
int Num = 100;
ret = LogInit();
if (-1 == ret)
{
fprintf(stderr, "log system init failed\n");
}
while (1)
{
LogWrite(LOG_MESSAGE, "软件开始运行\n");
sleep(5);
LogWrite(LOG_MESSAGE, "Num = %d\n", Num);
sleep(5);
LogWrite(LOG_WARNING, "CPU温度过高\n");
sleep(5);
LogWrite(LOG_FATAL, "CPU温度超过200度,软件关闭\n");
sleep(5);
}
LogDeinit();
return 0;
}
#include "log.h"
static FILE *fp = NULL;
LogLevel_t gCurLogLevel = LOG_MESSAGE;
Date_t FileDate;
int LogInit(void)
{
time_t t;
struct tm *ptm = NULL;
char dirpath[1024] = {0};
char filepath[1024] = {0};
mkdir(LOG_PATH, 0777);
time(&t);
ptm = localtime(&t);
sprintf(dirpath, "%s/%04d%02d%02d", LOG_PATH, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
mkdir(dirpath, 0777);
sprintf(filepath, "%s/debug_%04d%02d%02d.log", dirpath, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);
FileDate.year = ptm->tm_year + 1900;
FileDate.mon = ptm->tm_mon + 1;
FileDate.day = ptm->tm_mday;
fp = fopen(filepath, "a");
if (NULL == fp)
{
return -1;
}
return 0;
}
int LogWrite(LogLevel_t level, char *pstr, ...)
{
time_t t;
struct tm *ptm = NULL;
va_list ap;
char *perrorstr[4] = {"严重错误", "错误", "告警", "消息"};
if (NULL == fp)
{
return 0;
}
if (level > gCurLogLevel)
{
return 0;
}
time(&t);
ptm = localtime(&t);
if (FileDate.year != ptm->tm_year+1900 || FileDate.mon != ptm->tm_mon+1 || FileDate.day != ptm->tm_mday)
{
LogDeinit();
LogInit();
}
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d][%s]", ptm->tm_year + 1900, ptm->tm_mon+1, ptm->tm_mday,
ptm->tm_hour, ptm->tm_min, ptm->tm_sec, perrorstr[level]);
va_start(ap, pstr);
vfprintf(fp, pstr, ap);
va_end(ap);
fflush(fp);
return 0;
}
int LogDeinit(void)
{
if (fp != NULL)
{
fclose(fp);
fp = NULL;
}
return 0;
}
int LogSetLevel(LogLevel_t level)
{
LogWrite(LOG_FATAL, "日志等级切换为:%d -> %d\n", gCurLogLevel, level);
gCurLogLevel = level;
return 0;
}
#ifndef __LOG_H__
#define __LOG_H__
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#define LOG_PATH "./Log"
typedef enum LogLevel
{
LOG_FATAL, //严重错误
LOG_ERROR, //错误
LOG_WARNING, //告警
LOG_MESSAGE, //消息
}LogLevel_t;
typedef struct date
{
int year;
int mon;
int day;
}Date_t;
extern int LogInit(void);
extern int LogWrite(LogLevel_t level, char *pstr, ...);
extern int LogDeinit(void);
#endif
[2023-12-01 15:02:30][消息]软件开始运行
[2023-12-01 15:02:35][消息]Num = 100
[2023-12-01 15:02:40][告警]CPU温度过高
[2023-12-01 15:02:45][严重错误]CPU温度超过200度,软件关闭
[2023-12-01 15:02:50][消息]软件开始运行
[2023-12-01 15:02:55][消息]Num = 100
[2023-12-01 15:03:00][告警]CPU温度过高
[2023-12-01 15:03:05][严重错误]CPU温度超过200度,软件关闭
[2023-12-01 15:03:10][消息]软件开始运行
[2023-12-01 15:03:15][消息]Num = 100
[2023-12-01 15:03:20][告警]CPU温度过高