logger_server.anubis 11.2 KB
/*
 * 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))
.