瀏覽代碼

feat: log新增track等级

SongZihuan 3 年之前
父節點
當前提交
a8ff71089b
共有 16 個文件被更改,包括 132 次插入119 次删除
  1. 16 13
      include/tool/log.h
  2. 2 3
      include/tool/mem.h
  3. 7 7
      src/core/core_init.c
  4. 14 14
      src/core/env.c
  5. 13 13
      src/core/gc.c
  6. 2 2
      src/core/lexical.c
  7. 2 2
      src/core/parser.c
  8. 3 4
      src/core/run.c
  9. 2 2
      src/core/syntactic.c
  10. 18 17
      src/main.c
  11. 3 3
      src/main_build.c
  12. 2 2
      src/main_run.c
  13. 11 11
      src/runtime/aFunlang.c
  14. 1 1
      src/runtime/base/base.c
  15. 1 1
      src/runtime/base/str_obj.c
  16. 35 24
      src/tool/log.c

+ 16 - 13
include/tool/log.h

@@ -5,12 +5,13 @@
 #include "macro.h"
 
 enum LogLevel {
-    log_debug = 0,
-    log_info = 1,
-    log_warning = 2,
-    log_error = 3,
-    log_send_error = 4,
-    log_fatal_error = 5,
+    log_track = 0,
+    log_debug = 1,
+    log_info = 2,
+    log_warning = 3,
+    log_error = 4,
+    log_send_error = 5,
+    log_fatal_error = 6,
 };
 typedef enum LogLevel LogLevel;
 
@@ -23,9 +24,9 @@ enum LogFactoryPrintConsole {
 typedef enum LogFactoryPrintConsole LogFactoryPrintConsole;
 
 enum LogLoggerPrintConsole {
-    log_default = 0,  // 默认
-    log_print_console,  // 不显示到终端
-    log_print_no_console,  // 只显示到终端
+    log_d = 0,  // 默认
+    log_c,  // 不显示到终端
+    log_n,  // 只显示到终端
 };
 typedef enum LogLoggerPrintConsole LogLoggerPrintConsole;
 
@@ -44,12 +45,13 @@ AFUN_TOOL_EXPORT int initLogSystem(FilePath path, LogFactoryPrintConsole print_c
 AFUN_TOOL_EXPORT void initLogger(Logger *logger, char *id, LogLevel level);
 AFUN_TOOL_EXPORT void destructLogger(Logger *logger);
 
+AFUN_TOOL_EXPORT int writeTrackLog_(Logger *logger, char *file, int line, char *func, char *format, ...);
 AFUN_TOOL_EXPORT int writeDebugLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...);
 AFUN_TOOL_EXPORT int writeInfoLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...);
 AFUN_TOOL_EXPORT int writeWarningLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...);
 AFUN_TOOL_EXPORT int writeErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...);
-AFUN_TOOL_EXPORT int writeSendErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...);
-AFUN_TOOL_EXPORT int writeFatalErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, int exit_code, char *format, ...);
+AFUN_TOOL_EXPORT int writeSendErrorLog_(Logger *logger, char *file, int line, char *func, char *format, ...);
+AFUN_TOOL_EXPORT int writeFatalErrorLog_(Logger *logger, char *file, int line, char *func, int exit_code, char *format, ...);
 
 #ifdef __FILENAME__
 #define file_line (char *)__FILENAME__ , (int)__LINE__
