如何写日志文件

LOG(char * strformat, …) ;

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

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

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

#define   LOG  Log

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

 

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

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

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

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

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

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

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

关键字,那就不用说了!

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

 

那我们的LOG可不能这么定义了,
#define LOG LogFileFuncLine(__FILE__, __FUNCTION__, __LINE__) ; Log 
__FILE__表示当前文件,__FUNC__表示当前函数,__LINE__表示当前行
上面可以看出LOG是由LogFileFuncLine和Log两个函数组成的!
看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环境,各们根据具体情况请具体分析!