一个不错输出日志文件代码


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#ifdef WIN32

    #include <windows.h>

    #include <io.h>

#else

    #include <unistd.h>

    #include <sys/time.h>

    #include <pthread.h>

    #define  CRITICAL_SECTION   pthread_mutex_t

    #define  _vsnprintf         vsnprintf

#endif

//Log{

#define MAXLOGSIZE 20000000

#define MAXLINSIZE 16000

#include <time.h>

#include <sys/timeb.h>

#include <stdarg.h>

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 WIN32

void Lock(CRITICAL_SECTION *l) {

    EnterCriticalSection(l);

}

void Unlock(CRITICAL_SECTION *l) {

    LeaveCriticalSection(l);

}

#else

void Lock(CRITICAL_SECTION *l) {

    pthread_mutex_lock(l);

}

void Unlock(CRITICAL_SECTION *l) {

    pthread_mutex_unlock(l);

}

#endif

void 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中

时间: 2024-09-30 04:00:56

一个不错输出日志文件代码的相关文章

一个不错的PHP文件页面缓存类

在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类  代码如下 复制代码 <?php    /*    * 缓存类    cache   * 作    者:多菜鸟   * 实    例:   */   /*include( "cache.php" );       $cache = new cache(30);   $cache->cacheCheck();       echo dat

log4j分级输出日志文件

关于LOG4J 按照级别输出日志,并按照级别输出到不同文件中的说法有很多, 网上贴的最多的log4j.properties的设置是这样的 [java] view plain copy log4j.rootLogger=info,stdout,info,debug,error log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayo

Node.js系列文章:利用console输出日志文件

通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单介绍一下. 我们首先创建如下文件: // index.js let fs = require('fs'); let options = { flags: 'a', // append模式 encoding: 'utf8', // utf8编码 }; let stdout = fs.createWri

logback.xml配置如何按天输出日志文件

<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <

nodejs整合log4js输出日志文件

引入log4js依赖,配置类如下:const log4js = require('log4js');log4js.configure({ replaceConsole: true, pm2: true, appenders: { stdout: {//控制台输出 type: 'console' }, req: { //请求转发日志 type: 'dateFile', //指定日志文件按时间打印 filename: '../logs/reqlog/req', //指定输出文件路径 pattern:

如何写一个合格的日志文件

调用下面的方法传入要打印的内容即可 /**/ /// <summary> /// 写入日志文件 /// </summary> /// <param name="input"></param> public static void WriteLogFile(string input) { /**/ ///指定日志文件的目录 string fname = Directory.GetCurrentDirectory() + "\\Lo

PS CC 2014 把一个图层输出为文件的方法

近期在设计一个Qt控件,须要获得一个圆饼的图片,在用PS绘制后发现保存的时候总是会带着背景,用PNG格式保存之后背景依旧存在.仅仅是变成了透明的.刚才在Google上查到了仅仅保存单一图层而全然没有背景的方法. 1. 下面图为例,新建一个文件,用椭圆工具按住shift拖动鼠标画一个正圆.注意这时图像是灰度模式.用油漆桶着色的时候也总是灰色,须要在图像--模式中改动为RGB颜色模式. 2. 在图层面板中选中椭圆图层.右单击选择"转换为智能对象". watermark/2/text/aHR

oracle存储过程执行中输出日志文件

create or replace procedure p_outputdebug(a varchar2,b varchar2,c varchar2)is vFileName varchar2(100); OutputFile UTL_FILE.FILE_TYPE;begin select 'rfid_'||a.rfid||'.log' into vFileName from tbl_animal_info a where a.rfid='330100000078176' ; OutputFil

Linux下一个简单的日志系统的设计及其C代码实现

1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回值及其执行情况.脚本执行及调用情况等.通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题. 因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求. 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现.本文为相关开发项目Linux