栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux自定义日志文件设置回滚(避免信息溢出)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux自定义日志文件设置回滚(避免信息溢出)

文章目录
    • 一、概述
    • 二、代码实现
    • 三、所用函数说明
      • (1)C库函数ftell()
      • (2)C库函数fseek()
      • (3)C库函数rewind()
      • (4)Linux系统函数truncate()

一、概述

我们在Linux下面进行项目开发的时候,一般都将打印的信息输出到特定的日志文件中,可以是系统自带的syslog日志系统文件,也可以是我们自己写的日志系统文件,如果是我们自己写的日志系统,我们就不得不考虑内存空间有限,而不能无限地存储程序所打印的信息了,那我们怎么避免这种情况,使得日志文件数据达到一定值的时候自动清空呢?就是说如何达到日志回滚呢?

二、代码实现

以下是本人写的日志回滚函数:

//参数logfile为日志文件的路径和文件名,logsize为判断值,当大于这个值时,我们需要进行清空操作
int check_and_rollback(char *logfile, int logsize)
{   
    FILE        *logfile_fp = NULL;
    long int    _curOffset;
    char        cmd[512];

    if(logsize <= 0)
    {
        fprintf(stderr, "%s input error argument!n", __func__);
        return -1;
    }

    logfile_fp = fopen(logfile, "r");//注意以只读打开文件,用w的话,每次打开这个文件都会被清空
    if(!logfile_fp)
    {
        fprintf(stderr, "Open %s failure!n", logfile);
        return -2;
    }

    fseek(logfile_fp, 0, SEEK_END);
    _curOffset = ftell(logfile_fp);
    
    printf("_curOffset:%ldn", _curOffset);
    
    if((_curOffset != -1) && (_curOffset >= logsize))
    {
        snprintf(cmd, sizeof(cmd), "cp -f %s %s.roll", logfile, logfile);
        if(system(cmd) == -1)
        {
            fprintf(stderr, "Execute system() failure!n");
        }

        if(-1 == fseek(logfile_fp, 0, SEEK_SET))
        {
            fprintf(logfile_fp, "Log rollback fseek failed!n");
        }
        rewind(logfile_fp);

        truncate(logfile, 0);
        fprintf(logfile_fp, "Already rollback!n");
    }

    fclose(logfile_fp);  
}
三、所用函数说明 (1)C库函数ftell()

作用:
C 库函数 long int ftell(FILE *stream) 返回给定流 stream 的当前文件位置。

函数原型:

long int ftell(FILE *stream)

参数:
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值:
该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

(2)C库函数fseek()

作用:
C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

函数原型:

 int fseek(FILE *stream, long int offset, int whence)

参数:
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset – 这是相对 whence 的偏移量,以字节为单位。
whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾

返回值:
如果成功,则该函数返回零,否则返回非零值。

(3)C库函数rewind()

作用:
C 库函数 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文件的开头。

函数原型:

void rewind(FILE *stream)

参数:
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值:
该函数不返回任何值。

(4)Linux系统函数truncate()

依赖头文件:

#include
#include

函数原型:

int truncate(const char *path,off_t length)

truncate()函数会使名称为path的文件被截断成一个大小为length字节的文件。如果先前的文件大于length,额外的数据丢失。如果先前的文件小于当前定义的大小,那么,这个文件将会被扩展,扩展的部分将补以null,也就是‘’。 使用truncate函数的文件必须能够被写。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号