libf 2 yıl önce
ebeveyn
işleme
72608000f1
7 değiştirilmiş dosya ile 1025 ekleme ve 989 silme
  1. 841 782
      abc/ab_code.c
  2. 20 3
      abc/ab_code.h
  3. 139 110
      abc/log.c
  4. 25 8
      abc/log_test.c
  5. 0 20
      abc/log_test.dSYM/Contents/Info.plist
  6. 0 14
      abc/logs/test.txt
  7. 0 52
      abc/logs/test20230320.txt

Dosya farkı çok büyük olduğundan ihmal edildi
+ 841 - 782
abc/ab_code.c


+ 20 - 3
abc/ab_code.h

@@ -116,11 +116,23 @@ extern function_on_ablog_reinitialized on_ablog_reinitialized;
  * 获取日志输出标记
  */
 int get_log_print_level();
+/**
+ * 是否通过程序设置过ablog相关参数
+ */
+int ablog_print();
 /**
  * 格式化输出日志
  */
 void log_println(const char *func, const char *file, int line, const char *format, ...);
-void log_println_vl(const char *func, const char *file, int line, const char *format, va_list vl);
+/**
+ * @param fileout 0 输出到 stdout, 1 输出到通过 set_log_filename 设置的文件
+ * @param func 代码标记
+ * @param file 代码文件
+ * @param line 代码行
+ * @param format 格式
+ * @param vl va_list
+ */
+void log_println_vl(int fileout, const char *func, const char *file, int line, const char *format, va_list vl);
 
 ////////////// end of ABLOG definition ////////////////////////////////////////////////
 
@@ -151,8 +163,8 @@ struct pattern_instance
 {
 	char pattern[MAX_FILEPATH_LENGTH];
 	time_t instantiated_time; //实例化时间
-	time_t expiration_ct; //系统当前时间
-	time_t expiration_vt; //虚拟当前时间
+	time_t expiration_ct; //文件实例名过期时间,以系统时间表示
+	time_t expiration_vt; //文件实例名过期时间,以虚拟时间表示
 	int instance_buf_len;
 	char instance[MAX_FILEPATH_LENGTH]; //实际可用字节数由instance_buf_len指定,并分配内存相应内存
 };
@@ -160,6 +172,8 @@ struct pattern_instance
 void set_log_filename(char *filepath_pattern);
 void set_log_keephours(int keep_hours);
 void set_log_stdout(int yn);
+int ablog_stdout();
+int ablog_file();
 
 /**
  * 实例化一个模式字符串
@@ -258,6 +272,9 @@ long read_mapping_file(int fd);
  */
 int write_mapping_file(int fd, long mid);
 
+
+int mk_parent_dir(char *filepath);
+
 ///////////////////////////// ABLOG_ComponentUnit /////////////////////////////
 #ifndef ABLOG_ComponentUnit
 #define ABLOG_ComponentUnit

+ 139 - 110
abc/log.c

@@ -6,155 +6,184 @@
 
 #define MAX_CALLBACKS 32
 
-typedef struct {
-  log_LogFn fn;
-  void *udata;
-  int level;
+typedef struct
+{
+    log_LogFn fn;
+    void *udata;
+    int level;
 } Callback;
 
-static struct {
-  void *udata;
-  log_LockFn lock;
-  int level;
-  bool quiet;
-  Callback callbacks[MAX_CALLBACKS];
+static struct
+{
+    void *udata;
+    log_LockFn lock;
+    int level;
+    bool quiet;
+    Callback callbacks[MAX_CALLBACKS];
 } L;
 
-// static const char *level_strings[] = {
-//   "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"
-// };
 static const char *level_strings[] = {
-  "T", "D", "I", "W", "E", "F"
-};
+    "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"};
+static const char *level_chars[] = {
+    "T", "D", "I", "W", "E", "F"};
 
 #ifdef LOG_USE_COLOR
 static const char *level_colors[] = {
-  "\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"
-};
+    "\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"};
 #endif
 
