From d0f807968fccd5d42718971f0b2677e56cc51307 Mon Sep 17 00:00:00 2001 From: totoro Date: Sat, 4 Apr 2020 12:19:18 +0900 Subject: [PATCH] first commit of Anubis logger --- src/anb_log.aproj | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/anb_log.ide | 18 ++++++++++++++++++ src/src/logger_server.anubis | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/src/logger_test.anubis | 39 +++++++++++++++++++++++++++++++++++++++ src/xlib | 2 +- 5 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 src/anb_log.aproj create mode 100644 src/anb_log.ide create mode 100644 src/src/logger_server.anubis create mode 100644 src/src/logger_test.anubis diff --git a/src/anb_log.aproj b/src/anb_log.aproj new file mode 100644 index 0000000..979d54b --- /dev/null +++ b/src/anb_log.aproj @@ -0,0 +1,218 @@ + + + {9AF3C253-38CA-44F2-824F-CFE038997403} + Debug + AnyCPU + Exe + anb_log + anb_log + src\logger_server.anubis + ./%3b./src + + + bin\Debug\ + True + Full + False + + + bin\Release\ + False + None + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/anb_log.ide b/src/anb_log.ide new file mode 100644 index 0000000..699b2fa --- /dev/null +++ b/src/anb_log.ide @@ -0,0 +1,18 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +# SharpDevelop 1.0.12.108 +Project("{B6712916-30DE-4a3e-A54C-2A79AC984AEE}") = "anb_log", "anb_log.aproj", "{9AF3C253-38CA-44F2-824F-CFE038997403}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9AF3C253-38CA-44F2-824F-CFE038997403}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9AF3C253-38CA-44F2-824F-CFE038997403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9AF3C253-38CA-44F2-824F-CFE038997403}.Release|Any CPU.Build.0 = Release|Any CPU + {9AF3C253-38CA-44F2-824F-CFE038997403}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/src/src/logger_server.anubis b/src/src/logger_server.anubis new file mode 100644 index 0000000..03c4a9f --- /dev/null +++ b/src/src/logger_server.anubis @@ -0,0 +1,322 @@ +/* + * Created by PyramIDE. + * User: フランスのトトロ aka (David RENÉ) + * Date: 01/12/2019 + * Time: 02:08 + * © David RENÉ + */ + +read tools/basis.anubis +read system/logger.anubis +read system/data_io.anubis +read system/string.anubis +read system/files.anubis +read system/parameter/inifile.anubis +read system/message_queue.anubis +read xlib/CXM_message_constants.anubis + + read logger_client.anubis + +type UID_loggers: + uid_loggers( + String uid, + String base_dir, + Var(List(Logger)) loggers + ) +. + + /** get_uid_loggers + */ +define Maybe(UID_loggers) + get_uid_loggers + ( + List(UID_loggers) all_loggers, //all known logger + String _uid //searched UID loggers + )= + if all_loggers is + { + [] then failure, + [h . t] then + if h.uid = _uid then + success(h) + else + get_uid_loggers(t, _uid) + } +. + +define Maybe(Logger) + get_logger_from_uid + ( + List(UID_loggers) all_loggers, + String _uid, + String log_name, + Logger anb_logger + )= + if all_loggers is + { + [] then failure, + [h . t] then + if h.uid = _uid then + if get_logger(*h.loggers, log_name) is + { + failure then logError(anb_logger, "can't find log ["+log_name+"] in uid ["+_uid+"]");failure, + success(log) then success(log) + } + else + get_logger_from_uid(t, _uid, log_name, anb_logger) + } +. + +define Maybe(Logger) + create_logger_from_message + ( + Logger anb_logger, + Message msg, + String base_directory + )= + if find_string(msg, "LOG_NAME") is {failure then logError(anb_logger, "create_logger_from_message can't find LOG_NAME");failure, success(loggerName) then + if find_int32 (msg, "FORMAT_SIZE") is {failure then logError(anb_logger, "create_logger_from_message can't find FORMAT_SIZE");failure, success(formatting_size) then + if find_string(msg, "FILE_NAME") is {failure then logError(anb_logger, "create_logger_from_message can't find FILE_NAME");failure, success(fileName) then + if find_int32 (msg, "FILE_LEVEL") is {failure then logError(anb_logger, "create_logger_from_message can't find FILE_LEVEL");failure,success(_fileLevel) then + if find_int32 (msg, "CONS_LEVEL") is {failure then logError(anb_logger, "create_logger_from_message can't find CONS_LEVEL");failure,success(_consoleLevel) then + + with file_level = get_LogLevel_from_value(to_Int(_fileLevel)), + with console_level = get_LogLevel_from_value(to_Int(_consoleLevel)), + with final_file_path = base_directory + fileName, + make_directories(final_file_path); + logInfo(anb_logger, "create_logger_from_message logger name ["+loggerName+"] format size["+formatting_size+"] file name["+fileName+"] file level ["+get_log_level_char(file_level)+"] console level ["+get_log_level_char(console_level)+"]"); + success(createLogger(loggerName, to_Int(formatting_size), final_file_path, file_level, console_level)) + }}}}} +. + + /** register one logger into UID + */ +define One + register_logger + ( + Var(List(UID_loggers)) logs, + Message msg, + String base_directory, + Logger anb_logger + )= + + if find_string(msg, "UID") is { failure then logError(anb_logger, "register_logger UID not found"), success(uid) then + if find_string(msg, "LOG_NAME") is { failure then logError(anb_logger, "register_logger can't find LOG_NAME"), success(log_name) then + if get_uid_loggers(*logs, uid) is + { + failure then //the uid logger doesn't exists so we create and + logError(anb_logger, "register_logger UID logger ["+uid+"] doesn't exist. Please register the UID first"), + success(_uid_log) then + if get_logger(*_uid_log.loggers, log_name) is + { + failure then + if create_logger_from_message(anb_logger, msg, _uid_log.base_dir) is + { + failure then unique, + success(new_log) then + _uid_log.loggers <- [new_log . *_uid_log.loggers]; + logInfo(anb_logger, "register_logger: logger ["+log_name+"] created in ["+uid+"]") + } + success(_) then + logWarning(anb_logger, "register_logger: logger ["+log_name+"] already exists in ["+uid+"]") + } + } + }} +. + +define One + register_uid + ( + Var(List(UID_loggers)) logs, + Message msg, + String log_server_base_dir, + Logger anb_logger + )= + if find_string(msg, "UID") is { failure then logError(anb_logger, "register_uid can't find UID field"), success(uid) then + with default_path = find_string(msg, "DEFAULT_PATH", "/"), + abs_path = find_bool(msg, "ABSOLUTE_PATH", false), + if get_uid_loggers(*logs, uid) is + { + failure then //the uid logger doesn't exists so we create and + with base_dir = if abs_path then default_path else log_server_base_dir + default_path, + with new_uid = uid_loggers(uid, base_dir, var([])), + logs <- [ new_uid . *logs]; + logInfo(anb_logger, "register_uid UID logger ["+uid+"] success with base dir '"+base_dir+"'.") + success(_) then + logError(anb_logger, "register_uid UID logger ["+uid+"] already exists.") + }} +. + +define Bool + process_log + ( + Logger log, + Message msg + )= + if find_string(msg, "LOG_STRING") is {failure then logError(log, "process_log can't find LOG_STRING");false, success(log_string) then + if find_int32 (msg, "LEVEL") is {failure then logError(log, "process_log can't find LEVEL");false, success(int_level) then + if find_int32 (msg, "THREAD_ID") is {failure then logError(log, "process_log can't find THREAD_ID");false, success(thread_id) then + + with level = get_LogLevel_from_value(to_Int(int_level)), + if level is logTrace then + if find_string(msg, "LOG_MASK") is + { + failure then + //println("process_log can't find LogMask ["+log_string+"]"); + logError(log, "process_log can't find LOG_MASK");false, + success(log_mask) then logTrace(log, logMask(log_mask), log_string, thread_id); true + } + else doLog(log, log_string, level, thread_id); true + + } + } + }. + +define Bool + process_log + ( + List(Logger) logs, + Message msg + )= + if find_string(msg, "LOG_NAME") is + { + failure then println("process_log can't find LOG_NAME");false, + success(log_name) then + if get_logger(logs, log_name) is + { + failure then println("can't find log ["+log_name+"]");false, + success(log) then process_log(log, msg) + } + } +. + +define Bool + process_log + ( + List(UID_loggers) logs, + Message msg, + Logger anb_logger + )= + with uid = if find_string(msg, "UID") is { failure then "", success(_uid) then _uid}, + + if find_string(msg, "LOG_NAME") is + { + failure then logError(anb_logger, "process_log can't find LOG_NAME");false, + success(log_name) then + if get_logger_from_uid(logs, uid, log_name, anb_logger) is + { + failure then logError(anb_logger, "can't find log ["+log_name+"] in ["+uid+"]");false, + success(log) then process_log(log, msg) + } + } +. + +public define String + data_preview + ( + ByteArray data, + Int max + ) = + with l = length(data), + firsts_bytes = extract(data, 0, max), + "Length=" + l + "; String='"+to_string(firsts_bytes)+"' Buffer=[" + to_ascii(firsts_bytes) + (if l > max then "...]" else "]"). + + +define (UDP_Socket, ByteArray, Truncation, Word32, Word32) -> One + make_udp_handler + ( + Var(List(UID_loggers)) logs, + String base_directory, + Logger anb_logger + ) = + ( + UDP_Socket socket, + ByteArray data, + Truncation truncation, + Word32 ip_address, + Word32 ip_port + ) |-> + with ip = ip_addr_to_string(ip_address), + logTrace(anb_logger, logMask("Logger"), "LoggerServer: data received (" + length(data) + " bytes) from IP " + ip + "... "); + //println("LoggerServer: data received (" + length(data) + " bytes) from IP " + ip + "... "); + //println("LoggerServer: data_preview " + data_preview(data, 20)); + + if receive_message_from_io(make_data_io(data)) is + { + failure then + //println("LoggerServer: Bad data packet received from IP " + ip + ": " + data_preview(data, 20)); + logWarning(anb_logger, "LoggerServer: Bad data packet received from IP " + ip + ": " + data_preview(data, 20)), + success(msg) then + if *msg.what = _CXM_LOGGER_LOG then + forget(process_log(*logs, msg, anb_logger)) + else if *msg.what = _CXM_LOGGER_REGISTER_UID then + forget(register_uid(logs, msg, base_directory, anb_logger)) + else if *msg.what = _CXM_LOGGER_REGISTER_LOG then + forget(register_logger(logs, msg, base_directory, anb_logger)) + else + logError(anb_logger, "LoggerService: wrong message_received. [" + to_hexa(*msg.what) + "] is not _CXM_LOGGER_LOG or _CXM_LOGGER_REGISTER or _CXM_LOGGER_UNREGISTER ") +} +. +define One + my_notify + ( + One dummy + ) = + unique. + +public define Maybe(UDP_Server) + start_logger_server + ( + Var(List(UID_loggers)) logs, + Logger anb_logger, + Word32 logger_listen_port, + String base_directory + ) = + if start_udp_server(0, + logger_listen_port, + make_udp_handler(logs, base_directory, anb_logger), + 8*1024, + my_notify) is + { + cannot_create_the_socket then logError(anb_logger, "Cannot create the listening socket."); failure, + cannot_bind_address_port then logError(anb_logger, "Cannot bind to port " + logger_listen_port + "."); failure, + access_denied then logError(anb_logger, "Cannot listen on port " + logger_listen_port + "."); failure, + ok(server) then logInfo(anb_logger, "LocalLog Server started on port " + logger_listen_port + "."); success(server) + } +. + +read locale/L3LanguageInfo.anubis //date and time formating + +define Var(List(UID_loggers)) + create_default_loggers + ( + String log_server_base_dir + ) + = + //none uid for extended libraryet etc... + with base_dir = log_server_base_dir + "/unknown/", + sql = createLogger("SQL", 8, base_dir+"sql.log", logTrace, logTrace), + db = createLogger("SDB", 8, base_dir+"db.log", logTrace, logTrace), + sql_trace = createLogger("SQL_TRACE", 8, base_dir+"sql.log", logTrace, logTrace), + make_directories(base_dir); + with uid = uid_loggers("", base_dir, var([sql, db, sql_trace])), + var([uid]) +. + +global define One + anb_log + ( + List(String) args + )= + with product_time = to_Int(__TIME__), + with anb_log_path = find_and_replace(my_anubis_directory, "\\", "/") + "/anb_log/", + with ini = loadIniFile(anb_log_path+"config.ini"), + server_port = readWord32(ini, "GENERAL", "udp_port", 45514), + base_directory = readString(ini, "GENERAL", "base_directory", anb_log_path+"log/"), + make_directories(base_directory); + //create own logger + with anb_logger = createLogger("anb_log", 7, base_directory + "anb_log.log", logTrace, logTrace), + logInfo(anb_logger, "start anb_log "+datef_ymd(product_time) + " " + dhour_format(product_time)); + + forget(start_logger_server(create_default_loggers(base_directory), anb_logger, server_port, base_directory)) +. diff --git a/src/src/logger_test.anubis b/src/src/logger_test.anubis new file mode 100644 index 0000000..b73cd1f --- /dev/null +++ b/src/src/logger_test.anubis @@ -0,0 +1,39 @@ +/* + * Created by PyramIDE. + * User: フランスのトトロ aka (David RENÉ) + * Date: 01/12/2019 + * Time: 19:52 + * © David RENÉ + */ + +read tools/basis.anubis +read logger_client.anubis + +global define One + logger_test + ( + List(String) args + )= + with app0 = "logger test0", + uid0_dir = "logger test0/", +log_name0_0 = "log_name0_0", +log_name0_1 = "log_name0_1", + uid1 = "logger test1", + + register_uid(app0, uid0_dir, false); + register_logger(app0, log_name0_0, 8, false, log_name0_0+".log", logDebug, logDebug); + register_logger(app0, log_name0_1, 8, false, log_name0_1+".log", logDebug, logDebug); + sleep(1000); + logNone (app0, log_name0_0, "logNone in log_name0_0"); + logNone (app0, log_name0_1, "logNone in log_name0_1"); + logCriticalError (app0, log_name0_0, "logCriticalError in log_name0_0"); + logCriticalError (app0, log_name0_1, "logCriticalError in log_name0_1"); + logError (app0, log_name0_0, "logError in log_name0_0"); + logError (app0, log_name0_1, "logError in log_name0_1"); + logWarning (app0, log_name0_0, "logWarning in log_name0_0"); + logWarning (app0, log_name0_1, "logWarning in log_name0_1"); + logInfo (app0, log_name0_0, "logInfo in log_name0_0"); + logInfo (app0, log_name0_1, "logInfo in log_name0_1"); + logDebug (app0, log_name0_0, "logDebug in log_name0_0"); + logDebug (app0, log_name0_1, "logDebug in log_name0_1") +. diff --git a/src/xlib b/src/xlib index 42087dc..feda583 160000 --- a/src/xlib +++ b/src/xlib @@ -1 +1 @@ -Subproject commit 42087dcf0b412fabb5b67106041c711206c2281f +Subproject commit feda58399a96e2dc798291203edae434a6d2e3ba -- libgit2 0.21.4