Răsfoiți Sursa

feat: 调整输出和日志

日志采用原生语言输出
stdout和stderr使用翻译功能
CMAKE_BUILD_TYPE将影响log是否输出到console
SongZihuan 3 ani în urmă
părinte
comite
e723d1ed63

+ 6 - 0
CMakeLists.txt

@@ -19,6 +19,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
 set(VISIBILITY_INLINES_HIDDEN TRUE)  # 默认内联函数不可见
 set(CMAKE_C_VISIBILITY_PRESET "hidden")  # 默认所有符号不可见
 
+set(CMAKE_BUILD_TYPE DEBUG CACHE STRING "Build type")
+
 # 系统检查
 include(CheckCCompilerFlag)
 check_c_compiler_flag("-fPIC" fpic_work)  # 检查是否有fPIC选项
@@ -92,6 +94,10 @@ if (CYGWIN)
     list(APPEND base_compile_definitions aFunCYGWIN=1)
 endif()
 
+if (CMAKE_BUILD_TYPE STREQUAL Debug)
+    list(APPEND base_compile_definitions aFunDEBUG=1)
+endif()
+
 add_compile_definitions(${base_compile_definitions})
 
 include(${CMAKE_CURRENT_LIST_DIR}/deps/deps.cmake)  # 安装依赖

+ 0 - 1
include/core/core_init.h

