日志文件大小限定

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>   //getpid
#include "time.h"
#include "stdarg.h"
#include "syslog.h"

#define LOG_FILE_NAME_LEN     64        
#define LOG_MAX_SIZE          128
#define LOG_FILE_MAX_SIZE     1024

long g_offset = 0;  //记录最后一次写入文件的位置

void test_log(const char *ms, ...)
{
    char wzlog[LOG_MAX_SIZE];
    char buffer[LOG_MAX_SIZE];
    char file_name[LOG_FILE_NAME_LEN];
    
    //格式化日志内容
    va_list args;
    va_start(args, ms);
    vsprintf(wzlog, ms, args);
    va_end(args);
    
    //获取系统时间
    time_t now;
    time(&now);
    struct tm *local;
    local = localtime(&now);
    
    //格式化系统时间、日志内容
    snprintf(buffer, LOG_MAX_SIZE, "%02d:%02d:%02d: %s\n", 
        local->tm_hout, local->time_min, local->time_sec, wzlog);
        
    //根据pid区分不同用户的日志文件
    snprintf(file_name, LOG_FILE_NAME_LEN, "/tmp/test_%d.log", getpid());
    
    FILE *file = fopen(file_name, "r+");
    if (NULL == file)
    {
        file = open(file_name, "w+");
    }
    
    //超过文件最大限制,则从文件头开始重新记录
    if (g_offset > LOG_FILE_MAX_SIZE)
    {
        g_offset = 0;
    }
    
    //fseek函数用于偏移文件当前指针到指定位置后,fwrite从该位置写入(发现如果用a+ fopen文件则不能指定偏移进行写入,新的内容一直从尾部开始写入)
    fseek(file, g_offset, SEEK_SET);
    fwrite(buffer, 1, strlen(buffer), file);
    
    fclose(file);
    
    g_offset += strlen(buffer);
    
    return;
}

int main()
{
    int i = 0;
    
    for (i = 0; ; i++)
    {
        test_log("node %3d", i);
        
        sleep(1);
    }
    
    return 0;
}
程序运行后,超过1K后,则重新从文件头开始记录,日志效果如下:


18:18:25 node 13      //  从13开始从文件头开始记录
18:18:26 node 14
18:18:27 node 15
18:18:15 node  3       //  节点3为当前最老的日志点;节点0,1,2被最新日志覆盖
18:18:16 node  4  
18:18:17 node  5  
18:18:18 node  6
18:18:19 node  7
18:18:20 node  8
18:18:21 node  9
18:18:22 node 10
18:18:23 node 11
18:18:24 node 12


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值