简单日志系统的编写
  phMDTLXXRYjC 2023年11月02日 25 0

来源于本人同学:简单日志系统的代码编写_一名小初学者的博客-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
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
phMDTLXXRYjC
作者其他文章 更多