linux下C語言實(shí)現(xiàn)寫日志功能
先上程序,該程序經(jīng)過測試能夠很好的實(shí)現(xiàn)寫日志要求
/************************************************************************* > File Name: log.c > Author: ************************************************************************/ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <stdarg.h> #include <time.h> #include <pthread.h> int safe_asprintf(char **strp, const char *fmt, ...); int safe_vasprintf(char **strp, const char *fmt, va_list ap); void plog(const char *format, ...) ; void pinfo(const char *format, ...) ; #define DEBUG #ifdef DEBUG void plog(const char *format, ...); void pinfo(const char *format, ...); #define debug(fmt, args...) plog(fmt, ##args) #else #define debug(fmt, args...) do{}while(0) #endif static pthread_mutex_t fileMutex = PTHREAD_MUTEX_INITIALIZER; int main(int argc, char *argv) { return 0; } /* * safe_asprintf(); */ int safe_asprintf(char **strp, const char *fmt, ...) { va_list ap; int retval; va_start(ap, fmt); retval = safe_vasprintf(strp, fmt, ap); va_end(ap); return retval; } /* * safe_vasprintf(); */ int safe_vasprintf(char **strp, const char *fmt, va_list ap) { int retval; retval = vasprintf(strp, fmt, ap); if (retval == -1) { printf("Failed to vasprintf: %s. Bailing out\n", strerror(errno)); return 1; } return retval; } /* * plog(); */ void plog(const char *format, ...) { pthread_mutex_lock(&fileMutex); FILE *fp = NULL; va_list vlist; char *fmt = NULL; // Open debug info output file. if (!(fp = fopen("log.txt", "a+"))) { pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end(vlist); if (!fmt) { pthread_mutex_unlock(&fileMutex); return; } time_t timep; struct tm *ptm = NULL; time(&timep); ptm = localtime(&timep); fprintf(fp, "[%04d-%02d-%02d-%02d-%02d-%02d] %s", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, fmt); free(fmt); fsync(fileno(fp)); fclose(fp); pthread_mutex_unlock(&fileMutex); } /* * pinfo(); */ void pinfo(const char *format, ...) { pthread_mutex_lock(&fileMutex); FILE *fp = NULL; va_list vlist; char *fmt = NULL; // Open debug info output file. if (!(fp = fopen("log.txt", "a+"))) { pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end(vlist); if (!fmt) { pthread_mutex_unlock(&fileMutex); return; } fprintf(fp, "%s", fmt); free(fmt); fsync(fileno(fp)); fclose(fp); pthread_mutex_unlock(&fileMutex); }
程序?qū)崿F(xiàn)的日志格式為:
時(shí)間 + 空格 + 具體實(shí)現(xiàn)(自己的調(diào)試內(nèi)容)
本段程序值得學(xué)習(xí)的地方:
- va_list 結(jié)構(gòu)體的使用
- linux 的格式化輸出字符串
- 文件操作過程中pthread_mutex鎖的使用,以及他的優(yōu)點(diǎn)
- linux DEBUG 的應(yīng)用,方便調(diào)試
linux如何查看日志:
使用tail 命令可以實(shí)現(xiàn)日志的查詢,以及其他功能,不了解的話,自行查資料解決。
對(duì)上面應(yīng)用不明白的請(qǐng)自行查資料解決。
相關(guān)文章
Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性
之前在博文從PHP安全講DedeCms的安全加固中說過在PHP安全中保護(hù)“可寫目錄下的文件不允許被訪問到的重要性,還提出了改名文件夾的方式來保護(hù)該目錄。2009-11-11在CentOS / RHEL上設(shè)置 SSH 免密碼登錄的方法
本篇文章主要介紹了在CentOS / RHEL上設(shè)置 SSH 免密碼登錄的方法,自動(dòng)登錄配置好以后,你可以通過它使用 SSH (Secure Shell)和安全復(fù)制 (SCP)來移動(dòng)文件。2017-03-03Linux命令學(xué)習(xí)總結(jié):詳解shutdown命令
本篇文章主要介紹了Linux命令學(xué)習(xí)總結(jié):詳解shutdown命令,該命令可以安全關(guān)閉或者重新啟動(dòng)系統(tǒng)。有興趣的可以了解一下。2016-12-12linux普通用戶su root切換提示沒有文件或目錄的解決方法
這篇文章主要介紹了linux普通用戶su root切換提示沒有文件或目錄的解決方法,需要的朋友可以參考下2017-07-07Linux VPS安全設(shè)置之三:使用DDOS deflate抵御少量DDOS攻擊
這篇文章主要介紹了Linux VPS安全設(shè)置之三:使用DDOS deflate抵御少量DDOS攻擊,需要的朋友可以參考下2016-10-10關(guān)于crontab定時(shí)任務(wù)命令解讀
這篇文章主要介紹了關(guān)于crontab定時(shí)任務(wù)命令的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07