Changeset f039dba in mainline for uspace/srv/logger/logs.c


Ignore:
Timestamp:
2012-08-17T09:57:27Z (12 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b1912b0c
Parents:
f72ae3b
Message:

Logger also works with hierarchy

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/logger/logs.c

    rf72ae3b rf039dba  
    3737#include "logger.h"
    3838
    39 static FIBRIL_MUTEX_INITIALIZE(toplog_list_guard);
    40 static LIST_INITIALIZE(toplog_list);
    4139
    42 static logger_toplevel_log_t *find_log_by_name_no_lock(const char *name)
     40static FIBRIL_MUTEX_INITIALIZE(log_list_guard);
     41static LIST_INITIALIZE(log_list);
     42
     43
     44static logger_log_t *find_log_by_name_and_parent_no_lock(const char *name, logger_log_t *parent)
    4345{
    44         list_foreach(toplog_list, it) {
    45                 logger_toplevel_log_t *log = list_get_instance(it, logger_toplevel_log_t, link);
    46                 if (str_cmp(log->name, name) == 0) {
    47                         return log;
    48                 }
    49         }
    50 
    51         return NULL;
    52 }
    53 
    54 logger_toplevel_log_t *find_or_create_toplevel_log(const char *name)
    55 {
    56         logger_toplevel_log_t *result = NULL;
    57 
    58         fibril_mutex_lock(&toplog_list_guard);
    59 
    60         result = find_log_by_name_no_lock(name);
    61         if (result != NULL)
    62                 goto leave;
    63 
    64         result = malloc(sizeof(logger_toplevel_log_t));
    65         if (result == NULL)
    66                 goto leave;
    67 
    68         char *logfilename;
    69         asprintf(&logfilename, "/log/%s", name);
    70         result->logfile = fopen(logfilename, "a");
    71         result->logged_level = LOG_LEVEL_USE_DEFAULT;
    72         result->name = str_dup(name);
    73         result->sublog_count = 1;
    74         result->sublogs[0].name = "";
    75         result->sublogs[0].logged_level = LOG_LEVEL_USE_DEFAULT;
    76 
    77         link_initialize(&result->link);
    78 
    79         list_append(&result->link, &toplog_list);
    80 
    81 leave:
    82         fibril_mutex_unlock(&toplog_list_guard);
    83 
    84         return result;
    85 }
    86 
    87 logger_toplevel_log_t *find_toplevel_log(sysarg_t id)
    88 {
    89         list_foreach(toplog_list, it) {
    90                 logger_toplevel_log_t *log = list_get_instance(it, logger_toplevel_log_t, link);
    91                 if ((sysarg_t) log == id)
     46        list_foreach(log_list, it) {
     47                logger_log_t *log = list_get_instance(it, logger_log_t, link);
     48                if ((parent == log->parent) && (str_cmp(log->name, name) == 0))
    9249                        return log;
    9350        }
     
    9653}
    9754
    98 bool shall_log_message(logger_toplevel_log_t *toplog, sysarg_t log, log_level_t level)
     55static logger_dest_t *create_dest(const char *name)
    9956{
    100         if (log >= toplog->sublog_count)
    101                 return false;
     57        logger_dest_t *result = malloc(sizeof(logger_dest_t));
     58        char *logfilename;
     59        asprintf(&logfilename, "/log/%s", name);
     60        result->logfile = fopen(logfilename, "a");
     61        return result;
     62}
    10263
    103         log_level_t logged_level = toplog->sublogs[log].logged_level;
    104         if (logged_level == LOG_LEVEL_USE_DEFAULT) {
    105                 logged_level = toplog->logged_level;
    106                 if (logged_level == LOG_LEVEL_USE_DEFAULT)
    107                         logged_level = get_default_logging_level();
    108         }
     64logger_log_t *find_or_create_log(const char *name, sysarg_t parent_id)
     65{
     66        logger_log_t *result = NULL;
     67        logger_log_t *parent = (logger_log_t *) parent_id;
     68
     69        fibril_mutex_lock(&log_list_guard);
     70
     71        result = find_log_by_name_and_parent_no_lock(name, parent);
     72        if (result != NULL)
     73                goto leave;
     74
     75        result = malloc(sizeof(logger_log_t));
     76        if (result == NULL)
     77                goto leave;
    10978
    11079
    111         return level <= logged_level;
     80        result->logged_level = LOG_LEVEL_USE_DEFAULT;
     81        result->name = str_dup(name);
     82        if (parent == NULL) {
     83                result->full_name = str_dup(name);
     84                result->dest = create_dest(name);
     85        } else {
     86                asprintf(&result->full_name, "%s/%s", parent->full_name, name);
     87                result->dest = parent->dest;
     88        }
     89        result->parent = parent;
     90
     91        link_initialize(&result->link);
     92
     93        list_append(&result->link, &log_list);
     94
     95leave:
     96        fibril_mutex_unlock(&log_list_guard);
     97
     98        return result;
    11299}
    113100
    114 int add_sub_log(logger_toplevel_log_t *toplog, const char *name, sysarg_t *id)
     101logger_log_t *find_log_by_name(const char *name)
    115102{
    116         if (toplog->sublog_count >= MAX_SUBLOGS)
    117                 return ELIMIT;
     103        logger_log_t *result = NULL;
    118104
    119         logger_sublog_t *sublog =  &toplog->sublogs[toplog->sublog_count];
    120         sublog->name = str_dup(name);
    121         sublog->logged_level = toplog->logged_level;
     105        fibril_mutex_lock(&log_list_guard);
     106        list_foreach(log_list, it) {
     107                logger_log_t *log = list_get_instance(it, logger_log_t, link);
     108                if (str_cmp(log->full_name, name) == 0) {
     109                        result = log;
     110                        break;
     111                }
     112        }
     113        fibril_mutex_unlock(&log_list_guard);
    122114
    123         *id = toplog->sublog_count;
    124 
    125         toplog->sublog_count++;
    126 
    127         return EOK;
     115        return result;
    128116}
    129117
     118logger_log_t *find_log_by_id(sysarg_t id)
     119{
     120        logger_log_t *result = NULL;
     121
     122        fibril_mutex_lock(&log_list_guard);
     123        list_foreach(log_list, it) {
     124                logger_log_t *log = list_get_instance(it, logger_log_t, link);
     125                if ((sysarg_t) log == id) {
     126                        result = log;
     127                        break;
     128                }
     129        }
     130        fibril_mutex_unlock(&log_list_guard);
     131
     132        return result;
     133}
     134
     135static log_level_t get_actual_log_level(logger_log_t *log)
     136{
     137        /* Find recursively proper log level. */
     138        if (log->logged_level == LOG_LEVEL_USE_DEFAULT) {
     139                if (log->parent == NULL)
     140                        return get_default_logging_level();
     141                else
     142                        return get_actual_log_level(log->parent);
     143        }
     144        return log->logged_level;
     145}
     146
     147bool shall_log_message(logger_log_t *log, log_level_t level)
     148{
     149        return level <= get_actual_log_level(log);
     150}
    130151
    131152/**
Note: See TracChangeset for help on using the changeset viewer.