简单日志系统的代码编写

日志系统的功能:

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

仓库地址clien_project/log/logger.h · yangjian/atest - 码云 - 开源中国 (gitee.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值