#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> //#include <iostream> //#include "fun.h" //using namespace std; #define DEBUG_LOG /*this macro to control the debug print*/ #ifdef DEBUG_LOG #define LOG_ERROR(args...) do { printf("[TS][ERR]@%u:",__LINE__); printf(args); } while (0); #define LOG_PRINT(args...) do { printf("[TS][LOG]"); printf(args); } while (0); #else #define LOG_ERROR(args...) do { printf("[TS][ERR]@%u:",__LINE__); printf(args); } while (0); #define LOG_PRINT(args...) #endif static char *file_path = "log.txt"; #define MAX_LINE_CONTENT 512 /*assume the max line content.*/ static int LineContentParse(char * pInputString) { return 0; } static int InvokeType(char * pInputString) { #if 0 char* cre="create"; char* upd="update"; char* del="delete"; char* ins="insert"; if ( strncmp(pInputString,cre,strlen(cre))== 0 ) { } if ( strncmp(pInputString,upd,strlen(upd))== 0 ) { } #endif return 0; } int main(int iArgc, char * apcArgv []) { FILE *fp=NULL; FILE *fp_reserved=NULL; char *pBuffer=NULL; char *pBuffer_reserved=NULL;/*if you use stesep , use this point to free the memory!!!!!*/ char* end_mark1="/*!*/;"; char* end_mark2="'/*!*/;"; /*check the file was exist or not.*/ if ( access(file_path,0) ) { LOG_ERROR(" FILE DOESN'T EXISIT! "); exit(-1); } /*open and check */ fp = fopen(file_path, "r"); if( NULL == fp) { LOG_ERROR(" open file:%s failed ",file_path); exit(-1); } fcntl(fileno(fp), F_SETFD, FD_CLOEXEC); fp_reserved = fp;/*maybe you need it.*/ /*remind: donot allocate memory from stack , please allocate memory from heap, that is for programer.*/ pBuffer = (char *)malloc(sizeof(char)*MAX_LINE_CONTENT); if(!pBuffer) { LOG_ERROR(" memory allocate faied "); goto error_one; } /*remind: clear the buffer once you allocate from the heap*/ memset(pBuffer,0,MAX_LINE_CONTENT); while( (fgets (pBuffer, MAX_LINE_CONTENT, fp))!= NULL )/*every time , fp will move to another line*/ { pBuffer_reserved = pBuffer; /*suggest api of string operation:strstr/strsep*/ /*step1: check the line valid or not, if the line is empty ?*/ /*step2: check the mark*/ if(strstr(pBuffer, end_mark1)!=NULL || strstr(pBuffer, end_mark2)!=NULL ) { //LOG_PRINT(" +++++FIT "); /*step3: strsep the string, and check more.*/ /*give you a example: http://baike.baidu.com/view/2466295.htm*/ printf(" "); LOG_PRINT(" buffer-before: %s ",pBuffer); //!!!!!strsep will change the point of pBuffer. LOG_PRINT(" buffer-after: %s ",strsep(&pBuffer_reserved,end_mark1)); #if 0 if( Index_KMP (fp_reserved, key, fp)) { /*do your operation here.*/ InvokeType(); } #endif } /*clear the data since it will be used for next line.*/ memset(pBuffer,0,MAX_LINE_CONTENT); } /*actually, you can use sleep to debug your code , that is a usefull way.*/ //sleep(2); error_two: free(pBuffer); pBuffer_reserved=NULL;/*donot forget to set the point to NULL.*/ pBuffer=NULL; error_one: fclose(fp); fp = NULL; return 0; }
LOG:
[xichen@SSDEV002 file_tansen]$ gcc mysql_log_analysis.c [xichen@SSDEV002 file_tansen]$ ./a.out [TS][LOG] buffer-before: DELIMITER /*!*/; [TS][LOG] buffer-after: DELIMITER [TS][LOG] buffer-before: ROLLBACK/*!*/; [TS][LOG] buffer-after: ROLLBACK [TS][LOG] buffer-before: '/*!*/; [TS][LOG] buffer-after: ' [TS][LOG] buffer-before: use `tansen`/*!*/; [TS][LOG] buffer-after: use `tansen` [TS][LOG] buffer-before: SET TIMESTAMP=1383996813/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1383996813 [TS][LOG] buffer-before: SET @@session.pseudo_thread_id=36/*!*/; [TS][LOG] buffer-after: SET @@session.pseudo_thread_id=36 [TS][LOG] buffer-before: SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; [TS][LOG] buffer-after: SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1 [TS][LOG] buffer-before: SET @@session.sql_mode=0/*!*/; [TS][LOG] buffer-after: SET @@session.sql_mode=0 [TS][LOG] buffer-before: SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; [TS][LOG] buffer-after: SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1 [TS][LOG] buffer-before: /*!C gbk *//*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=8/*!*/; [TS][LOG] buffer-after: SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=8 [TS][LOG] buffer-before: SET @@session.lc_time_names=0/*!*/; [TS][LOG] buffer-after: SET @@session.lc_time_names=0 [TS][LOG] buffer-before: SET @@session.collation_database=DEFAULT/*!*/; [TS][LOG] buffer-after: SET @@session.collation_database=DEFAULT [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: use `mysql`/*!*/; [TS][LOG] buffer-after: use `mysql` [TS][LOG] buffer-before: SET TIMESTAMP=1383997879/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1383997879 [TS][LOG] buffer-before: /*!C utf8 *//*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; [TS][LOG] buffer-after: SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1383997891/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1383997891 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: DELIMITER /*!*/; [TS][LOG] buffer-after: DELIMITER [TS][LOG] buffer-before: ROLLBACK/*!*/; [TS][LOG] buffer-after: ROLLBACK [TS][LOG] buffer-before: '/*!*/; [TS][LOG] buffer-after: ' [TS][LOG] buffer-before: DELIMITER /*!*/; [TS][LOG] buffer-after: DELIMITER [TS][LOG] buffer-before: '/*!*/; [TS][LOG] buffer-after: ' [TS][LOG] buffer-before: SET TIMESTAMP=1384356654/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356654 [TS][LOG] buffer-before: SET @@session.pseudo_thread_id=36/*!*/; [TS][LOG] buffer-after: SET @@session.pseudo_thread_id=36 [TS][LOG] buffer-before: SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; [TS][LOG] buffer-after: SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1 [TS][LOG] buffer-before: SET @@session.sql_mode=0/*!*/; [TS][LOG] buffer-after: SET @@session.sql_mode=0 [TS][LOG] buffer-before: SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; [TS][LOG] buffer-after: SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1 [TS][LOG] buffer-before: /*!C gbk *//*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=8/*!*/; [TS][LOG] buffer-after: SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=8 [TS][LOG] buffer-before: SET @@session.lc_time_names=0/*!*/; [TS][LOG] buffer-after: SET @@session.lc_time_names=0 [TS][LOG] buffer-before: SET @@session.collation_database=DEFAULT/*!*/; [TS][LOG] buffer-after: SET @@session.collation_database=DEFAULT [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: use `tansen`/*!*/; [TS][LOG] buffer-after: use `tansen` [TS][LOG] buffer-before: SET TIMESTAMP=1384356654/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356654 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356672/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356672 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356672/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356672 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356701/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356701 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356701/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356701 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356719/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356719 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356719/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356719 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356758/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356758 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356758/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356758 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356861/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356861 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356861/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356861 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [TS][LOG] buffer-before: SET TIMESTAMP=1384356923/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356923 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: SET TIMESTAMP=1384356923/*!*/; [TS][LOG] buffer-after: SET TIMESTAMP=1384356923 [TS][LOG] buffer-before: /*!*/; [TS][LOG] buffer-after: [TS][LOG] buffer-before: COMMIT/*!*/; [TS][LOG] buffer-after: COMMIT [xichen@SSDEV002 file_tansen]$