diff --git a/HISTORY b/HISTORY index 2dbf9b0..16865bc 100644 --- a/HISTORY +++ b/HISTORY @@ -1,9 +1,10 @@ -Version 1.31 2016-11-13 +Version 1.31 2016-11-24 * move SET_SOCKOPT_NOSIGPIPE from sockopt.c to sockopt.h * add function get_time_item_from_str * add file trylock functions * logger context add field: use_file_write_lock + * log support replace space chars Version 1.30 2016-10-31 * modify php-fastcommon/test.php diff --git a/src/logger.c b/src/logger.c index 5c9e2b8..bc76acb 100644 --- a/src/logger.c +++ b/src/logger.c @@ -249,6 +249,55 @@ void log_set_use_file_write_lock_ex(LogContext *pContext, const bool use_lock) pContext->use_file_write_lock = use_lock; } +int log_set_space_char_pairs_ex(LogContext *pContext, + LogSpaceCharPairArray *pSpaceCharPairs) +{ + int i; + unsigned char src; + if (pSpaceCharPairs->count > LOG_MAX_SPACE_CHAR_PAIRS) + { + fprintf(stderr, "file: "__FILE__", line: %d, " + "count: %d is too large, exceeds %d!\n", __LINE__, + pSpaceCharPairs->count, LOG_MAX_SPACE_CHAR_PAIRS); + return EINVAL; + } + + if (pContext->space_char_count > 0) + { + memset(pContext->space_char_table, 0, sizeof(pContext->space_char_table)); + } + + pContext->space_char_count = pSpaceCharPairs->count; + for (i=0; icount; i++) + { + src = pSpaceCharPairs->pairs[i].src; + pContext->space_char_table[src] = pSpaceCharPairs->pairs[i].dest; + } + return 0; +} + +void log_set_standard_space_chars_ex(LogContext *pContext, + const unsigned char dest_base) +{ + int i; + LogSpaceCharPairArray pair_array; + + pair_array.count = 7; + pair_array.pairs[0].src = '\0'; + pair_array.pairs[1].src = '\t'; + pair_array.pairs[2].src = '\n'; + pair_array.pairs[3].src = '\v'; + pair_array.pairs[4].src = '\f'; + pair_array.pairs[5].src = '\r'; + pair_array.pairs[6].src = ' '; + + for (i=0; itime_precision = time_precision; @@ -1004,8 +1053,29 @@ static void doLogEx(LogContext *pContext, struct timeval *tv, \ buff_len = sprintf(pContext->pcurrent_buff, "%s - ", caption); pContext->pcurrent_buff += buff_len; } - memcpy(pContext->pcurrent_buff, text, text_len); - pContext->pcurrent_buff += text_len; + + if (pContext->space_char_count > 0) + { + const unsigned char *p; + const unsigned char *end; + end = (const unsigned char *)text + text_len; + for (p=(const unsigned char *)text; pspace_char_table[*p] != 0) + { + *pContext->pcurrent_buff++ = pContext->space_char_table[*p]; + } + else + { + *pContext->pcurrent_buff++ = *p; + } + } + } + else + { + memcpy(pContext->pcurrent_buff, text, text_len); + pContext->pcurrent_buff += text_len; + } *pContext->pcurrent_buff++ = '\n'; if (!pContext->log_to_cache || bNeedSync) diff --git a/src/logger.h b/src/logger.h index de6d97f..2e168b8 100644 --- a/src/logger.h +++ b/src/logger.h @@ -28,11 +28,25 @@ extern "C" { #define LOG_COMPRESS_FLAGS_ENABLED 1 #define LOG_COMPRESS_FLAGS_NEW_THREAD 2 +#define LOG_MAX_SPACE_CHAR_PAIRS 16 + struct log_context; //log header line callback typedef void (*LogHeaderCallback)(struct log_context *pContext); +typedef struct log_space_char_pair +{ + unsigned char src; + unsigned char dest; +} LogSpaceCharPair; + +typedef struct log_space_char_pair_array +{ + int count; + LogSpaceCharPair pairs[LOG_MAX_SPACE_CHAR_PAIRS]; +} LogSpaceCharPairArray; + typedef struct log_context { /* log level value please see: sys/syslog.h @@ -105,6 +119,16 @@ typedef struct log_context * compress the log files before N days * */ int compress_log_days_before; + + /* + * space char pairs count + * */ + int space_char_count; + + /* + * space char table to replace + * */ + unsigned char space_char_table[256]; } LogContext; extern LogContext g_log_context; @@ -140,6 +164,12 @@ int log_init2(); #define log_set_use_file_write_lock(use_lock) \ log_set_use_file_write_lock_ex(&g_log_context, use_lock) +#define log_set_space_char_pairs(pSpaceCharPairs) \ + log_set_space_char_pairs_ex(&g_log_context, pSpaceCharPairs) + +#define log_set_standard_space_chars(dest_base) \ + log_set_standard_space_chars_ex(&g_log_context, dest_base) + #define log_header(pContext, header, header_len) \ log_it_ex2(pContext, NULL, header, header_len, false, false) @@ -194,6 +224,26 @@ void log_set_cache_ex(LogContext *pContext, const bool bLogCache); */ void log_set_use_file_write_lock_ex(LogContext *pContext, const bool use_lock); + +/** set space char pairs to replace + * parameters: + * pContext: the log context + * pSpaceCharPairs: the space char pairs + * return: 0 for success, != 0 fail +*/ +int log_set_space_char_pairs_ex(LogContext *pContext, + LogSpaceCharPairArray *pSpaceCharPairs); + + +/** set standard space chars to replace + * parameters: + * pContext: the log context + * dest_base: the dest base char + * return: 0 for success, != 0 fail +*/ +void log_set_standard_space_chars_ex(LogContext *pContext, + const unsigned char dest_base); + /** set time precision * parameters: * pContext: the log context