Linux自定义日志文件设置回滚(避免信息溢出)
文章目錄
- 一、概述
- 二、代碼實現(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】CSRF攻击与防御(写得非常好)
- 下一篇: linux 其他常用命令