一个不错输出日志文件代码
admin
2023-08-02 06:26:28
0

#include #include #include #ifdef WIN32    #include     #include #else    #include     #include time.h>    #include     #define  CRITICAL_SECTION   pthread_mutex_t    #define  _vsnprintf         vsnprintf#endif//Log{#define MAXLOGSIZE 20000000#define MAXLINSIZE 16000#include #include #include char logfilename1[]="MyLog1.log";char logfilename2[]="MyLog2.log";static char logstr[MAXLINSIZE+1];char datestr[16];char timestr[16];char mss[4];CRITICAL_SECTION cs_log;FILE *flog;#ifdef WIN32void Lock(CRITICAL_SECTION *l) {    EnterCriticalSection(l);}void Unlock(CRITICAL_SECTION *l) {    LeaveCriticalSection(l);}#elsevoid Lock(CRITICAL_SECTION *l) {    pthread_mutex_lock(l);}void Unlock(CRITICAL_SECTION *l) {    pthread_mutex_unlock(l);}#endifvoid LogV(const char *pszFmt,va_list argp) {    struct tm *now;    struct timeb tb;     if (NULL==pszFmt||0==pszFmt[0]) return;    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);    ftime(&tb);    now=localtime(&tb.time);    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );    sprintf(mss,"%03d",tb.millitm);    printf("%s %s.%s %s",datestr,timestr,mss,logstr);    flog=fopen(logfilename1,"a");    if (NULL!=flog) {        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);        if (ftell(flog)>MAXLOGSIZE) {            fclose(flog);            if (rename(logfilename1,logfilename2)) {                remove(logfilename2);                rename(logfilename1,logfilename2);            }        } else {            fclose(flog);        }    }}void Log(const char *pszFmt,...) {    va_list argp;     Lock(&cs_log);    va_start(argp,pszFmt);    LogV(pszFmt,argp);    va_end(argp);    Unlock(&cs_log);}//Log}int main(int argc,char * argv[]) {    int i;#ifdef WIN32    InitializeCriticalSection(&cs_log);#else    pthread_mutex_init(&cs_log,NULL);#endif    for (i=0;i<10000;i++) {        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);    }#ifdef WIN32    DeleteCriticalSection(&cs_log);#else    pthread_mutex_destroy(&cs_log);#endif    return 0;}//1-78行添加到你带main的.c或.cpp的那个文件的最前面//81-85行添加到你的main函数开头//89-93行添加到你的main函数结束前//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中


相关内容

热门资讯

AI时代,如何共筑数据库产业新... 7月10日电(记者 吴家驹)数据库作为支撑数字经济关键数据基座,在人工智能浪潮与产业变革深度交汇的当...
人形机器人整机产量有望破10万... 来源:中国经营报 中经记者 李玉洋 上海报道 2026年被定义为人形机器人量产元年。时间已过半,这一...
【深度】中国开启可回收火箭时代... 界面新闻实习记者 | 李响 界面新闻编辑 | 张慧 中国首次成功实施了运载火箭一子级可控回收。 ...
江苏涵育科创“雨林”   获得国家最高科学技术奖的耄耋院士扎根江苏书写创新传奇;“奋斗者号全海深载人潜水器”获得通用项目唯...
三星电子会长李在镕拟于本月底赴... IT之家 7 月 10 日消息,据韩媒《东亚日报》今天报道,三星电子会长李在镕预计将于本月底奔赴美国...
长征十号乙即将首飞 首创&qu... 我国首款轨道级可回收火箭一一长征十号乙的首飞窗口锁定在7月10日至13日,地点位于海南商业航天发射场...
晋江鞋厂火灾车间内部直击:堆积... 昨天(9日),福建泉州晋江陈埭镇江头村辉腾鞋业公司厂房发生火灾,记者今天从泉州市政府召开的新闻发布会...
万和热水器点火后熄灭故障 万和热水器点火后熄灭故障可能是由多种原因引起的。以下是一些可能的原因和解决方法:1. 电池电量不足:...
燃气热水器打着火后又熄灭 1、燃气热水器的电池坏了没有通电,导致不打火,或者打火后熄灭;2、热水器的电磁阀坏了导致打火后熄灭;...
燃气灶为什么点燃后自动熄灭 问题:燃气灶为什么点燃后自动熄灭回答:原因是灶具使用后,应保持灶面清洁,燃气灶的燃烧器上的火孔易被稀...