@@ -57,12 +59,13 @@ AFUN_TOOL_EXPORT int writeFatalErrorLog_(Logger *logger, LogLoggerPrintConsole p
 #define file_line (char *)"xx", (int)__LINE__
 #endif
 
+#define writeTrackLog(logger, ...) writeTrackLog_(logger, file_line, (char *)__FUNCTION__, __VA_ARGS__)
 #define writeDebugLog(logger, pc, ...) writeDebugLog_(logger, pc, file_line, (char *)__FUNCTION__, __VA_ARGS__)
 #define writeInfoLog(logger, pc, ...) writeInfoLog_(logger, pc, file_line, (char *)__FUNCTION__, __VA_ARGS__)
 #define writeWarningLog(logger, pc, ...) writeWarningLog_(logger, pc, file_line, (char *)__FUNCTION__, __VA_ARGS__)
 #define writeErrorLog(logger, pc, ...) writeErrorLog_(logger, pc, file_line, (char *)__FUNCTION__, __VA_ARGS__)
-#define writeSendErrorLog(logger, pc, ...) writeSendErrorLog_(logger, pc, file_line, (char *)__FUNCTION__, __VA_ARGS__)
-#define writeFatalErrorLog(logger, pc, exit_code, ...) writeFatalErrorLog_(logger, pc, file_line, (char *)__FUNCTION__, exit_code, __VA_ARGS__)
+#define writeSendErrorLog(logger, ...) writeSendErrorLog_(logger, file_line, (char *)__FUNCTION__, __VA_ARGS__)
+#define writeFatalErrorLog(logger, exit_code, ...) writeFatalErrorLog_(logger, file_line, (char *)__FUNCTION__, exit_code, __VA_ARGS__)
 
 #define assertDebugLog(c, logger, pc, ...) ((c) || writeDebugLog(logger, pc, "Assert " #c " error : " __VA_ARGS__))
 #define assertInfoLog(c, logger, pc, ...) ((c) || writeInfoLog(logger, pc, "Assert " #c " error : " __VA_ARGS__))

+ 2 - 3
include/tool/mem.h

@@ -16,9 +16,8 @@
 static void *safeCalloc(size_t n, size_t size);
 static void *safeCalloc(size_t n, size_t size) {
     void *re = calloc(n, size);
-    if (re == NULL) {
-        writeFatalErrorLog(NULL, log_default, EXIT_FAILURE, "The calloc error.");
-    }
+    if (re == NULL)
+        writeFatalErrorLog(NULL, EXIT_FAILURE, "The memory error");
     return re;
 }
 

+ 7 - 7
src/core/core_init.c

@@ -53,24 +53,24 @@ bool aFunCoreInit(aFunCoreInitInfo *info) {
     aFunCoreLogger->process_fatal_error = info->se;
     aFunCoreLogger->buf = info->buf;
 
-    writeInfoLog(aFunCoreLogger, log_default, "aFunCore init success");
-    writeInfoLog(aFunCoreLogger, log_default, "aFunCore log path: %s", log_path);
-    writeInfoLog(aFunCoreLogger, log_default, "aFunCore var/lib path: %s", varlib_path);
-    writeInfoLog(aFunCoreLogger, log_default, "aFunCore lang path: %s", lang_path);
+    writeDebugLog(aFunCoreLogger, log_d, "aFunCore init success");
+    writeDebugLog(aFunCoreLogger, log_d, "aFunCore log path: %s", log_path);
+    writeDebugLog(aFunCoreLogger, log_d, "aFunCore var/lib path: %s", varlib_path);
+    writeDebugLog(aFunCoreLogger, log_d, "aFunCore lang path: %s", lang_path);
 
     char LANG[100] = {0};
     char *LANG_path = strJoin(lang_path, "LANG", false, false);
     FILE *LANG_file = fopen(LANG_path, "r");
-    writeDebugLog(aFunCoreLogger, log_default, "LANG_path = %s", LANG_path);
+    writeDebugLog(aFunCoreLogger, log_d, "LANG_path = %s", LANG_path);
     if (LANG_file != NULL) {
         fgets(LANG, 100, LANG_file);
         if (LANG[strlen(LANG) - 1] == '\n')
             LANG[strlen(LANG) - 1] = NUL;  // 去除`\n`
-        writeDebugLog(aFunCoreLogger, log_default, "LANG = %s", LANG);
+        writeDebugLog(aFunCoreLogger, log_d, "LANG = %s", LANG);
 
         char *LANG_lib = strJoin(lang_path, LANG, false, false);
         if (HT_initGetText(LANG_lib) == 0)
-            writeInfoLog(aFunCoreLogger, log_default, "aFunCore lang init: %s", LANG_lib);
+            writeDebugLog(aFunCoreLogger, log_d, "aFunCore lang init: %s", LANG_lib);
         free(LANG_lib);
         fclose(LANG_file);
     } else

+ 14 - 14
src/core/env.c

@@ -685,17 +685,17 @@ int32_t *findEnvVarNumber(char *name, af_Environment *env) {
 
 static void mp_NORMAL(af_Message *msg, bool is_gc, af_Environment *env) {
     if (msg->msg == NULL || *(af_Object **)msg->msg == NULL) {
-        writeErrorLog(aFunCoreLogger, log_default, "NORMAL msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, log_d, "NORMAL msg: %p error", msg->msg);
         return;
     }
     gc_delReference(*(af_Object **)msg->msg);
     if (!is_gc)
-        writeInfoLog(aFunCoreLogger, log_default, "NORMAL Point: %p", *(af_Object **)msg->msg);
+        writeDebugLog(aFunCoreLogger, log_d, "NORMAL Point: %p", *(af_Object **)msg->msg);
 }
 
 static void mp_ERROR(af_Message *msg, bool is_gc, af_Environment *env) {
     if (msg->msg == NULL || *(af_ErrorInfo **)msg->msg == NULL) {
-        writeErrorLog(aFunCoreLogger, log_default, "ERROR msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, log_d, "ERROR msg: %p error", msg->msg);
         return;
     }
     if (!is_gc)
@@ -705,20 +705,20 @@ static void mp_ERROR(af_Message *msg, bool is_gc, af_Environment *env) {
 
 static void mp_IMPORT(af_Message *msg, bool is_gc, af_Environment *env) {
     if (msg->msg == NULL || *(af_ImportInfo **)msg->msg == NULL) {
-        writeErrorLog(aFunCoreLogger, log_default, "IMPORT msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, log_d, "IMPORT msg: %p error", msg->msg);
         return;
     }
     af_ImportInfo *ii = *(af_ImportInfo **)msg->msg;
     if (ii->obj == NULL) {
-        writeInfoLog(aFunCoreLogger, log_default, "IMPORT msg: %p do not get obj", msg->msg);
+        writeDebugLog(aFunCoreLogger, log_d, "IMPORT msg: %p do not get obj", msg->msg);
         return;
     }
 
     if (ii->mark != NULL) {
         makeVarToProtectVarSpace(ii->mark, 3, 3, 3, ii->obj, env);
-        writeInfoLog(aFunCoreLogger, log_default, "IMPORT point: [%s] %p", ii->mark, ii->obj);
+        writeDebugLog(aFunCoreLogger, log_d, "IMPORT point: [%s] %p", ii->mark, ii->obj);
     } else
-        writeInfoLog(aFunCoreLogger, log_default, "IMPORT point: <no-name> %p", ii->obj);
+        writeDebugLog(aFunCoreLogger, log_d, "IMPORT point: <no-name> %p", ii->obj);
     freeImportInfo(ii);
 }
 
@@ -764,7 +764,7 @@ void freeEnvironment(af_Environment *env) {
     freeAllTopMsgProcess(env->process);
 
     if (!res)
-        writeErrorLog(aFunCoreLogger, log_default, "Run iterDestruct error.");
+        writeErrorLog(aFunCoreLogger, log_d, "Run iterDestruct error.");
     free(env);
 }
 
@@ -811,7 +811,7 @@ bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func,
 
 static void newActivity(af_Code *bt, const af_Code *next, bool return_first, af_Environment *env){
     if (next == NULL && env->activity->body_next == NULL && env->activity->type == act_func) {
-        writeInfoLog(aFunCoreLogger, log_default, "Tail call optimization");
+        writeTrackLog(aFunCoreLogger, "Tail call optimization");
         tailCallActivity(env->activity);
         setActivityBtTop(bt, env->activity);
         env->activity->optimization = true;
@@ -850,7 +850,7 @@ static bool isInfixFunc(af_Code *code, af_Environment *env) {
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env) {
     af_Code *next;
     next = getCodeNext(bt);
-    writeInfoLog(aFunCoreLogger, log_default, "Run execution");
+    writeTrackLog(aFunCoreLogger, "Run execution");
 
     if (bt->type != code_block || bt->block.is_empty) {
         pushMessageDown(makeERRORMessage(SYNTAX_ERROR, NOT_CODE_INFO, env), env);
@@ -873,7 +873,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     af_Object *parentheses_call = env->activity->parentheses_call;
     env->activity->parentheses_call = NULL;
 
-    writeInfoLog(aFunCoreLogger, log_default, "Run func");
+    writeTrackLog(aFunCoreLogger, "Run func");
     next = getCodeNext(bt);
     switch (bt->block.type) {
         case curly:
@@ -923,7 +923,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
 bool pushLiteralActivity(af_Code *bt, char *data, af_Object *func, af_Environment *env) {
     setActivityBtNext(bt->next, env->activity);
 
-    writeInfoLog(aFunCoreLogger, log_default, "Run literal");
+    writeTrackLog(aFunCoreLogger, "Run literal");
     newActivity(bt, bt->next, false, env);
     env->activity->is_literal = true;
     pushLiteralData(strCopy(data), env);  // FuncBody的释放导致code和literal_data释放, 所以要复制
@@ -933,7 +933,7 @@ bool pushLiteralActivity(af_Code *bt, char *data, af_Object *func, af_Environmen
 bool pushVariableActivity(af_Code *bt, af_Object *func, af_Environment *env) {
     setActivityBtNext(bt->next, env->activity);
 
-    writeInfoLog(aFunCoreLogger, log_default, "Run variable");
+    writeTrackLog(aFunCoreLogger, "Run variable");
     newActivity(bt, bt->next, false, env);
     env->activity->is_obj_func = true;
     return setFuncActivityToArg(func, env);
@@ -943,7 +943,7 @@ bool pushMacroFuncActivity(af_Object *func, af_Environment *env) {
     /* Macro是隐式调用, bt不移动 */
     /* 沿用activity */
 
-    writeInfoLog(aFunCoreLogger, log_default, "Run macro");
+    writeTrackLog(aFunCoreLogger, "Run macro");
     if (!freeVarSpaceListCount(env->activity->new_vs_count, env->activity->var_list)) { // 释放外部变量空间
         env->activity->new_vs_count = 0;
         pushMessageDown(makeERRORMessage(RUN_ERROR, FREE_VARSPACE_INFO, env), env);

+ 13 - 13
src/core/gc.c

@@ -315,7 +315,7 @@ static void freeValue(af_Environment *env) {
     for (af_ObjectData *od = env->core->gc_ObjectData, *next; od != NULL; od = next) {
         next = od->gc.next;
         if (!od->gc.info.reachable) {
-            writeInfoLog(aFunCoreLogger, log_default, "- gc free ObjectData: %p", od);
+            writeTrackLog(aFunCoreLogger, "ObjectData: %p", od);
             freeObjectData(od, env);
         }
     }
@@ -323,7 +323,7 @@ static void freeValue(af_Environment *env) {
     for (af_Object *obj = env->core->gc_Object, *next; obj != NULL; obj = next) {
         next = obj->gc.next;
         if (!obj->gc.info.reachable) {
-            writeInfoLog(aFunCoreLogger, log_default, "- gc free Object: %p", obj);
+            writeTrackLog(aFunCoreLogger, "Object: %p", obj);
             freeObjectByCore(obj, env->core);
         }
     }
@@ -331,7 +331,7 @@ static void freeValue(af_Environment *env) {
     for (af_VarSpace *vs = env->core->gc_VarSpace, *next; vs != NULL; vs = next) {
         next = vs->gc.next;
         if (!vs->gc.info.reachable) {
-            writeInfoLog(aFunCoreLogger, log_default, "- gc free VarSpace: %p", vs);
+            writeTrackLog(aFunCoreLogger, "VarSpace: %p", vs);
             freeVarSpaceByCore(vs, env->core);
         }
     }
@@ -339,7 +339,7 @@ static void freeValue(af_Environment *env) {
     for (af_Var *var = env->core->gc_Var, *next; var != NULL; var = next) {
         next = var->gc.next;
         if (!var->gc.info.reachable) {
-            writeInfoLog(aFunCoreLogger, log_default, "- gc free Var: %p", var);
+            writeTrackLog(aFunCoreLogger, "Var: %p", var);
             freeVarByCore(var, env->core);
         }
     }
@@ -417,36 +417,36 @@ void printGCByCore(af_Core *core) {
     bool success = true;
     for (af_ObjectData *od = core->gc_ObjectData; od != NULL; od = od->gc.next) {
         if (od->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_default, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, log_d, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
             success = false;
         } else
-            writeInfoLog(aFunCoreLogger, log_default, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
+            writeTrackLog(aFunCoreLogger, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
     }
 
     for (af_Object *obj = core->gc_Object; obj != NULL; obj = obj->gc.next) {
         if (obj->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_default, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, log_d, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
             success = false;
         } else
-            writeInfoLog(aFunCoreLogger, log_default, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
+            writeTrackLog(aFunCoreLogger, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
     }
 
     for (af_VarSpace *vs = core->gc_VarSpace; vs != NULL; vs = vs->gc.next) {
         if (vs->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_default, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, log_d, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
             success = false;
         } else
-            writeInfoLog(aFunCoreLogger, log_default, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
+            writeTrackLog(aFunCoreLogger, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
     }
 
     for (af_Var *var = core->gc_Var; var != NULL; var = var->gc.next) {
         if (var->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_default, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, log_d, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
             success = false;
         } else
-            writeInfoLog(aFunCoreLogger, log_default, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
+            writeTrackLog(aFunCoreLogger, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
     }
 
     if (!success)
-        writeWarningLog(aFunCoreLogger, log_default, "gc warning.");
+        writeWarningLog(aFunCoreLogger, log_d, "gc warning.");
 }

+ 2 - 2
src/core/lexical.c

@@ -15,12 +15,12 @@
 #define iselement(ch) (!isascii(ch) || isgraph(ch))  /* 可以作为element的符号 */
 
 static void printLexicalError(char *info, af_Parser *parser) {
-    writeErrorLog(aFunCoreLogger, log_default, "[Lexical] %s", info);
+    writeErrorLog(aFunCoreLogger, log_d, "[Lexical] %s", info);
     parser->is_error = true;
 }
 
 static void printLexicalWarning(char *info, af_Parser *parser) {
-    writeWarningLog(aFunCoreLogger, log_default, "[Lexical] %s", info);
+    writeWarningLog(aFunCoreLogger, log_d, "[Lexical] %s", info);
 }
 
 static void setLexicalLast(af_LexicalStatus status, af_TokenType token, af_Parser *parser) {

+ 2 - 2
src/core/parser.c

@@ -108,7 +108,7 @@ static void destructFile(struct readerDataFile *data) {
 af_Parser *makeParserByFile(FilePath path){
     FILE *file = fopen(path, "rb");
     if (file == NULL) {
-        writeErrorLog(aFunCoreLogger, log_default, "File open error: %s", file);
+        writeErrorLog(aFunCoreLogger, log_d, "File open error: %s", file);
         return NULL;
     }
 
@@ -150,7 +150,7 @@ static size_t readFuncStdin(struct readerDataStdin *data, char *dest, size_t len
         ungetc(ch, stdin);
 
         if (fgets_stdin(&data->data, STDIN_MAX_SIZE) == 0) {
-            writeErrorLog(aFunCoreLogger, log_default, "The stdin buf too large (> %d)", STDIN_MAX_SIZE);
+            writeErrorLog(aFunCoreLogger, log_d, "The stdin buf too large (> %d)", STDIN_MAX_SIZE);
             *read_end = true;
             return 0;
         }

+ 3 - 4
src/core/run.c

@@ -61,7 +61,7 @@ static bool checkLiteral(af_Message **msg, af_Environment *env) {
     freeAllLiteralData(env->activity->ld);
     env->activity->ld = NULL;
     env->activity->is_literal = false;
-    writeInfoLog(aFunCoreLogger, log_default, "Literal %p", obj);
+    writeDebugLog(aFunCoreLogger, log_d, "Literal %p", obj);
     return true;
 }
 
@@ -132,7 +132,6 @@ static bool iterCodeInit(af_Code *code, int mode, af_Environment *env) {
 
             char *name = getFileName(code->path);
             pushImportActivity(code, NULL, name, env);
-            writeInfoLog(aFunCoreLogger, log_default, "Top-Import name = %s", name);
             free(name);
             break;
         }
@@ -211,7 +210,7 @@ static bool codeElement(af_Code *code, af_Environment *env) {
 
     pushMessageDown(makeNORMALMessage(obj), env);
     setActivityBtNext(env->activity->bt_next->next, env->activity);
-    writeInfoLog(aFunCoreLogger, log_default, "Get Variable %s : %p", code->element.data, obj);
+    writeDebugLog(aFunCoreLogger, log_d, "Get Variable %s : %p", code->element.data, obj);
     return false;
 }
 
@@ -437,7 +436,7 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
                 break;
             case -1:  // NORMAL模式下, 非正常但可处理 [已经放回]
             default:
-                assertErrorLog(env->activity->status == act_func_normal, aFunCoreLogger, log_default, "");
+                assertErrorLog(env->activity->status == act_func_normal, aFunCoreLogger, log_d, "");
                 break;
         }
 

+ 2 - 2
src/core/syntactic.c

@@ -5,12 +5,12 @@
 #include "parserl_warning_error.h"
 
 static void printSyntacticError(char *info, af_Parser *parser) {
-    writeErrorLog(aFunCoreLogger, log_default, "[Syntactic] %s", info);
+    writeErrorLog(aFunCoreLogger, log_d, "[Syntactic] %s", info);
     parser->is_error = true;
 }
 
 static void printSyntacticWarning(char *info, af_Parser *parser) {
-    writeWarningLog(aFunCoreLogger, log_default, "[Syntactic] %s", info);
+    writeWarningLog(aFunCoreLogger, log_d, "[Syntactic] %s", info);
 }
 
 static bool getToken(af_Parser *parser) {

+ 18 - 17
src/main.c

@@ -60,7 +60,7 @@ int main(int argc, char **argv) {
         return EXIT_FAILURE;
 
     aFunInitInfo info = {.base_dir=base_path,
-                         .level=log_debug,
+                         .level=log_track,
                          .buf=&main_buf,
                          .pc=log_pc_all};
 
@@ -70,11 +70,11 @@ INIT_ERROR:
         return EXIT_FAILURE;
     }
 
-    initLogger(aFunlangLogger, "aFunlang-exe", log_debug);
+    initLogger(aFunlangLogger, "aFunlang-exe", info.level);
     aFunlangLogger->process_send_error = true;
     aFunlangLogger->process_fatal_error = true;
     aFunlangLogger->buf = &main_buf;
-    writeInfoLog(aFunlangLogger, log_default, "aFunlang-exe init success.");
+    writeDebugLog(aFunlangLogger, log_d, "aFunlang-exe init success");
 
     int exit_code = EXIT_SUCCESS;
     ff_FFlags *ff = ff_initFFlags(argc, argv, true, false, stderr, aFunlang_exe);
@@ -97,10 +97,11 @@ INIT_ERROR:
 }
 
 static void printVersion(void) {
-    printf_stdout(0, "aFunlang at %s\n", name);
+    /* Version的显示不被翻译, 因为它通常还需要被其他程序读取而进行处理, 必须保证一致性 */
+    printf_stdout(0, "aFunlang at  %s\n", name);
     printf_stdout(0, "aFunlang dir %s\n", base_path);
-    printf_stdout(0, "%s: " aFunVersion "\n", HT_getText(VERSION_N, "version"));
-    fputs_stdout(aFunDescription "\n");
+    fputs_stdout("version: " aFunVersion "\n");
+    fputs_stdout(aFunDescription"\n");
 }
 
 static void printWelcomeInfo(void) {
@@ -119,7 +120,7 @@ static void printHelp(void) {
  * 目标: 打印参数错误信息
  */
 static void printError(ff_FFlags *ff) {
-    writeErrorLog(aFunlangLogger, log_default, "%s (%s).", HT_getText(CL_ERROR, "Command line argument error"), ff_getChild(ff));
+    writeErrorLog(aFunlangLogger, log_d, "%s (%s).", HT_getText(CL_ERROR, "Command line argument error"), ff_getChild(ff));
     printHelp();
 }
 
@@ -161,7 +162,7 @@ static int mainRun(ff_FFlags *ff) {
     char **argv = NULL;
     int argc = ff_get_process_argv(&argv, ff);
     if (argc == 0) {
-        writeErrorLog(aFunlangLogger, log_default, HT_getText(NOT_FILE, "There are not file to run"));
+        writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_FILE, "There are not file to run"));
         return 1;
     }
 
@@ -170,9 +171,9 @@ static int mainRun(ff_FFlags *ff) {
     destructAFunEnvironment(env);
 
     if (exit_code != 0)
-        writeErrorLog(aFunlangLogger, log_default, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+        writeErrorLog(aFunlangLogger, log_d, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
     else
-        writeInfoLog(aFunlangLogger, log_default, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+        writeInfoLog(aFunlangLogger, log_d, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
 
     return exit_code;
 }
@@ -237,7 +238,7 @@ static int mainCL(ff_FFlags *ff) {
     RunList *rl = getRunList(ff, &command_line, &save_aub);
 
     if (rl == NULL && !command_line) {
-        writeErrorLog(aFunlangLogger, log_default, HT_getText(NOT_FILE, ""));
+        writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_FILE, ""));
         return EXIT_FAILURE;
     }
 
@@ -261,9 +262,9 @@ static int mainCL(ff_FFlags *ff) {
         while (isCoreExit(env) != 1);
 
         if (exit_code != 0)
-            writeErrorLog(aFunlangLogger, log_default, "aFun cl %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+            writeErrorLog(aFunlangLogger, log_d, "aFun command line %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
         else
-            writeInfoLog(aFunlangLogger, log_default, "aFun cl %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+            writeInfoLog(aFunlangLogger, log_d, "aFun command line %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
     }
 
     destructAFunEnvironment(env);
@@ -284,14 +285,14 @@ static int mainBuild(ff_FFlags *ff) {
         switch (mark) {
             case 'o':
                 if (path != NULL) {
-                    writeErrorLog(aFunlangLogger, log_default, HT_getText(ARG_CONFLICT, "Argument conflict (out, path)"));
+                    writeErrorLog(aFunlangLogger, log_d, HT_getText(ARG_CONFLICT, "Argument conflict (out, path)"));
                     goto error;
                 }
                 out_put = text;
                 break;
             case 'p':
                 if (out_put != NULL) {
-                    writeErrorLog(aFunlangLogger, log_default, HT_getText(ARG_CONFLICT, ""));
+                    writeErrorLog(aFunlangLogger, log_d, HT_getText(ARG_CONFLICT, ""));
                     goto error;
                 }
                 path = text;
@@ -312,14 +313,14 @@ out:
 
         /* 如果没有参数 */
         if (!ff_getopt_wild(&text, ff)) {
-            writeErrorLog(aFunlangLogger, log_default, HT_getText(NOT_BUILD_SRC, "There are not source file to build"));
+            writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_BUILD_SRC, "There are not source file to build"));
             goto error;
         } else
             in = text;
 
         /* 如果还有第二个参数 */
         if (ff_getopt_wild(&text, ff)) {
-            writeErrorLog(aFunlangLogger, log_default, HT_getText(MANY_BUILD_SRC, "There are too many source file to build. (Do not use --out option)"));
+            writeErrorLog(aFunlangLogger, log_d, HT_getText(MANY_BUILD_SRC, "There are too many source file to build. (Do not use --out option)"));
             goto error;
         }
 

+ 3 - 3
src/main_build.c

@@ -7,17 +7,17 @@ int buildFileOutput(FilePath out, FilePath in, bool force) {
         time_t time_2 = getFileMTime(out);
 
         if (time_1 == 0 && time_2 == 0) {
-            writeErrorLog(aFunlangLogger, log_default, "%s [%s]", HT_getText(NOT_BUILD_FILE_EXISITS, "File not exists"), in);
+            writeErrorLog(aFunlangLogger, log_d, "%s [%s]", HT_getText(NOT_BUILD_FILE_EXISITS, "File not exists"), in);
             return -1;
         }
 
         if (time_2 >= time_1) {
-            writeErrorLog(aFunlangLogger, log_default, "%s (%s), %s", HT_getText(ALREADY_BUILD, "Source already build"), in, HT_getText(BUILD_AGAIN, "use --force to build again"));
+            writeErrorLog(aFunlangLogger, log_d, "%s (%s), %s", HT_getText(ALREADY_BUILD, "Source already build"), in, HT_getText(BUILD_AGAIN, "use --force to build again"));
             return 0;
         }
     }
 
-    writeInfoLog(aFunlangLogger, log_default, "%s (%s -> %s)", HT_getText(BUILD_FILE, "File will be build"), in, out);
+    writeInfoLog(aFunlangLogger, log_d, "%s (%s -> %s)", HT_getText(BUILD_FILE, "File will be build"), in, out);
     return buildFile(out, in);
 }
 

+ 2 - 2
src/main_run.c

@@ -82,9 +82,9 @@ int runCodeFromRunList(RunList *run_list, RunList **bak, bool save_afb, af_Envir
 
         if (isCoreExit(env) == 1) {
             if (exit_code != 0)
-                writeErrorLog(aFunlangLogger, log_default, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, "exit"), HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
+                writeErrorLog(aFunlangLogger, log_d, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, "exit"), HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
             else
-                writeInfoLog(aFunlangLogger, log_default, "aFun %s, %s code = %d", HT_getText(RUN_Exit_N, "exit"), HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
+                writeInfoLog(aFunlangLogger, log_d, "aFun %s, %s code = %d", HT_getText(RUN_Exit_N, "exit"), HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
             break;
         }
     }

+ 11 - 11
src/runtime/aFunlang.c

@@ -26,7 +26,7 @@ bool aFunInit(aFunInitInfo *info) {
 
     aFunInit_mark = aFunCoreInit(&core_info);
     if (aFunInit_mark)
-        writeInfoLog(aFunCoreLogger, log_default, "aFun-runtime Init success");
+        writeDebugLog(aFunCoreLogger, log_d, "aFun-runtime Init success");
     return aFunInit_mark;
 }
 
@@ -38,7 +38,7 @@ af_Environment *creatAFunEnvironment(int argc, char **argv){
     af_Code *code = NULL;
 
     for(int i = 0; i < argc; i++)
-        writeInfoLog(aFunCoreLogger, log_default, "[aFunlang] Env-arg %d. %s", i, argv[i]);
+        writeDebugLog(aFunCoreLogger, log_d, "[aFunlang] Env-arg %d. %s", i, argv[i]);
 
     env->core->argc->num = argc;
     for (int i = 0; i < argc; i++) {
@@ -79,7 +79,7 @@ static int runCode_(FilePath name, af_Parser *parser, int mode, FilePath save_pa
     if (save_path != NULL) {
         int res = writeByteCode(bt_code, save_path);
         if (res != 1)
-            writeErrorLog(aFunCoreLogger, log_default, "%s [%s -> %s]", HT_getText(RUN_SAVE_ERROR, "Save aFun Bytecode file error"), writeByteCodeError[res], save_path);
+            writeErrorLog(aFunCoreLogger, log_d, "%s [%s -> %s]", HT_getText(RUN_SAVE_ERROR, "Save aFun Bytecode file error"), writeByteCodeError[res], save_path);
     }
 
     bool res = iterCode(bt_code, mode, env);
@@ -115,7 +115,7 @@ int runCodeFromFileSource(FilePath file, bool save_afb, FilePath save_path, int
 
     char *sufix = getFileSurfix(file);
     if (sufix == NULL || !EQ_STR(".aun", sufix)) {
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s]", HT_getText(RUN_NOT_AUN, "There is not .aun file"), (sufix == NULL ? "" : sufix));
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s]", HT_getText(RUN_NOT_AUN, "There is not .aun file"), (sufix == NULL ? "" : sufix));
         return -2;
     }
 
@@ -174,14 +174,14 @@ int runCodeFromFileByte(FilePath file, int mode, af_Environment *env){
 
     char *sufix = getFileSurfix(file);
     if (sufix == NULL || !EQ_STR(".aub", sufix)) {
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s].", HT_getText(RUN_NOT_AUB, "There is not .aub file"), (sufix == NULL ? "" : sufix));
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s].", HT_getText(RUN_NOT_AUB, "There is not .aub file"), (sufix == NULL ? "" : sufix));
         return -2;
     }
 
     af_Code *code = NULL;
     int res = readByteCode(&code, file);
     if(res != 1) {
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s: %s].", HT_getText(LOAD_BT_ERROR, "Load bytecode file error"), file, readByteCodeError[res]);
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s: %s].", HT_getText(LOAD_BT_ERROR, "Load bytecode file error"), file, readByteCodeError[res]);
         return -2;
     }
 
@@ -200,7 +200,7 @@ int runCodeFromFile(FilePath file, bool save_afb, int mode, af_Environment *env)
 
     char *sufix = getFileSurfix(file);
     if (sufix != NULL && !EQ_STR(".aun", sufix) && !EQ_STR(".aub", sufix)) {  // 不是源文件, 字节码文件或无后缀文件
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s].", HT_getText(RUN_NOT_AUN_AUB, "There is not .aun/.aub file"), sufix);
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s].", HT_getText(RUN_NOT_AUN_AUB, "There is not .aun/.aub file"), sufix);
         return -2;
     }
 
@@ -212,7 +212,7 @@ int runCodeFromFile(FilePath file, bool save_afb, int mode, af_Environment *env)
     time_t time_2 = getFileMTime(path_2);
 
     if (time_1 == 0 && time_2 == 0) {
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s].", HT_getText(NOT_RUN_FILE_EXISITS, "File not exists"), file);
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s].", HT_getText(NOT_RUN_FILE_EXISITS, "File not exists"), file);
         free(path_1);
         free(path_2);
         return -3;
@@ -244,12 +244,12 @@ int buildFile(FilePath out, FilePath in){
     char *suffix_in = getFileSurfix(in);
     char *suffix_out = getFileSurfix(out);
     if (suffix_in == NULL || !EQ_STR(".aun", suffix_in)) {  // 不是源文件
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s]", HT_getText(BUILD_IN_AUN, "Input file is not .aun file"), (suffix_in == NULL ? "" : suffix_in));
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s]", HT_getText(BUILD_IN_AUN, "Input file is not .aun file"), (suffix_in == NULL ? "" : suffix_in));
         return -2;
     }
 
     if (suffix_out == NULL || !EQ_STR(".aub", suffix_out)) {  // 不是字节码文件
-        writeErrorLog(aFunCoreLogger, log_default, "[%s]", HT_getText(BUILD_OUT_AUB, "Output file is not .aub file"), (suffix_out == NULL ? "" : suffix_out));
+        writeErrorLog(aFunCoreLogger, log_d, "[%s]", HT_getText(BUILD_OUT_AUB, "Output file is not .aub file"), (suffix_out == NULL ? "" : suffix_out));
         return -2;
     }
 
@@ -263,7 +263,7 @@ int buildFile(FilePath out, FilePath in){
     freeAllCode(code);
 
     if (res != 1) {
-        writeErrorLog(aFunCoreLogger, log_default, "%s[%s: %s]", HT_getText(BUILD_ERROR_N, "Build error"), in, writeByteCodeError[res]);
+        writeErrorLog(aFunCoreLogger, log_d, "%s[%s: %s]", HT_getText(BUILD_ERROR_N, "Build error"), in, writeByteCodeError[res]);
         return -3;
     }
 

+ 1 - 1
src/runtime/base/base.c

@@ -1,7 +1,7 @@
 #include "__base.h"
 
 int aFunTool_base(af_Code **code, af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
-    writeInfoLog(aFunCoreLogger, log_default, "Run runtimeTool-Base %p", vs);
+    writeDebugLog(aFunCoreLogger, log_d, "Run runtimeTool-Base %p", vs);
     makeLiteralRegexFromList(literal, env);
     makeStrFunc(visitor, vs, env);
     makeQuitFunc(visitor, vs, env);

+ 1 - 1
src/runtime/base/str_obj.c

@@ -26,7 +26,7 @@ static void strDestruct(char *id, af_Object *obj, ObjectString *data, af_Environ
 static void strLiteral(char *id, af_Object *obj, ObjectString *data, char *str, af_Environment *env) {
     if (!EQ_STR(id, string_id) || data->str != NULL)
         return;
-    writeDebugLog(aFunCoreLogger, log_default, "strLiteral str = %s, %d", str, strlen(str));
+    writeDebugLog(aFunCoreLogger, log_d, "strLiteral str = %s, %d", str, strlen(str));
     data->str = NEW_STR(STR_LEN(str) - 2);  // 取出两个引号
     memcpy(data->str, str + 1, (STR_LEN(str) - 2) * sizeof(char));
 }

+ 35 - 24
src/tool/log.c

@@ -97,9 +97,9 @@ int initLogSystem(FilePath path, LogFactoryPrintConsole print_console) {
     initLogger(&(log_factory.sys_log), "SYSTEM", log_debug);  // 设置为 debug, 记录 success 信息
     log_factory.sys_log.process_fatal_error = true;
     log_factory.sys_log.process_send_error = false;
-    writeInfoLog(NULL, log_default, "Log system init success");
-    writeInfoLog(NULL, log_default, "Log .log size %lld", log_size);
-    writeInfoLog(NULL, log_default, "Log .csv size %lld", csv_size);
+    writeDebugLog(NULL, log_d, "Log system init success");
+    writeDebugLog(NULL, log_d, "Log .log size %lld", log_size);
+    writeDebugLog(NULL, log_d, "Log .csv size %lld", csv_size);
     log_factory.sys_log.level = log_error;
     return 1;
 }
@@ -108,7 +108,7 @@ static void destructLogSystem_at_exit(void) {
     if (!log_factory.init)
         return;
     log_factory.sys_log.level = log_debug;
-    writeInfoLog(NULL, log_default, "Log system destruct by exit.");
+    writeDebugLog(NULL, log_d, "Log system destruct by exit.");
     fclose(log_factory.log);
     fclose(log_factory.csv);
     log_factory.log = NULL;
@@ -120,7 +120,7 @@ int destructLogSystem(void) {
     if (!log_factory.init)
         return 2;
     log_factory.sys_log.level = log_debug;
-    writeInfoLog(NULL, log_default, "Log system destruct by user.");
+    writeDebugLog(NULL, log_d, "Log system destruct by user.");
     fclose(log_factory.log);
     fclose(log_factory.csv);
     log_factory.log = NULL;
@@ -137,22 +137,24 @@ void initLogger(Logger *logger, char *id, LogLevel level) {
 
 /* LogLevel和字符串的转换 */
 static const char *LogLevelName[] = {
-        "DE",  // debug 0
-        "IN",  // info 1
-        "WA",  // warning 2
-        "ER",  // error 3
-        "SE",  // send_error 4
-        "FE",  // fatal_error 5
+        "TK",  // track 0
+        "DE",  // debug 1
+        "IN",  // info 2
+        "WA",  // warning 3
+        "ER",  // error 4
+        "SE",  // send_error 5
+        "FE",  // fatal_error 6
 };
 
 static const char *LogLevelNameLong[] = {
         /* 内容输出到终端时使用*/
-        "Debug",  // debug 0
-        "Info",  // info 1
-        "Warning",  // warning 2
-        "Error",  // error 3
-        "Fatal Error",  // send_error 4
-        "*FATAL ERROR*",  // fatal_error 5
+        "Track",  // track 0
+        "Debug",  // debug 1
+        "Info",  // info 2
+        "Warning",  // warning 3
+        "Error",  // error 4
+        "Fatal Error",  // send_error 5
+        "*FATAL ERROR*",  // fatal_error 6
 };
 
 static int writeLog_(Logger *logger, LogLoggerPrintConsole pc, LogLevel level, char *file, int line, char *func, char *format, va_list ap){
@@ -176,17 +178,17 @@ static int writeLog_(Logger *logger, LogLoggerPrintConsole pc, LogLevel level, c
     va_end(ap);
 
     /* 写入文件日志 */
-    if (pc != log_print_console && log_factory.log != NULL) {
+    if (pc != log_c && log_factory.log != NULL) {
         fprintf(log_factory.log, FORMAT, LogLevelName[level], logger->id, log_factory.pid, tid, ti, t, file, line, func, tmp);
         fflush(log_factory.log);
     }
-    if (pc != log_print_console && log_factory.csv != NULL) {
+    if (pc != log_c && log_factory.csv != NULL) {
         fprintf(log_factory.csv, CSV_FORMAT, LogLevelName[level], logger->id, log_factory.pid, tid, ti, t, file, line, func, tmp);
         fflush(log_factory.csv);
     }
 
 #define STD_BUF_SIZE (strlen(tmp) + 1024)
-    if (pc != log_print_no_console) {
+    if (pc != log_n) {
         switch (log_factory.print_console) {
             case log_pc_all:
                 if (level < log_warning) {
@@ -226,6 +228,15 @@ static int writeLog_(Logger *logger, LogLoggerPrintConsole pc, LogLevel level, c
 
 #define CHECK_LOGGER() do {if (logger == NULL) {logger = &(log_factory.sys_log);} \
                            if (logger == NULL || logger->id == NULL) return -1;} while(0)
+
+int writeTrackLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
+    CHECK_LOGGER();
+
+    va_list ap;
+    va_start(ap, format);
+    return writeLog_(logger, log_n, log_track, file, line, func, format, ap);
+}
+
 int writeDebugLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
@@ -258,12 +269,12 @@ int writeErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int lin
     return writeLog_(logger, pc, log_error, file, line, func, format, ap);
 }
 
-int writeSendErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
+int writeSendErrorLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    int re = writeLog_(logger, pc, log_send_error, file, line, func, format, ap);
+    int re = writeLog_(logger, log_d, log_send_error, file, line, func, format, ap);
     if (logger->process_send_error) {
         jmp_buf *buf = logger->buf;
         if (buf != NULL) {
@@ -275,12 +286,12 @@ int writeSendErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int
     return re;
 }
 
-int writeFatalErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, int exit_code, char *format, ...) {
+int writeFatalErrorLog_(Logger *logger, char *file, int line, char *func, int exit_code, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    int re = writeLog_(logger, pc, log_fatal_error, file, line, func, format, ap);
+    int re = writeLog_(logger, log_d, log_fatal_error, file, line, func, format, ap);
     if (logger->process_fatal_error) {
         if (logger->exit_type == 0)
             abort();