日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時間:2024/3/13 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux自定义日志文件设置回滚(避免信息溢出) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 一、概述
    • 二、代碼實現(xiàn)
    • 三、所用函數(shù)說明
      • (1)C庫函數(shù)ftell()
      • (2)C庫函數(shù)fseek()
      • (3)C庫函數(shù)rewind()
      • (4)Linux系統(tǒng)函數(shù)truncate()

一、概述

我們在Linux下面進(jìn)行項目開發(fā)的時候,一般都將打印的信息輸出到特定的日志文件中,可以是系統(tǒng)自帶的syslog日志系統(tǒng)文件,也可以是我們自己寫的日志系統(tǒng)文件,如果是我們自己寫的日志系統(tǒng),我們就不得不考慮內(nèi)存空間有限,而不能無限地存儲程序所打印的信息了,那我們怎么避免這種情況,使得日志文件數(shù)據(jù)達(dá)到一定值的時候自動清空呢?就是說如何達(dá)到日志回滾呢?

二、代碼實現(xiàn)

以下是本人寫的日志回滾函數(shù):

//參數(shù)logfile為日志文件的路徑和文件名,logsize為判斷值,當(dāng)大于這個值時,我們需要進(jìn)行清空操作 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:%ld\n", _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); }

三、所用函數(shù)說明

(1)C庫函數(shù)ftell()

作用:
C 庫函數(shù) long int ftell(FILE *stream) 返回給定流 stream 的當(dāng)前文件位置。

函數(shù)原型:

long int ftell(FILE *stream)

參數(shù):
stream – 這是指向 FILE 對象的指針,該 FILE 對象標(biāo)識了流。

返回值:
該函數(shù)返回位置標(biāo)識符的當(dāng)前值。如果發(fā)生錯誤,則返回 -1L,全局變量 errno 被設(shè)置為一個正值。

(2)C庫函數(shù)fseek()

作用:
C 庫函數(shù) int fseek(FILE *stream, long int offset, int whence) 設(shè)置流 stream 的文件位置為給定的偏移 offset,參數(shù) offset 意味著從給定的 whence 位置查找的字節(jié)數(shù)。

函數(shù)原型:

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

參數(shù):
stream – 這是指向 FILE 對象的指針,該 FILE 對象標(biāo)識了流。
offset – 這是相對 whence 的偏移量,以字節(jié)為單位。
whence – 這是表示開始添加偏移 offset 的位置。它一般指定為下列常量之一:
SEEK_SET 文件的開頭
SEEK_CUR 文件指針的當(dāng)前位置
SEEK_END 文件的末尾

返回值:
如果成功,則該函數(shù)返回零,否則返回非零值。

(3)C庫函數(shù)rewind()

作用:
C 庫函數(shù) void rewind(FILE *stream) 設(shè)置文件位置為給定流 stream 的文件的開頭。

函數(shù)原型:

void rewind(FILE *stream)

參數(shù):
stream – 這是指向 FILE 對象的指針,該 FILE 對象標(biāo)識了流。

返回值:
該函數(shù)不返回任何值。

(4)Linux系統(tǒng)函數(shù)truncate()

依賴頭文件:

#include<unistd.h> #include<sys/types.h>

函數(shù)原型:

int truncate(const char *path,off_t length)

truncate()函數(shù)會使名稱為path的文件被截斷成一個大小為length字節(jié)的文件。如果先前的文件大于length,額外的數(shù)據(jù)丟失。如果先前的文件小于當(dāng)前定義的大小,那么,這個文件將會被擴(kuò)展,擴(kuò)展的部分將補(bǔ)以null,也就是‘\0’。 使用truncate函數(shù)的文件必須能夠被寫。

總結(jié)

以上是生活随笔為你收集整理的Linux自定义日志文件设置回滚(避免信息溢出)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。