来源于本人同学:简单日志系统的代码编写_一名小初学者的博客-CSDN博客
日志系统的功能:
1,打开当前文件夹下的log文件夹并在其中生成日志文件
2,定义不同的日志级别
3,日志回滚功能,在运行程序之前检查log文件夹下的log文件于当前时间比较,修改其权限并将超过规定时间的文件删除,避免文件过多。
程序缺点:
1,生成的文件名是以1970年到现在的秒数代替的,人工较难找到对应的日志文件
2,该时间是以1开头的,足够长的时间后将会改变
3,当log文件夹中出现以1命名开头时,可能会出现误删等情况
4,当前代码较简单,即初略的完成了任务,后期仍要修改
内容:
/*********************************************************************************
* Copyright: (C) 2023 yangjian<YJyangjian183@gmail.com>
* All rights reserved.
*
* Filename: log.c
* Description: This file about log
*
* Version: 1.0.0(2023年10月07日)
* Author: yangjian <YJyangjian183@gmail.com>
* ChangeLog: 1, Release initial version on "2023年10月07日 12时21分45秒"
*
********************************************************************************/
#include "logger.h"
#include <time.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
static FILE *log_file = NULL;
void log_init(const char *log_file_path, LogLevel level)
{
log_file = fopen(log_file_path, "a");
if (!log_file)
{
printf("无法打开日志文件\n");
return ;
}
}
int GET_data(char* servip,int port)
{
time_t t = time(NULL);
char databuf[128];
snprintf(databuf,sizeof(databuf),"this connect server ip:%s port:%d",servip,port);
fprintf(log_file,"%s",databuf);
fprintf(log_file,"\n");
return 1;
}
//time
const char *get_timestamp()
{
static char timestamp[20];
time_t now = time(NULL);
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", localtime(&now));
return timestamp;
}
void log_message(LogLevel level,const char* file,int line, const char *format, ...)
{
const char *level_str[] = {"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"};
va_list args;
va_start(args, format);
fprintf(log_file, "[%s]: [%s] line{%d} [%s]: ", get_timestamp(),file,line, level_str[level]);
vfprintf(log_file, format, args);
fprintf(log_file, "\n");
va_end(args);
//清空缓冲区
fflush(log_file);
}
void log_close()
{
if (log_file)
{
fclose(log_file);
}
}
//查看日志文件日期,并把过期的删除
int log_roll()
{
DIR *dirp=NULL;
char *path="./log";
struct dirent *direntp=NULL;
dirp=opendir(path);
while(NULL!=(direntp=readdir(dirp)))
{
if(strstr(direntp->d_name,"1"))
{
Remove_if((char*)direntp->d_name);
printf("%s\n",direntp->d_name);
}
}
closedir(dirp);
return 0;
}
int Remove_if(char* path)
{
DIR *dir=NULL;
char buf[32];
long data;
time_t t=time(NULL);
long now=(long)t;
char *result;
char *dot_position = strchr(path, '.');
char path1[64]="./log/";
int length;
strncat(path1,path,sizeof(path1));
if (dot_position != NULL)
{
length = dot_position - path;
result = (char *)malloc(length + 1);
strncpy(result, path, length);
result[length] = '\0';
strncpy(buf,result,sizeof(buf));
free(result);
}
if (chmod(path1, S_IRWXU | S_IRWXG | S_IRWXO) != 0)
{
perror("文件权限修改失败");
exit(EXIT_FAILURE);
}
data=atol(buf);
if(now-data>1200)
{
if(unlink(path1)==0)
{
printf("删除成功\n");
}
else
printf("delete failed\n");
}
return 0;
}
头文件
#ifndef LOGGER_H
#define LOGGER_H
#include <stdio.h>
#include <stdarg.h>
typedef enum
{
LOG_DEBUG,
LOG_INFO,
LOG_WARNING,
LOG_ERROR,
LOG_CRITICAL
} LogLevel;
int GET_data(char* servip,int port);
void log_init(const char *log_file_path, LogLevel level);
void log_message(LogLevel level,const char*file,int line, const char *format, ...);
void log_close();
const char *get_timestamp();
int log_roll();
int Remove_if(char* path);
#endif