📄 log.c
字号:
#include "log.h"/* Initialize LOG */LOG *log_init(char *logfile){ LOG *log = (LOG *)calloc(1, sizeof(LOG)); if(log) { log->add = log_add; log->close = log_close; if(logfile) { strcpy(log->file, logfile); pthread_mutex_init(&(log->mutex), NULL); if( (log->fd = open(log->file, O_CREAT |O_WRONLY |O_APPEND, 0644)) <= 0 ) { fprintf(stderr, "FATAL:open log file[%s] failed, %s", logfile, strerror(errno)); log->close(log); } } else { log->fd = 1; } } return log;}/* Add log */void log_add(LOG *log, char *__file__, int __line__, const char* __FUNC__, int __level__, char *format, ...){ va_list ap; char buf[LOG_LINE_LIMIT]; char *s = buf; struct timeval tv; time_t timep; struct tm *p = NULL; int n = 0; if(log) { pthread_mutex_lock(&(log->mutex)); if(log->fd) { gettimeofday(&tv, NULL); time(&timep); p = localtime(&timep); n = sprintf(s, "[%02d/%s/%04d:%02d:%02d:%02d +%06u] [%04x/%08x] #%s::%d::%s# \"%s:", p->tm_mday, ymonths[p->tm_mon], (1900+p->tm_year), p->tm_hour, p->tm_min, p->tm_sec, (size_t)tv.tv_usec, (size_t)getpid(), (size_t)pthread_self(), __file__, __line__, __FUNC__, _log_level_s[__level__]); /*#else n = sprintf(s, "[%02d/%s/%04d:%02d:%02d:%02d +%06u] [%u] #%s::%d# \"%s:", p->tm_mday, ymonths[p->tm_mon], (1900+p->tm_year), p->tm_hour, p->tm_min, p->tm_sec, (size_t)tv.tv_usec, (size_t)getpid(), __file__, __line__, _log_level_s[__level__]);#endif */ s += n; va_start(ap, format); n = vsprintf(s, format, ap); va_end(ap); s += n; n = sprintf(s, "\"\n"); s += n; n = s - buf; if(write(log->fd, buf, n) != n) { fprintf(stderr, "FATAL:Writting LOG failed, %s", strerror(errno)); close(log->fd); log->fd = 0; } } pthread_mutex_unlock(&(log->mutex)); } }/* Close log */void log_close(LOG *log){ if(log) { if(log->fd > 0 ) close(log->fd); pthread_mutex_destroy(&(log->mutex)); free(log); log = NULL; } }#ifdef _DEBUG_LOGint main(){ LOG *log = log_init("/tmp/test.log"); if(log) { DEBUG_LOG(log, "调试信息 %s", "DEBUG"); WARN_LOG(log, "警告信息 %s", "WARN"); ERROR_LOG(log, "错误信息 %s", "ERROR"); FATAL_LOG(log, "致命信息 %s", "FATAL"); /* log->add(log, __FILE__, __LINE__, __DEBUG__, "调试信息 %s", "OK1"); log->add(log, __FILE__, __LINE__, __WARN__, "警告信息 %s", "WARN"); log->add(log, __FILE__, __LINE__, __ERROR__, "错误信息 %s", "ERROR"); log->add(log, __FILE__, __LINE__, __FATAL__, "致命信息 %s", "FATAL"); */ log->close(log); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -