项目:利用文件操作实现日志记录的功能

利用文件操作实现日志记录的功能:
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温度过高

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值