-
-static void stdout_callback(log_Event *ev) {
-  char buf[16];
-  buf[strftime(buf, sizeof(buf), "%H:%M:%S", ev->time)] = '\0';
+static void stdout_callback(log_Event *ev)
+{
+    char buf[16];
+    buf[strftime(buf, sizeof(buf), "%H:%M:%S", ev->time)] = '\0';
 #ifdef LOG_USE_COLOR
-  fprintf(
-    ev->udata, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",
-    buf, level_colors[ev->level], level_strings[ev->level],
-    ev->file, ev->line);
+    fprintf(
+        ev->udata, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",
+        buf, level_colors[ev->level], level_strings[ev->level],
+        ev->file, ev->line);
 #else
-  fprintf(
-    ev->udata, "%s %-5s %s:%d: ",
-    buf, level_strings[ev->level], ev->file, ev->line);
+    fprintf(
+        ev->udata, "%s %-5s %s:%d: ",
+        buf, level_strings[ev->level], ev->file, ev->line);
 #endif
-  vfprintf(ev->udata, ev->fmt, ev->ap);
-  fprintf(ev->udata, "\n");
-  fflush(ev->udata);
+    vfprintf(ev->udata, ev->fmt, ev->ap);
+    fprintf(ev->udata, "\n");
+    fflush(ev->udata);
 }
 
-
-static void file_callback(log_Event *ev) {
-  char buf[64];
-  buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ev->time)] = '\0';
-  fprintf(
-    ev->udata, "%s %-5s %s:%d: ",
-    buf, level_strings[ev->level], ev->file, ev->line);
-  vfprintf(ev->udata, ev->fmt, ev->ap);
-  fprintf(ev->udata, "\n");
-  fflush(ev->udata);
+static void file_callback(log_Event *ev)
+{
+    char buf[64];
+    buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ev->time)] = '\0';
+    fprintf(
+        ev->udata, "%s %-5s %s:%d: ",
+        buf, level_strings[ev->level], ev->file, ev->line);
+    vfprintf(ev->udata, ev->fmt, ev->ap);
+    fprintf(ev->udata, "\n");
+    fflush(ev->udata);
 }
 