@@ -9,7 +9,6 @@ typedef struct aFunCoreInitInfo aFunCoreInitInfo;
 struct aFunCoreInitInfo {
     char *base_dir;
 
-    LogFactoryPrintConsole pc;
     bool fe;
     bool se;
     jmp_buf *buf;

+ 0 - 1
include/runtime/aFunlang.h

@@ -8,7 +8,6 @@ typedef struct aFunInitInfo aFunInitInfo;
 struct aFunInitInfo {
     char *base_dir;
 
-    LogFactoryPrintConsole pc;
     jmp_buf *buf;
     LogLevel level;
 };

+ 18 - 20
include/tool/log.h

@@ -23,13 +23,6 @@ enum LogFactoryPrintConsole {
 };
 typedef enum LogFactoryPrintConsole LogFactoryPrintConsole;
 
-enum LogLoggerPrintConsole {
-    log_d = 0,  // 默认
-    log_c,  // 不显示到终端
-    log_n,  // 只显示到终端
-};
-typedef enum LogLoggerPrintConsole LogLoggerPrintConsole;
-
 struct Logger {
     char *id;
     LogLevel level;
@@ -40,16 +33,16 @@ struct Logger {
 };
 typedef struct Logger Logger;
 
-AFUN_TOOL_EXPORT int initLogSystem(FilePath path, LogFactoryPrintConsole print_console);
+AFUN_TOOL_EXPORT int initLogSystem(FilePath path);
 
 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 writeDebugLog_(Logger *logger, char *file, int line, char *func, char *format, ...);
+AFUN_TOOL_EXPORT int writeInfoLog_(Logger *logger, char *file, int line, char *func, char *format, ...);
+AFUN_TOOL_EXPORT int writeWarningLog_(Logger *logger, char *file, int line, char *func, char *format, ...);
+AFUN_TOOL_EXPORT int writeErrorLog_(Logger *logger, char *file, int line, char *func, 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, ...);
 
@@ -59,17 +52,22 @@ AFUN_TOOL_EXPORT int writeFatalErrorLog_(Logger *logger, char *file, int line, c
 #define file_line (char *)"xx", (int)__LINE__
 #endif
 
+#if aFunDEBUG
 #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__)
+#else
+#define writeTrackLog(logger, ...) (NULL)
+#endif
+
+#define writeDebugLog(logger, ...) writeDebugLog_(logger, file_line, (char *)__FUNCTION__, __VA_ARGS__)
+#define writeInfoLog(logger, ...) writeInfoLog_(logger, file_line, (char *)__FUNCTION__, __VA_ARGS__)
+#define writeWarningLog(logger, ...) writeWarningLog_(logger, file_line, (char *)__FUNCTION__, __VA_ARGS__)
+#define writeErrorLog(logger, ...) writeErrorLog_(logger, file_line, (char *)__FUNCTION__, __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__))
-#define assertWarningLog(c, logger, pc, ...) ((c) || writeWarningLog(logger, pc, "Assert " #c " error : " __VA_ARGS__))
-#define assertErrorLog(c, logger, pc, ...) ((c) || writeErrorLog(logger, pc, "Assert " #c " error : " __VA_ARGS__))
+#define assertDebugLog(c, logger, ...) ((c) || writeDebugLog(logger, "Assert " #c " error : " __VA_ARGS__))
+#define assertInfoLog(c, logger, ...) ((c) || writeInfoLog(logger, "Assert " #c " error : " __VA_ARGS__))
+#define assertWarningLog(c, logger, ...) ((c) || writeWarningLog(logger, "Assert " #c " error : " __VA_ARGS__))
+#define assertErrorLog(c, logger, ...) ((c) || writeErrorLog(logger, "Assert " #c " error : " __VA_ARGS__))
 
 #endif //AFUN_LOG_H

+ 1 - 1
src/core/__env.h

@@ -28,7 +28,7 @@ typedef uint16_t ActivityCount;
 struct af_Core {  // 解释器核心
     enum af_CoreStatus {
         core_creat = 0,
-        core_init,  // 执行.i.af
+        core_init,  // 执行初始化程序
         core_normal,  // 正常执行
         core_stop,  // 当前运算退出
         core_exit,  // 解释器退出

+ 8 - 9
src/core/core_init.c

@@ -23,7 +23,6 @@ static void destructCoreExit(void) {
 bool aFunCoreInit(aFunCoreInitInfo *info) {
     if (info == NULL) {
         static aFunCoreInitInfo info_default = {.base_dir=".",
-                                                .pc=log_pc_all,
                                                 .fe=true,
                                                 .se=true,
                                                 .buf=NULL,
@@ -43,7 +42,7 @@ bool aFunCoreInit(aFunCoreInitInfo *info) {
     atexit(destructCoreExit);
 
     char *log = strJoin(log_path, "aFunlang", false, false);
-    bool re = initLogSystem(log, info->pc);
+    bool re = initLogSystem(log);
     free(log);
     if (re == 0)
         return false;
@@ -53,24 +52,24 @@ bool aFunCoreInit(aFunCoreInitInfo *info) {
     aFunCoreLogger->process_fatal_error = info->se;
     aFunCoreLogger->buf = info->buf;
 
-    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);
+    writeDebugLog(aFunCoreLogger, "aFunCore init success");
+    writeDebugLog(aFunCoreLogger, "aFunCore log path: %s", log_path);
+    writeDebugLog(aFunCoreLogger, "aFunCore var/lib path: %s", varlib_path);
+    writeDebugLog(aFunCoreLogger, "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_d, "LANG_path = %s", LANG_path);
+    writeDebugLog(aFunCoreLogger, "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_d, "LANG = %s", LANG);
+        writeDebugLog(aFunCoreLogger, "LANG = %s", LANG);
 
         char *LANG_lib = strJoin(lang_path, LANG, false, false);
         if (HT_initGetText(LANG_lib) == 0)
-            writeDebugLog(aFunCoreLogger, log_d, "aFunCore lang init: %s", LANG_lib);
+            writeDebugLog(aFunCoreLogger, "aFunCore lang init: %s", LANG_lib);
         free(LANG_lib);
         fclose(LANG_file);
     } else

+ 8 - 8
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_d, "NORMAL msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, "NORMAL msg: %p error", msg->msg);
         return;
     }
     gc_delReference(*(af_Object **)msg->msg);
     if (!is_gc)
-        writeDebugLog(aFunCoreLogger, log_d, "NORMAL Point: %p", *(af_Object **)msg->msg);
+        writeDebugLog(aFunCoreLogger, "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_d, "ERROR msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, "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_d, "IMPORT msg: %p error", msg->msg);
+        writeErrorLog(aFunCoreLogger, "IMPORT msg: %p error", msg->msg);
         return;
     }
     af_ImportInfo *ii = *(af_ImportInfo **)msg->msg;
     if (ii->obj == NULL) {
-        writeDebugLog(aFunCoreLogger, log_d, "IMPORT msg: %p do not get obj", msg->msg);
+        writeErrorLog(aFunCoreLogger, "IMPORT msg: %p do not get obj", msg->msg);
         return;
     }
 
     if (ii->mark != NULL) {
         makeVarToProtectVarSpace(ii->mark, 3, 3, 3, ii->obj, env);
-        writeDebugLog(aFunCoreLogger, log_d, "IMPORT point: [%s] %p", ii->mark, ii->obj);
+        writeDebugLog(aFunCoreLogger, "IMPORT point: [%s] %p", ii->mark, ii->obj);
     } else
-        writeDebugLog(aFunCoreLogger, log_d, "IMPORT point: <no-name> %p", ii->obj);
+        writeDebugLog(aFunCoreLogger, "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_d, "Run iterDestruct error.");
+        writeErrorLog(aFunCoreLogger, "Run iterDestruct error.");
     free(env);
 }
 

+ 5 - 5
src/core/gc.c

@@ -417,7 +417,7 @@ 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_d, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
             success = false;
         } else
             writeTrackLog(aFunCoreLogger, "af_ObjectData(%p) Reference: %d", od, od->gc.info.reference);
@@ -425,7 +425,7 @@ void printGCByCore(af_Core *core) {
 
     for (af_Object *obj = core->gc_Object; obj != NULL; obj = obj->gc.next) {
         if (obj->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_d, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
             success = false;
         } else
             writeTrackLog(aFunCoreLogger, "af_Object(%p->%p) Reference: %d", obj, obj->data, obj->gc.info.reference);
@@ -433,7 +433,7 @@ void printGCByCore(af_Core *core) {
 
     for (af_VarSpace *vs = core->gc_VarSpace; vs != NULL; vs = vs->gc.next) {
         if (vs->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_d, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
             success = false;
         } else
             writeTrackLog(aFunCoreLogger, "af_VarSpace(%p) Reference: %d", vs, vs->gc.info.reference);
@@ -441,12 +441,12 @@ void printGCByCore(af_Core *core) {
 
     for (af_Var *var = core->gc_Var; var != NULL; var = var->gc.next) {
         if (var->gc.info.reference != 0) {
-            writeWarningLog(aFunCoreLogger, log_d, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
+            writeWarningLog(aFunCoreLogger, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
             success = false;
         } else
             writeTrackLog(aFunCoreLogger, "af_Var(%p) Reference: %d", var, var->gc.info.reference);
     }
 
     if (!success)
-        writeWarningLog(aFunCoreLogger, log_d, "gc warning.");
+        writeWarningLog(aFunCoreLogger, "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_d, "[Lexical] %s", info);
+    writeErrorLog(aFunCoreLogger, "[Lexical] %s", info);
     parser->is_error = true;
 }
 
 static void printLexicalWarning(char *info, af_Parser *parser) {
-    writeWarningLog(aFunCoreLogger, log_d, "[Lexical] %s", info);
+    writeWarningLog(aFunCoreLogger, "[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_d, "File open error: %s", file);
+        writeErrorLog(aFunCoreLogger, "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_d, "The stdin buf too large (> %d)", STDIN_MAX_SIZE);
+            writeErrorLog(aFunCoreLogger, "The stdin buf too large (> %d)", STDIN_MAX_SIZE);
             *read_end = true;
             return 0;
         }

+ 4 - 3
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;
-    writeDebugLog(aFunCoreLogger, log_d, "Literal %p", obj);
+    writeTrackLog(aFunCoreLogger, "Literal %p", obj);
     return true;
 }
 
@@ -182,6 +182,7 @@ static bool codeElement(af_Code *code, af_Environment *env) {
             return false;
         }
 
+        writeTrackLog(aFunCoreLogger, "Get literal %s : %p", code->element.data, var->vn->obj);
         return pushLiteralActivity(code, code->element.data, var->vn->obj, env);
     }
 
@@ -210,7 +211,7 @@ static bool codeElement(af_Code *code, af_Environment *env) {
 
     pushMessageDown(makeNORMALMessage(obj), env);
     setActivityBtNext(env->activity->bt_next->next, env->activity);
-    writeDebugLog(aFunCoreLogger, log_d, "Get Variable %s : %p", code->element.data, obj);
+    writeTrackLog(aFunCoreLogger, "Get variable %s : %p", code->element.data, obj);
     return false;
 }
 
@@ -436,7 +437,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_d, "");
+                assertErrorLog(env->activity->status == act_func_normal, aFunCoreLogger, "");
                 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_d, "[Syntactic] %s", info);
+    writeErrorLog(aFunCoreLogger, "[Syntactic] %s", info);
     parser->is_error = true;
 }
 
 static void printSyntacticWarning(char *info, af_Parser *parser) {
-    writeWarningLog(aFunCoreLogger, log_d, "[Syntactic] %s", info);
+    writeWarningLog(aFunCoreLogger, "[Syntactic] %s", info);
 }
 
 static bool getToken(af_Parser *parser) {

+ 40 - 22
src/main.c

@@ -60,9 +60,13 @@ int main(int argc, char **argv) {
         return EXIT_FAILURE;
 
     aFunInitInfo info = {.base_dir=base_path,
+#ifdef aFunDEBUG
                          .level=log_track,
+#else
+                         .level=log_info,
+#endif
                          .buf=&main_buf,
-                         .pc=log_pc_all};
+    };
 
     if (!aFunInit(&info)) {
 INIT_ERROR:
@@ -74,7 +78,7 @@ INIT_ERROR:
     aFunlangLogger->process_send_error = true;
     aFunlangLogger->process_fatal_error = true;
     aFunlangLogger->buf = &main_buf;
-    writeDebugLog(aFunlangLogger, log_d, "aFunlang-exe init success");
+    writeDebugLog(aFunlangLogger, "aFunlang-exe init success");
 
     int exit_code = EXIT_SUCCESS;
     ff_FFlags *ff = ff_initFFlags(argc, argv, true, false, stderr, aFunlang_exe);
@@ -105,7 +109,7 @@ static void printVersion(void) {
 }
 
 static void printWelcomeInfo(void) {
-    printf_stdout(0, "\naFunlang " aFunVersion " %s (" __DATE__ ", " __TIME__ ")\n", HT_getText(CL_N, "CommandLine"));
+    printf_stdout(0, "aFunlang " aFunVersion " %s (" __DATE__ ", " __TIME__ ")\n", HT_getText(CL_N, "CommandLine"));
     fputs_stdout("["compilerID"] on "systemName"\n");
     printf_stdout(0, "(%s)\n", HT_getText(CL_TIPS, "Enter the aFun code to run in the top activity"));
 }
@@ -120,7 +124,8 @@ static void printHelp(void) {
  * 目标: 打印参数错误信息
  */
 static void printError(ff_FFlags *ff) {
-    writeErrorLog(aFunlangLogger, log_d, "%s (%s).", HT_getText(CL_ERROR, "Command line argument error"), ff_getChild(ff));
+    writeErrorLog(aFunlangLogger, "%s argument error", ff_getChild(ff));
+    printf_stdout(0, "%s (%s)\n", HT_getText(CL_ERROR, "Command line argument error"), ff_getChild(ff));
     printHelp();
 }
 
@@ -161,19 +166,26 @@ static int mainRun(ff_FFlags *ff) {
     int exit_code;
     char **argv = NULL;
     int argc = ff_get_process_argv(&argv, ff);
+    af_Environment *env;
+
     if (argc == 0) {
-        writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_FILE, "There are not file to run"));
-        return 1;
+        /* 进入命令行模式 */
+        env = creatAFunEnvironment(0, NULL);
+        printWelcomeInfo();
+        do
+            exit_code = runCodeFromStdin("stdin", env);
+        while (isCoreExit(env) != 1);
+    } else {
+        env = creatAFunEnvironment(argc - 1, argv + 1);
+        exit_code = runCodeFromFile(argv[0], true, 0, env);
+        destructAFunEnvironment(env);
     }
 
-    af_Environment *env = creatAFunEnvironment(argc - 1, argv + 1);
-    exit_code = runCodeFromFile(argv[0], true, 0, env);
-    destructAFunEnvironment(env);
-
     if (exit_code != 0)
-        writeErrorLog(aFunlangLogger, log_d, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+        writeErrorLog(aFunlangLogger, "aFun exit code: %d", exit_code);
     else
-        writeInfoLog(aFunlangLogger, log_d, "aFun %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
+        writeInfoLog(aFunlangLogger, "aFun exit code: %d", exit_code);
+    printf_stderr(0, "aFun %s: %d\n", HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
 
     return exit_code;
 }
@@ -238,7 +250,8 @@ static int mainCL(ff_FFlags *ff) {
     RunList *rl = getRunList(ff, &command_line, &save_aub);
 
     if (rl == NULL && !command_line) {
-        writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_FILE, ""));
+        writeErrorLog(aFunlangLogger, "CL not file to run");
+        printf_stderr(0, "%s\n", HT_getText(NOT_FILE, "There are not file run"));
         return EXIT_FAILURE;
     }
 
@@ -260,13 +273,14 @@ static int mainCL(ff_FFlags *ff) {
         do
             exit_code = runCodeFromStdin("stdin", env);
         while (isCoreExit(env) != 1);
-
-        if (exit_code != 0)
-            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_d, "aFun command line %s, %s = %d", HT_getText(RUN_Exit_N, ""), HT_getText(RUN_Exitcode_N, ""), exit_code);
     }
 
+    if (exit_code != 0)
+        writeErrorLog(aFunlangLogger, "aFun exit code: %d", exit_code);
+    else
+        writeInfoLog(aFunlangLogger, "aFun exit code: %d", exit_code);
+    printf_stderr(0, "aFun %s: %d\n", HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
+
     destructAFunEnvironment(env);
     freeAllRunList(rl);
     return exit_code;
@@ -285,14 +299,16 @@ static int mainBuild(ff_FFlags *ff) {
         switch (mark) {
             case 'o':
                 if (path != NULL) {
-                    writeErrorLog(aFunlangLogger, log_d, HT_getText(ARG_CONFLICT, "Argument conflict (out, path)"));
+                    writeErrorLog(aFunlangLogger, "Build argument conflict");
+                    printf_stderr(0, "%s\n", HT_getText(ARG_CONFLICT, "Argument conflict (out, path)"));
                     goto error;
                 }
                 out_put = text;
                 break;
             case 'p':
                 if (out_put != NULL) {
-                    writeErrorLog(aFunlangLogger, log_d, HT_getText(ARG_CONFLICT, ""));
+                    writeErrorLog(aFunlangLogger, "Build argument conflict");
+                    printf_stderr(0, "%s\n", HT_getText(ARG_CONFLICT, ""));
                     goto error;
                 }
                 path = text;
@@ -313,14 +329,16 @@ out:
 
         /* 如果没有参数 */
         if (!ff_getopt_wild(&text, ff)) {
-            writeErrorLog(aFunlangLogger, log_d, HT_getText(NOT_BUILD_SRC, "There are not source file to build"));
+            writeErrorLog(aFunlangLogger, "Build not source file");
+            printf_stderr(0, "%s\n", 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_d, HT_getText(MANY_BUILD_SRC, "There are too many source file to build. (Do not use --out option)"));
+            writeErrorLog(aFunlangLogger, "Build too many source file");
+            printf_stderr(0, "%s\n", HT_getText(MANY_BUILD_SRC, "There are too many source file to build. (Do not use --out option)"));
             goto error;
         }
 

+ 6 - 3
src/main_build.c

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

+ 0 - 8
src/main_run.c

@@ -79,14 +79,6 @@ int runCodeFromRunList(RunList *run_list, RunList **bak, bool save_afb, af_Envir
             default:
                 break;
         }
-
-        if (isCoreExit(env) == 1) {
-            if (exit_code != 0)
-                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_d, "aFun %s, %s code = %d", HT_getText(RUN_Exit_N, "exit"), HT_getText(RUN_Exitcode_N, "exit code"), exit_code);
-            break;
-        }
     }
 
     if (bak != NULL)

+ 27 - 17
src/runtime/aFunlang.c

@@ -10,23 +10,23 @@ bool aFunInit(aFunInitInfo *info) {
         return false;
 
     if (info == NULL) {
-        static aFunInitInfo info_default = {.base_dir=".",
-                                            .pc=log_pc_all,
-                                            .buf=NULL,
-                                            .level=log_info};
+        static aFunInitInfo info_default = {
+                .base_dir=".",
+                .buf=NULL,
+                .level=log_info
+        };
         info = &info_default;
     }
 
     aFunCoreInitInfo core_info = {.base_dir=info->base_dir,
                                   .fe=true,
                                   .se=true,
-                                  .pc=info->pc,
                                   .buf=info->buf,
                                   .level=info->level};
 
     aFunInit_mark = aFunCoreInit(&core_info);
     if (aFunInit_mark)
-        writeDebugLog(aFunCoreLogger, log_d, "aFun-runtime Init success");
+        writeDebugLog(aFunCoreLogger, "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++)
-        writeDebugLog(aFunCoreLogger, log_d, "[aFunlang] Env-arg %d. %s", i, argv[i]);
+        writeTrackLog(aFunCoreLogger, "[aFunlang] Env-arg %d. %s", i, argv[i]);
 
     env->core->argc->num = argc;
     for (int i = 0; i < argc; i++) {
@@ -78,8 +78,10 @@ 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_d, "%s [%s -> %s]", HT_getText(RUN_SAVE_ERROR, "Save aFun Bytecode file error"), writeByteCodeError[res], save_path);
+        if (res != 1) {
+            writeErrorLog(aFunCoreLogger, "Save %s bytecode error: %s", save_path, writeByteCodeError[res]);
+            printf_stderr(0, "%s: %s\n", HT_getText(RUN_SAVE_ERROR, "Save aFun Bytecode file error"), save_path);
+        }
     }
 
     bool res = iterCode(bt_code, mode, env);
@@ -115,7 +117,8 @@ 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_d, "%s[%s]", HT_getText(RUN_NOT_AUN, "There is not .aun file"), (sufix == NULL ? "" : sufix));
+        writeErrorLog(aFunCoreLogger, "Source is not .aun file: %s", (sufix == NULL ? "" : sufix));
+        printf_stderr(0, "%s: %s\n", HT_getText(RUN_NOT_AUN, "Source is not .aun file"), (sufix == NULL ? "" : sufix));
         return -2;
     }
 
@@ -174,14 +177,16 @@ int runCodeFromFileByte(FilePath file, int mode, af_Environment *env){
 
     char *sufix = getFileSurfix(file);
     if (sufix == NULL || !EQ_STR(".aub", sufix)) {
-        writeErrorLog(aFunCoreLogger, log_d, "%s[%s].", HT_getText(RUN_NOT_AUB, "There is not .aub file"), (sufix == NULL ? "" : sufix));
+        writeErrorLog(aFunCoreLogger, "Bytecode not .aub file: %s", (sufix == NULL ? "" : sufix));
+        printf_stderr(0, "%s: %s\n", HT_getText(RUN_NOT_AUB, "Bytecode not .aub file"), (sufix == NULL ? "" : sufix));
         return -2;
     }
 
     af_Code *code = NULL;
     int res = readByteCode(&code, file);
     if(res != 1) {
-        writeErrorLog(aFunCoreLogger, log_d, "%s[%s: %s].", HT_getText(LOAD_BT_ERROR, "Load bytecode file error"), file, readByteCodeError[res]);
+        writeErrorLog(aFunCoreLogger, "Load %s bytecode file error: %s", file, readByteCodeError[res]);
+        printf_stderr(0, "%s: %s\n", HT_getText(LOAD_BT_ERROR, "Load bytecode file error"), file);
         return -2;
     }
 
@@ -200,7 +205,8 @@ 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_d, "%s[%s].", HT_getText(RUN_NOT_AUN_AUB, "There is not .aun/.aub file"), sufix);
+        writeErrorLog(aFunCoreLogger, "Run file not .aun/.aub file: %s", sufix);
+        printf_stderr(0, "%s: %s\n", HT_getText(NOT_RUN_FILE_EXISITS, "Run file not .aun/.aub file"), file);
         return -2;
     }
 
@@ -212,7 +218,8 @@ 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_d, "%s[%s].", HT_getText(NOT_RUN_FILE_EXISITS, "File not exists"), file);
+        writeErrorLog(aFunCoreLogger, "Run file not exists: %s", file);
+        printf_stderr(0, "%s: %s\n", HT_getText(NOT_RUN_FILE_EXISITS, "Run file not exists"), file);
         free(path_1);
         free(path_2);
         return -3;
@@ -244,12 +251,14 @@ 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_d, "%s[%s]", HT_getText(BUILD_IN_AUN, "Input file is not .aun file"), (suffix_in == NULL ? "" : suffix_in));
+        writeErrorLog(aFunCoreLogger, "Input not .aun %s", (suffix_in == NULL ? "" : suffix_in));
+        printf_stderr("%s: %s\n", 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_d, "[%s]", HT_getText(BUILD_OUT_AUB, "Output file is not .aub file"), (suffix_out == NULL ? "" : suffix_out));
+        writeErrorLog(aFunCoreLogger, "Output not .aub %s", (suffix_out == NULL ? "" : suffix_out));
+        printf_stderr("%s: %s\n", HT_getText(BUILD_OUT_AUB, "Output file is not .aub file"), (suffix_out == NULL ? "" : suffix_out));
         return -2;
     }
 
@@ -263,7 +272,8 @@ int buildFile(FilePath out, FilePath in){
     freeAllCode(code);
 
     if (res != 1) {
-        writeErrorLog(aFunCoreLogger, log_d, "%s[%s: %s]", HT_getText(BUILD_ERROR_N, "Build error"), in, writeByteCodeError[res]);
+        writeErrorLog(aFunCoreLogger, "Build %s error: %s", in, writeByteCodeError[res]);
+        printf_stderr(0, "%s: %s\n", HT_getText(BUILD_ERROR_N, "Build error"), in);
         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) {
-    writeDebugLog(aFunCoreLogger, log_d, "Run runtimeTool-Base %p", vs);
+    writeDebugLog(aFunCoreLogger, "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_d, "strLiteral str = %s, %d", str, strlen(str));
+    writeTrackLog(aFunCoreLogger, "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));
 }

+ 38 - 53
src/tool/log.c

@@ -40,7 +40,6 @@ static struct LogFactory {
 
     FILE *log;  // 记录文件输出的位置
     FILE *csv;
-    LogFactoryPrintConsole print_console;  // 输出到终端、
 
     Logger sys_log;
 } log_factory = {.init=false};
@@ -55,7 +54,7 @@ static void destructLogSystem_at_exit(void);
  * 2 表示已经初始化
  * 0 表示初始化失败
  */
-int initLogSystem(FilePath path, LogFactoryPrintConsole print_console) {
+int initLogSystem(FilePath path) {
     if (log_factory.init)
         return 2;
     if (strlen(path) >= 218)  // 路径过长
@@ -90,16 +89,15 @@ int initLogSystem(FilePath path, LogFactoryPrintConsole print_console) {
     }
 #undef CSV_TITLE
 
-    log_factory.print_console = print_console;
     log_factory.init = true;
     atexit(destructLogSystem_at_exit);
 
     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;
-    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);
+    writeDebugLog(NULL, "Log system init success");
+    writeDebugLog(NULL, "Log .log size %lld", log_size);
+    writeDebugLog(NULL, "Log .csv size %lld", csv_size);
     log_factory.sys_log.level = log_error;
     return 1;
 }
@@ -108,7 +106,7 @@ static void destructLogSystem_at_exit(void) {
     if (!log_factory.init)
         return;
     log_factory.sys_log.level = log_debug;
-    writeDebugLog(NULL, log_d, "Log system destruct by exit.");
+    writeDebugLog(NULL, "Log system destruct by exit.");
     fclose(log_factory.log);
     fclose(log_factory.csv);
     log_factory.log = NULL;
@@ -120,7 +118,7 @@ int destructLogSystem(void) {
     if (!log_factory.init)
         return 2;
     log_factory.sys_log.level = log_debug;
-    writeDebugLog(NULL, log_d, "Log system destruct by user.");
+    writeDebugLog(NULL, "Log system destruct by user.");
     fclose(log_factory.log);
     fclose(log_factory.csv);
     log_factory.log = NULL;
@@ -157,7 +155,7 @@ static const char *LogLevelNameLong[] = {
         "*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){
+static int writeLog_(Logger *logger, bool pc, LogLevel level, char *file, int line, char *func, char *format, va_list ap){
     if (logger->level > level)
         return 2;
     if (!log_factory.init || log_factory.log == NULL)
@@ -170,7 +168,6 @@ static int writeLog_(Logger *logger, LogLoggerPrintConsole pc, LogLevel level, c
     char *ti = getTime(&t, "%Y-%m-%d %H:%M:%S");
 
 #define FORMAT "%s/[%s] %ld %ld {%s %ld} (%s:%d at %s) : '%s'\n"
-#define FORMAT_SHORT "%s(%s:%d) : %s\n"
     long tid = gettid();
 
     char tmp[2048] = {0};
@@ -178,50 +175,30 @@ static int writeLog_(Logger *logger, LogLoggerPrintConsole pc, LogLevel level, c
     va_end(ap);
 
     /* 写入文件日志 */
-    if (pc != log_c && log_factory.log != NULL) {
+    if (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_c && log_factory.csv != NULL) {
+    if (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 FORMAT_SHORT "%s(%s:%d) : %s\n"
 #define STD_BUF_SIZE (strlen(tmp) + 1024)
-    if (pc != log_n) {
-        switch (log_factory.print_console) {
-            case log_pc_all:
-                if (level < log_warning) {
-                    printf_stdout(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
-                    fflush(stdout);
-                } else if (log_factory.print_console) {
-                    printf_stderr(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
-                    fflush(stderr);
-                }
-                break;
-            case log_pc_w:
-                if (level >= log_warning) { // warning的内容一定会被打印
-                    printf_stderr(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
-                    fflush(stderr);
-                }
-                break;
-            case log_pc_e:
-                if (level >= log_error) {  // warning的内容一定会被打印
-                    printf_stderr(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
-                    fflush(stderr);
-                }
-                break;
-
-            case log_pc_quite:
-            default:
-                break;
+    if (pc) {
+        if (level < log_warning) {
+            printf_stdout(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
+            fflush(stdout);
+        } else {
+            printf_stderr(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], file, line, tmp);
+            fflush(stderr);
         }
     }
+#undef FORMAT_SHORT
 #undef STD_BUF_SIZE
-
     free(ti);
 #undef FORMAT
-#undef FORMAT_SHORT
 #undef CSV_FORMAT
     return 0;
 }
@@ -229,44 +206,52 @@ 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)
 
+#ifdef aFunDEBUG
+#define INFO_PRINT_CONSOLE true
+#else
+#define INFO_PRINT_CONSOLE false
+#endif
+
 int writeTrackLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
+#ifdef aFunDEBUG
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    return writeLog_(logger, log_n, log_track, file, line, func, format, ap);
+    return writeLog_(logger, false, log_track, file, line, func, format, ap);
+#endif
 }
 
-int writeDebugLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
+int writeDebugLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    return writeLog_(logger, pc, log_debug, file, line, func, format, ap);
+    return writeLog_(logger, INFO_PRINT_CONSOLE, log_debug, file, line, func, format, ap);
 }
 
-int writeInfoLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
+int writeInfoLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    return writeLog_(logger, pc, log_info, file, line, func, format, ap);
+    return writeLog_(logger, INFO_PRINT_CONSOLE, log_info, file, line, func, format, ap);
 }
 
-int writeWarningLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
+int writeWarningLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    return writeLog_(logger, pc, log_warning, file, line, func, format, ap);
+    return writeLog_(logger, INFO_PRINT_CONSOLE, log_warning, file, line, func, format, ap);
 }
 
-int writeErrorLog_(Logger *logger, LogLoggerPrintConsole pc, char *file, int line, char *func, char *format, ...) {
+int writeErrorLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
     CHECK_LOGGER();
 
     va_list ap;
     va_start(ap, format);
-    return writeLog_(logger, pc, log_error, file, line, func, format, ap);
+    return writeLog_(logger, INFO_PRINT_CONSOLE, log_error, file, line, func, format, ap);
 }
 
 int writeSendErrorLog_(Logger *logger, char *file, int line, char *func, char *format, ...) {
@@ -274,7 +259,7 @@ int writeSendErrorLog_(Logger *logger, char *file, int line, char *func, char *f
 
     va_list ap;
     va_start(ap, format);
-    int re = writeLog_(logger, log_d, log_send_error, file, line, func, format, ap);
+    int re = writeLog_(logger, true, log_send_error, file, line, func, format, ap);
     if (logger->process_send_error) {
         jmp_buf *buf = logger->buf;
         if (buf != NULL) {
@@ -291,8 +276,8 @@ int writeFatalErrorLog_(Logger *logger, char *file, int line, char *func, int ex
 
     va_list ap;
     va_start(ap, format);
-    int re = writeLog_(logger, log_d, log_fatal_error, file, line, func, format, ap);
-    if (logger->process_fatal_error) {
+    int re = writeLog_(logger, true, log_fatal_error, file, line, func, format, ap);
+    if (logger->process_fatal_error) {  // TODO-szh 去除该设定, 强制退出
         if (logger->exit_type == 0)
             abort();
         else

+ 5 - 4
test/src/run_code.c

@@ -378,15 +378,16 @@ int main(int argc, char **argv) {
     if (setjmp(main_buf) == 1)
         return EXIT_FAILURE;
 
-    aFunInitInfo info = {.base_dir=base_path,
+    aFunInitInfo info = {
+            .base_dir=base_path,
             .level=log_debug,
-            .buf=&main_buf,
-            .pc=log_pc_all};
+            .buf=&main_buf
+    };
 
     if (!aFunInit(&info)) {
 INIT_ERROR:
         free(base_path);
-        printf_stderr(0, "aFunlang init error.");
+        printf_stderr(0, "aFunlang init error\n");
         return EXIT_FAILURE;
     } else
         free(base_path);