Files
repo-smod-atsc/src/loglog/loglog.c
T

127 lines
3.0 KiB
C

#include "loglog.h"
#include <fcntl.h>
#include <time.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <sys/stat.h>
#define DEBUG_ENABLE 0
#define DATE_TIME_LEN 22
#define MAX_STDIN_DATA_LEN 1024
#define MAX_BUF_LEN MAX_STDIN_DATA_LEN+DATE_TIME_LEN
#define MAX_PATH_OR_NAME_LEN 128
#define ERROR_MESSAGE "ERROR:The program may exit abnormally!\n"
#if DEBUG_ENABLE
#define debugf printf
#else
#define debugf
#endif
static char logFile[MAX_PATH_OR_NAME_LEN]={0};
static char buf[MAX_BUF_LEN];
static char dateTime[DATE_TIME_LEN+1];
static bool s_bOutput;
static void* log_task(void *arg)
{
struct tm *pTm;
time_t now;
int fd;
ssize_t size;
char *pRet;
struct stat fileStat;
const char *fileName=(const char *)arg;
int bReopen=0;
FILE_REOPEN:
fd=open(fileName,O_CREAT|O_WRONLY|O_APPEND,0644);
if(fd==-1)
{
printf("open %s error\n",fileName);
return ((void *)NULL);
}
else
{
bReopen=1;
printf("open %s successfully!\n",fileName);
}
while(1)
{
if(bReopen==0&&stat(fileName,&fileStat)==0)
{
if(fileStat.st_size==0)
{
printf("%s was recreated by the outside world so reopen %s\n",fileName,fileName);
close(fd);
goto FILE_REOPEN;
}
}
memset(buf,0,MAX_BUF_LEN);
pRet=fgets(&buf[DATE_TIME_LEN],MAX_STDIN_DATA_LEN-1,stdin);
if(pRet==NULL)
{
strcpy(&buf[DATE_TIME_LEN],ERROR_MESSAGE);
}
now=time(NULL);
pTm=localtime((const time_t *)&now);
if(pTm==NULL)
{
debugf("localtime is NULL!\n");
return (void *)NULL;
}
sprintf(dateTime,"[%04d-%02d-%02d %02d:%02d:%02d] ",
pTm->tm_year+1900,pTm->tm_mon+1,pTm->tm_mday,
pTm->tm_hour,pTm->tm_min,pTm->tm_sec);
strncpy(buf,dateTime,DATE_TIME_LEN);
debugf("dateTime:%s\n",dateTime);
if(s_bOutput)
{
printf("%s",buf);
}
size=strlen(&buf[DATE_TIME_LEN]);
size=write(fd,buf,DATE_TIME_LEN+size);
if(size>0)
{
bReopen=0;
debugf("write to %s :\nlen :%d\ndata :%s\n",fileName,size,buf);
}
if(pRet==NULL)
{
debugf(ERROR_MESSAGE);
break;
}
}
close(fd);
exit(-1);
}
void log_init(const char *logPath,const char *logName,bool bOutput)
{
pthread_t threadLog;
setvbuf(stdout, NULL, _IONBF, 0);
assert( logPath!=NULL && logName!=NULL );
sprintf(logFile,"%s%s",logPath,logName);
s_bOutput=bOutput;
printf("<%s> logPath:%s logName:%s %s\n",__FUNCTION__,logPath,logName,s_bOutput?"proutlog":"noprout");
log_task((void *)logFile);
}