linux下C語(yǔ)言實(shí)現(xiàn)寫(xiě)日志功能
先上程序,該程序經(jīng)過(guò)測(cè)試能夠很好的實(shí)現(xiàn)寫(xiě)日志要求
/*************************************************************************
> 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 的格式化輸出字符串
- 文件操作過(guò)程中pthread_mutex鎖的使用,以及他的優(yōu)點(diǎn)
- linux DEBUG 的應(yīng)用,方便調(diào)試
linux如何查看日志:
使用tail 命令可以實(shí)現(xiàn)日志的查詢(xún),以及其他功能,不了解的話(huà),自行查資料解決。
對(duì)上面應(yīng)用不明白的請(qǐng)自行查資料解決。
相關(guān)文章
linux服務(wù)器磁盤(pán)滿(mǎn)了的三種解決方案
這篇文章主要給大家介紹了linux服務(wù)器磁盤(pán)滿(mǎn)了的三種解決方案,文章通過(guò)圖文結(jié)合的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性
之前在博文從PHP安全講DedeCms的安全加固中說(shuō)過(guò)在PHP安全中保護(hù)“可寫(xiě)目錄下的文件不允許被訪(fǎng)問(wèn)到的重要性,還提出了改名文件夾的方式來(lái)保護(hù)該目錄。2009-11-11
在CentOS / RHEL上設(shè)置 SSH 免密碼登錄的方法
本篇文章主要介紹了在CentOS / RHEL上設(shè)置 SSH 免密碼登錄的方法,自動(dòng)登錄配置好以后,你可以通過(guò)它使用 SSH (Secure Shell)和安全復(fù)制 (SCP)來(lái)移動(dòng)文件。2017-03-03
Linux命令學(xué)習(xí)總結(jié):詳解shutdown命令
本篇文章主要介紹了Linux命令學(xué)習(xí)總結(jié):詳解shutdown命令,該命令可以安全關(guān)閉或者重新啟動(dòng)系統(tǒng)。有興趣的可以了解一下。2016-12-12
linux普通用戶(hù)su root切換提示沒(méi)有文件或目錄的解決方法
這篇文章主要介紹了linux普通用戶(hù)su root切換提示沒(méi)有文件或目錄的解決方法,需要的朋友可以參考下2017-07-07
Linux 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

