/* * 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 calexium_lib/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)) .