如何写日志

如何写日志文件

LOG(char * strformat, …) ;

这是最上层的日志文件接口的一般形式,函数名要简单,因为程序中要打的log那是NN次方多,函数比如LOG,就比较简单,最好大写,与一般的函数名想区别

我们的写log文件的的宗旨是“让我们实时的知道程序是怎么运行的”

现在就让我们看看如何将其实现!

#define   LOG  Log

这样就可以调用LOG了,但是你想想当你的LOG内容N多时,尤其是当你的进程是一后台进程是,内容日积月累,那是相当的大的,maybe 几百M,出现异常时你得打开.log文件看看吧,你想想在一个几M的文件里找一行两行的内容那是有困难的,你可能说这处程序是我写的,我能很容易的找到我要的日志在哪一范围,(1)当一个软件比较宠大时,是由team共同开发的,team每个成员都在打各个的log,你上哪找去?(2)当你是软件维护人员时,你怎么看?你不清楚loglogic,所以我得把log文件写的更好,使其具有通用性,方便他人使用,每个人都能很容易的找到自己要的log

 

我觉得如何写log文件很有趣,极其技巧,很能体现一programmer的水平

那就让我开始动手并动脑,本人才疏学浅,能力有限,望大家及时批评指正

首先我们得弄清楚一个日志文件需要什么东西,你希望你打开的日志文件包含有哪些信息,每条log的内容应该含有哪些信息?

试着想一想,休息一分钟!

说说我想的吧,应该包含有,文件信息,函数名信息,第几行,一些关键字信息,

要文件信息是因为你查log 时,可以知道这个log是在哪个文件里打上去的,可以直接打开文件!

函数名信息,既然知道了是在哪个文件里,再加上函数名就更加文件我们查找了!

关键字,那就不用说了!

最好还有时间信息,这里暂时等等,后面搞定!

 

那我们的LOG可不能这么定义了,

#define LOG LogFileFuncLine(__FILE__, __FUNCTION__, __LINE__) ; Log

__FILE__表示当前文件,__FUNC__表示当前函数,__LINE__表示当前行

上面可以看出LOG是由LogFileFuncLineLog两个函数组成的!

LogFileFuncLine的实现

#define FLEN 128

#define FUNLEN 64

#define VALUE  -1

static char g_filepath[FLEN] = “” ;

static char g_func[FUNLEN] = “” ;

static int g_lineno = VALUE;

 

/*********************************************************************/

void LogFileFuncLine(const char* filepath, const char* func, const int lineno )

{

    assert((NULL != filepath) && (NULL != func) && (lineno > 0)) ;

    strncpy(g_filepath, filepath, strlen(filepath) +1 ) ;

    strncpy(g_func , func , strlen(func) + 1) ;

    g_lineno = lineno ;

}

 

/*********************************************************************/

inline void clearmem(char * s1, char s2, int* i)

{

    memset(s1 , 0 , FLEN) ;

    memset(s2 , 0 , FUNLEN) ;

    *i = VALUE ;

}

 

/*********************************************************************/

void  Log(char* format, …)

{

    FILE * fp ;

    va_list args ;

    time_t t ;

    struct tm* pTm ;

    char timeStr[32] ;

 

if(fp = fopen(FZLOG_FILENAME, "a") == NULL)

        return;

    time(&t) ;

    pTm = localtime(&t) ;

    strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S : ", pTm) ;

    if(g_ filepath[0])

    {

        fprintf(fp , “%s  %s   %d  /n %s ”,

g_filepth,g_func,g_lineno, timeStr);

    clearmem(g_filepth , g_func , & g_lineno ) ;

}

va_start(args, format) ;

vfprintf( fp, format, args ) ;

va_end(args) ;

fprintf(fp, “/n”);

fclose(fp) ;

   

}

 

一般呢,以下会打上log

(1) 在程序的分叉点都打上log

(2) 在对一块内存分析时

(3) 函数刚开始时,打参数的值打出来

(4) 返回信息,执行结果

(5) 判断错误时,打错误的信息打上

 

 

代码呢,差不多写完了,我并没有编译过,所以maybe,编程通不过,是linux环境,各们根据具体情况请具体分析!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值