-
-static void lock(void)   {
-  if (L.lock) { L.lock(true, L.udata); }
+static void lock(void)
+{
+    if (L.lock)
+    {
+        L.lock(true, L.udata);
+    }
 }
 
-
-static void unlock(void) {
-  if (L.lock) { L.lock(false, L.udata); }
+static void unlock(void)
+{
+    if (L.lock)
+    {
+        L.lock(false, L.udata);
+    }
 }
 
-
-const char* log_level_string(int level) {
-  return level_strings[level];
+const char *log_level_string(int level)
+{
+    return level_strings[level];
 }
 
-
-void log_set_lock(log_LockFn fn, void *udata) {
-  L.lock = fn;
-  L.udata = udata;
+void log_set_lock(log_LockFn fn, void *udata)
+{
+    L.lock = fn;
+    L.udata = udata;
 }
 
-
-void log_set_level(int level) {
-  L.level = level;
+void log_set_level(int level)
+{
+    L.level = level;
 }
 
-
-void log_set_quiet(bool enable) {
-  L.quiet = enable;
+void log_set_quiet(bool enable)
+{
+    L.quiet = enable;
 }
 
-
-int log_add_callback(log_LogFn fn, void *udata, int level) {
-  for (int i = 0; i < MAX_CALLBACKS; i++) {
-    if (!L.callbacks[i].fn) {
-      L.callbacks[i] = (Callback) { fn, udata, level };
-      return 0;
+int log_add_callback(log_LogFn fn, void *udata, int level)
+{
+    for (int i = 0; i < MAX_CALLBACKS; i++)
+    {
+        if (!L.callbacks[i].fn)
+        {
+            L.callbacks[i] = (Callback){fn, udata, level};
+            return 0;
+        }
     }
-  }
-  return -1;
+    return -1;
 }
 
+int log_add_fp(FILE *fp, int level)
+{
+    return log_add_callback(file_callback, fp, level);
+}
 
-int log_add_fp(FILE *fp, int level) {
-  return log_add_callback(file_callback, fp, level);
+static void init_event(log_Event *ev, void *udata)
+{
+    if (!ev->time)
+    {
+        time_t t = time(NULL);
+        ev->time = localtime(&t);
+    }
+    ev->udata = udata;
 }
 
+static int ablog_level = -1;
 
-static void init_event(log_Event *ev, void *udata) {
-  if (!ev->time) {
-    time_t t = time(NULL);
-    ev->time = localtime(&t);
-  }
-  ev->udata = udata;
-}
+void log_log(int level, const char *file, int line, const char *fmt, ...)
+{
+    if (level < LOG_TRACE || level > LOG_FATAL)
+    {
+        return;
+    }
 
-void log_log(int level, const char *file, int line, const char *fmt, ...) {
-    if (level >= L.level) {
-        va_list vl;
-        va_start(vl, fmt);
-        log_println_vl(level_strings[level], file, line, fmt, vl);
-        va_end(vl);
+    if (ablog_print())
+    {
+        if (ablog_file() && level >= L.level)
+        {
+            va_list vl;
+            va_start(vl, fmt);
+            log_println_vl(1, level_chars[level], file, line, fmt, vl);
+            va_end(vl);
+        }
+
+        if (ablog_stdout() && level >= L.level)
+        {
+            va_list vl;
+            va_start(vl, fmt);
+            log_println_vl(0, level_chars[level], file, line, fmt, vl);
+            va_end(vl);
+        }
+    }
+
+    log_Event ev = {
+        .fmt = fmt,
+        .file = file,
+        .line = line,
+        .level = level,
+    };
+
+    lock();
+
+    if (!L.quiet && level >= L.level)
+    {
+        init_event(&ev, stderr);
+        va_start(ev.ap, fmt);
+        stdout_callback(&ev);
+        va_end(ev.ap);
     }
-}
 
-void log_log_x(int level, const char *file, int line, const char *fmt, ...) {
-  log_Event ev = {
-    .fmt   = fmt,
-    .file  = file,
-    .line  = line,
-    .level = level,
-  };
-
-  lock();
-
-  if (!L.quiet && level >= L.level) {
-    init_event(&ev, stderr);
-    va_start(ev.ap, fmt);
-    stdout_callback(&ev);
-    va_end(ev.ap);
-  }
-
-  for (int i = 0; i < MAX_CALLBACKS && L.callbacks[i].fn; i++) {
-    Callback *cb = &L.callbacks[i];
-    if (level >= cb->level) {
-      init_event(&ev, cb->udata);
-      va_start(ev.ap, fmt);
-      cb->fn(&ev);
-      va_end(ev.ap);
+    for (int i = 0; i < MAX_CALLBACKS && L.callbacks[i].fn; i++)
+    {
+        Callback *cb = &L.callbacks[i];
+        if (level >= cb->level)
+        {
+            init_event(&ev, cb->udata);
+            va_start(ev.ap, fmt);
+            cb->fn(&ev);
+            va_end(ev.ap);
+        }
     }
-  }
 
-  unlock();
+    unlock();
 }

+ 25 - 8
abc/log_test.c

@@ -13,24 +13,41 @@
 #include <time.h>
 #include <sys/time.h>
 
-#include "ab_code.h" 
+#include "ab_code.h"
 #include "log.h"
 
 int main(int argc, char *argv[])
 {
-    set_log_filename("./logs/test[PID][YYYY][MM][DD].txt");
-    set_log_keephours(1);
-    set_log_stdout(1);
+    log_trace("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+    log_debug("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+    log_info("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+    log_warn("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+    log_error("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+    log_fatal("https://github.com/rxi/log.c 开源日志输出库原始输出样式");
+
+    set_log_filename("./_logs/test[yyyy][mm][dd].txt"); // 设置日志输出文件名
+    set_log_keephours(1); // 设置日志文件保留小时数
+    set_log_stdout(1); // 打开标准输出信息打印
+    log_set_quiet(1); // 关闭标准错误信息打印
 
     log_trace("log trace ok");
 
-    log_set_level(LOG_DEBUG);
-    log_trace("log trace -------  ERROR!");
+    log_set_level(LOG_DEBUG); // 设置日志级别
+    log_trace("log trace -------  ERROR!"); // 验证日志级别
     log_debug("log debug ok");
     log_info("log info ok");
     log_warn("log warn ok");
     log_error("log error ok");
-    
+
+    log_set_level(LOG_INFO); // 设置日志级别
+    log_trace("log trace -------  ERROR!"); // 验证日志级别
+    log_debug("log debug -------  ERROR!"); // 验证日志级别
+    log_set_level(LOG_WARN); // 设置日志级别
+    log_trace("log trace -------  ERROR!"); // 验证日志级别
+    log_debug("log debug -------  ERROR!"); // 验证日志级别
+    log_info("log debug -------  ERROR!"); // 验证日志级别
+
+    log_fatal("log fatal ok");
+
     return 0;
 }
-

+ 0 - 20
abc/log_test.dSYM/Contents/Info.plist

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-	<dict>
-		<key>CFBundleDevelopmentRegion</key>
-		<string>English</string>
-		<key>CFBundleIdentifier</key>
-		<string>com.apple.xcode.dsym.log_test</string>
-		<key>CFBundleInfoDictionaryVersion</key>
-		<string>6.0</string>
-		<key>CFBundlePackageType</key>
-		<string>dSYM</string>
-		<key>CFBundleSignature</key>
-		<string>????</string>
-		<key>CFBundleShortVersionString</key>
-		<string>1.0</string>
-		<key>CFBundleVersion</key>
-		<string>1</string>
-	</dict>
-</plist>

+ 0 - 14
abc/logs/test.txt

@@ -1,14 +0,0 @@
-2023-03-20 18:52:04.251[ABLOG_FILE]:./logs/test.txt (ab_code.c,352)
-2023-03-20 18:52:04.251[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 18:52:04.250[]:[I] <----------------------------------------------------------------> (log_test.c,24)
-2023-03-20 18:58:29.673[ABLOG_FILE]:./logs/test.txt (ab_code.c,352)
-2023-03-20 18:58:29.673[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 18:58:29.672[]:[I] <----------------------------------------------------------------> (log_test.c,24)
-2023-03-20 19:19:29.176[ABLOG_FILE]:./logs/test.txt (ab_code.c,352)
-2023-03-20 19:19:29.176[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:19:29.175[]:[I] <----------------------------------------------------------------> (log_test.c,24)
-2023-03-20 19:37:23.378[ABLOG_FILE]:./logs/test.txt (ab_code.c,352)
-2023-03-20 19:37:23.378[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:37:23.377[]:[I] <----------------------------------------------------------------> (log_test.c,24)
-2023-03-20 19:38:13.470[ABLOG_FILE]:./logs/test.txt (ab_code.c,352)
-2023-03-20 19:38:13.469[]:[I] <----------------------------------------------------------------> (log_test.c,24)

+ 0 - 52
abc/logs/test20230320.txt

@@ -1,52 +0,0 @@
-2023-03-20 19:38:54.685[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:38:54.685[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:38:54.684[]:[I] <----------------------------------------------------------------> (log_test.c,26)
-2023-03-20 19:38:54.685[T]:log trace (log_test.c,28)
-2023-03-20 19:39:45.653[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:39:45.652[]:[I] <----------------------------------------------------------------> (log_test.c,26)
-2023-03-20 19:39:45.653[T]:log trace (log_test.c,28)
-2023-03-20 19:40:14.426[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:40:14.426[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:40:14.425[]:[I] <----------------------------------------------------------------> (log_test.c,26)
-2023-03-20 19:40:14.426[T]:log trace (log_test.c,28)
-2023-03-20 19:41:06.753[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:41:06.753[T]:log trace (log_test.c,25)
-2023-03-20 19:41:56.930[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:41:56.930[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:41:56.929[T]:log trace (log_test.c,25)
-2023-03-20 19:41:56.930[D]:log debug (log_test.c,26)
-2023-03-20 19:41:56.930[I]:log info (log_test.c,27)
-2023-03-20 19:41:56.930[W]:log warn (log_test.c,28)
-2023-03-20 19:41:56.930[E]:log error (log_test.c,29)
-2023-03-20 19:44:23.277[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:44:23.278[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:44:23.276[D]:log debug (log_test.c,26)
-2023-03-20 19:44:23.278[I]:log info (log_test.c,27)
-2023-03-20 19:44:23.278[W]:log warn (log_test.c,28)
-2023-03-20 19:44:23.278[E]:log error (log_test.c,29)
-2023-03-20 19:45:40.164[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:45:40.165[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:45:40.164[T]:log trace (log_test.c,23)
-2023-03-20 19:45:40.165[D]:log debug (log_test.c,27)
-2023-03-20 19:45:40.165[I]:log info (log_test.c,28)
-2023-03-20 19:45:40.165[W]:log warn (log_test.c,29)
-2023-03-20 19:45:40.165[E]:log error (log_test.c,30)
-2023-03-20 19:46:08.718[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:46:08.717[T]:log trace ok (log_test.c,23)
-2023-03-20 19:46:08.718[D]:log debug ok (log_test.c,27)
-2023-03-20 19:46:08.718[I]:log info ok (log_test.c,28)
-2023-03-20 19:46:08.718[W]:log warn ok (log_test.c,29)
-2023-03-20 19:46:08.718[E]:log error ok (log_test.c,30)
-2023-03-20 19:51:18.802[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,352)
-2023-03-20 19:51:18.802[ABLOG_FILE]:0 old log files removed (ab_code.c,313)
-2023-03-20 19:51:18.801[T]:log trace ok (log_test.c,23)
-2023-03-20 19:51:18.803[D]:log debug ok (log_test.c,27)
-2023-03-20 19:51:18.803[I]:log info ok (log_test.c,28)
-2023-03-20 19:51:18.803[W]:log warn ok (log_test.c,29)
-2023-03-20 19:51:18.803[E]:log error ok (log_test.c,30)
-2023-03-20 19:51:49.487[ABLOG_FILE]:./logs/test20230320.txt (ab_code.c,360)
-2023-03-20 19:51:49.486[T]:log trace ok (log_test.c,25)
-2023-03-20 19:51:49.487[D]:log debug ok (log_test.c,29)
-2023-03-20 19:51:49.487[I]:log info ok (log_test.c,30)
-2023-03-20 19:51:49.487[W]:log warn ok (log_test.c,31)
-2023-03-20 19:51:49.487[E]:log error ok (log_test.c,32)