Linux下实现跟踪程序执行信息记录日志文件

2024-02-19 22:18

本文主要是介绍Linux下实现跟踪程序执行信息记录日志文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

//debug.h

/*************************************************************    
FileName : debug.h
FileFunc : 头文件
Version  : V0.1    
Author   : Sunrier    
Date     : 2012-06-09
Descp    : Linux下实现跟踪程序执行信息记录日志文件   
*************************************************************/
#ifndef   _DEBUG_H_    
#define   _DEBUG_H_ 
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>  
#include <time.h> 
#include <dirent.h>
#include <stdarg.h> 
#include <sys/stat.h>
#define ERROR        __FILE__,__LINE__,0x01
#define DEBUG        __FILE__,__LINE__,0x02
void GetCurrentTime(char *pTime);
void SetLogName(char *pLogPath,char *pProcName,char *pLogName);
void TRACE_LOG(char *pFileName,int iLine,int iLogType,char *pLogName,const char *fmt, ...);
#ifdef __cplusplus
}
#endif
#endif 


 

//debug.c

/*************************************************************    
FileName : debug.c
FileFunc : 实现文件
Version  : V0.1    
Author   : Sunrier    
Date     : 2012-06-09
Descp    : Linux下实现跟踪程序执行信息记录日志文件  
*************************************************************/
#include "debug.h"
void GetCurrentTime(char *pTime)
{
time_t t;
struct tm tm1;
t=time(NULL);
memcpy(&tm1,localtime(&t),sizeof(struct tm));
sprintf(pTime,"%04d%02d%02d%02d%02d%02d",tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
}
void SetLogName(char *pLogPath,char *pProcName,char *pLogName)
{
char szTime[15];
DIR *pDir = NULL;
memset(szTime,0,sizeof(szTime));
GetCurrentTime(szTime);
pDir = opendir(pLogPath);
if( pDir==NULL )
{	
mkdir(pLogPath,S_IREAD|S_IWRITE|S_IEXEC);
}	
else
{	
closedir(pDir);
}	
sprintf(pLogName,"%s/%s%.6s.log",pLogPath,pProcName,&szTime[2]);
}
void  TRACE_LOG(char *pFileName,int iLine,int iLogType,char *pLogName,const char *fmt, ...)
{
FILE *fp;
va_list vap;
char szTime[15];
char szLogType[10];
char szTemp[512];
int iLen=0;
memset(szTime,0,sizeof(szTime));
memset(szLogType,0,sizeof(szLogType));
memset(szTemp,0,sizeof(szTemp));
GetCurrentTime(szTime);
va_start(vap,fmt);
if(iLogType==0x01)
{	
strcpy(szLogType,"ERROR");
}	
else if(iLogType==0x02)
{	
strcpy(szLogType,"DEBUG");
}
sprintf(szTemp,"[%14s][P%d][%10s][L%04d][%.6s]:\n",szTime,getpid(),pFileName,iLine,szLogType);
//iLen=strlen(pLogName)-10;
//memcpy(pLogName+iLen,&szTime[2],6);
fp=fopen(pLogName,"a+");
fprintf(fp,"%s",szTemp);
vfprintf(fp,fmt,vap);
fprintf(fp,"\n");
fflush(fp);
fclose(fp);
fprintf(stderr,"[%s][P%d][%s][%d]:",szLogType,getpid(),pFileName,iLine);
memset(szTemp,0,sizeof(szTemp));
vsprintf(szTemp,fmt,vap);
va_end(vap);
fprintf(stderr,"%s\n",szTemp);//打印到屏幕
fflush(stderr);
}


 

//demo.c

/*************************************************************    
FileName : demo.c
FileFunc : 跟踪程序执行信息并把相应执行结果记录到日志文件
Version  : V0.1    
Author   : Sunrier    
Date     : 2012-06-09
Descp    : Linux下实现跟踪程序执行信息记录日志文件  
*************************************************************/
#include <stdio.h>
#include <string.h>
#include "debug.h"
int func( int iFlag )
{
if( iFlag )
{
return 0;
}
else
{
return 1;
}		 
}
int main(int argc,char *argv[])
{
char szLogPath[100],szProcName[100],szLogName[100];
char *p = NULL;
int iRetCode = 0;
int iFlag = 0;
memset(szLogPath,0,sizeof(szLogPath));
memset(szProcName,0,sizeof(szProcName));
memset(szLogName,0,sizeof(szLogName));
p = strrchr(argv[0],'/');
sprintf(szProcName,"%s_",p);
sprintf(szLogPath,"%s/log",getenv("HOME"));
SetLogName(szLogPath,szProcName,szLogName);
iFlag = 0;
iRetCode = func( iFlag );
if( iRetCode )
{
TRACE_LOG(ERROR,szLogName,"func error,iRetCode=[%d]\n",iRetCode);
return 1;
}
TRACE_LOG(DEBUG,szLogName,"Success =[%d]\n",iRetCode);
//TRACE_LOG(DEBUG,"Success !");
return 0;
}


 

//makefile

#makefile
demo:demo.c debug.c debug.h
@gcc -o demo demo.c debug.c
clean	:
@cd /mnt/hgfs/Sunrier/code/ && \
ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | grep -v [.]sql$$ | grep -v [.]sh$$ | xargs rm -rf
#makefile	


 

这篇关于Linux下实现跟踪程序执行信息记录日志文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726136

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page