Delete easylogger directory
parent
e1fdb134db
commit
f4232af82f
@ -1,275 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2019, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is an head file for this library. You can see all be called functions.
|
||||
* Created on: 2015-04-28
|
||||
*/
|
||||
|
||||
#ifndef __ELOG_H__
|
||||
#define __ELOG_H__
|
||||
|
||||
#include <elog_cfg.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* output log's level */
|
||||
#define ELOG_LVL_ASSERT 0
|
||||
#define ELOG_LVL_ERROR 1
|
||||
#define ELOG_LVL_WARN 2
|
||||
#define ELOG_LVL_INFO 3
|
||||
#define ELOG_LVL_DEBUG 4
|
||||
#define ELOG_LVL_VERBOSE 5
|
||||
|
||||
/* the output silent level and all level for filter setting */
|
||||
#define ELOG_FILTER_LVL_SILENT ELOG_LVL_ASSERT
|
||||
#define ELOG_FILTER_LVL_ALL ELOG_LVL_VERBOSE
|
||||
|
||||
/* output log's level total number */
|
||||
#define ELOG_LVL_TOTAL_NUM 6
|
||||
|
||||
/* EasyLogger software version number */
|
||||
#define ELOG_SW_VERSION "2.2.99"
|
||||
|
||||
/* EasyLogger assert for developer. */
|
||||
#ifdef ELOG_ASSERT_ENABLE
|
||||
#define ELOG_ASSERT(EXPR) \
|
||||
if (!(EXPR)) \
|
||||
{ \
|
||||
if (elog_assert_hook == NULL) { \
|
||||
elog_a("elog", "(%s) has assert failed at %s:%ld.", #EXPR, __FUNCTION__, __LINE__); \
|
||||
while (1); \
|
||||
} else { \
|
||||
elog_assert_hook(#EXPR, __FUNCTION__, __LINE__); \
|
||||
} \
|
||||
}
|
||||
#else
|
||||
#define ELOG_ASSERT(EXPR) ((void)0);
|
||||
#endif
|
||||
|
||||
#ifndef ELOG_OUTPUT_ENABLE
|
||||
#define elog_assert(tag, ...)
|
||||
#define elog_error(tag, ...)
|
||||
#define elog_warn(tag, ...)
|
||||
#define elog_info(tag, ...)
|
||||
#define elog_debug(tag, ...)
|
||||
#define elog_verbose(tag, ...)
|
||||
#else /* ELOG_OUTPUT_ENABLE */
|
||||
#if ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT
|
||||
#define elog_assert(tag, ...) \
|
||||
elog_output(ELOG_LVL_ASSERT, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_assert(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ASSERT */
|
||||
|
||||
#if ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR
|
||||
#define elog_error(tag, ...) \
|
||||
elog_output(ELOG_LVL_ERROR, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_error(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_ERROR */
|
||||
|
||||
#if ELOG_OUTPUT_LVL >= ELOG_LVL_WARN
|
||||
#define elog_warn(tag, ...) \
|
||||
elog_output(ELOG_LVL_WARN, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_warn(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_WARN */
|
||||
|
||||
#if ELOG_OUTPUT_LVL >= ELOG_LVL_INFO
|
||||
#define elog_info(tag, ...) \
|
||||
elog_output(ELOG_LVL_INFO, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_info(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_INFO */
|
||||
|
||||
#if ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG
|
||||
#define elog_debug(tag, ...) \
|
||||
elog_output(ELOG_LVL_DEBUG, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_debug(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL >= ELOG_LVL_DEBUG */
|
||||
|
||||
#if ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE
|
||||
#define elog_verbose(tag, ...) \
|
||||
elog_output(ELOG_LVL_VERBOSE, tag, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
#else
|
||||
#define elog_verbose(tag, ...)
|
||||
#endif /* ELOG_OUTPUT_LVL == ELOG_LVL_VERBOSE */
|
||||
#endif /* ELOG_OUTPUT_ENABLE */
|
||||
|
||||
/* all formats index */
|
||||
typedef enum {
|
||||
ELOG_FMT_LVL = 1 << 0, /**< level */
|
||||
ELOG_FMT_TAG = 1 << 1, /**< tag */
|
||||
ELOG_FMT_TIME = 1 << 2, /**< current time */
|
||||
ELOG_FMT_P_INFO = 1 << 3, /**< process info */
|
||||
ELOG_FMT_T_INFO = 1 << 4, /**< thread info */
|
||||
ELOG_FMT_DIR = 1 << 5, /**< file directory and name */
|
||||
ELOG_FMT_FUNC = 1 << 6, /**< function name */
|
||||
ELOG_FMT_LINE = 1 << 7, /**< line number */
|
||||
} ElogFmtIndex;
|
||||
|
||||
/* macro definition for all formats */
|
||||
#define ELOG_FMT_ALL (ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_TIME|ELOG_FMT_P_INFO|ELOG_FMT_T_INFO| \
|
||||
ELOG_FMT_DIR|ELOG_FMT_FUNC|ELOG_FMT_LINE)
|
||||
|
||||
/* output log's tag filter */
|
||||
typedef struct {
|
||||
uint8_t level;
|
||||
char tag[ELOG_FILTER_TAG_MAX_LEN + 1];
|
||||
bool tag_use_flag; /**< false : tag is no used true: tag is used */
|
||||
} ElogTagLvlFilter, *ElogTagLvlFilter_t;
|
||||
|
||||
/* output log's filter */
|
||||
typedef struct {
|
||||
uint8_t level;
|
||||
char tag[ELOG_FILTER_TAG_MAX_LEN + 1];
|
||||
char keyword[ELOG_FILTER_KW_MAX_LEN + 1];
|
||||
ElogTagLvlFilter tag_lvl[ELOG_FILTER_TAG_LVL_MAX_NUM];
|
||||
} ElogFilter, *ElogFilter_t;
|
||||
|
||||
/* easy logger */
|
||||
typedef struct {
|
||||
ElogFilter filter;
|
||||
size_t enabled_fmt_set[ELOG_LVL_TOTAL_NUM];
|
||||
bool init_ok;
|
||||
bool output_enabled;
|
||||
bool output_lock_enabled;
|
||||
bool output_is_locked_before_enable;
|
||||
bool output_is_locked_before_disable;
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
bool text_color_enabled;
|
||||
#endif
|
||||
|
||||
}EasyLogger, *EasyLogger_t;
|
||||
|
||||
/* EasyLogger error code */
|
||||
typedef enum {
|
||||
ELOG_NO_ERR,
|
||||
} ElogErrCode;
|
||||
|
||||
/* elog.c */
|
||||
ElogErrCode elog_init(void);
|
||||
void elog_deinit(void);
|
||||
void elog_start(void);
|
||||
void elog_stop(void);
|
||||
void elog_set_output_enabled(bool enabled);
|
||||
bool elog_get_output_enabled(void);
|
||||
void elog_set_text_color_enabled(bool enabled);
|
||||
bool elog_get_text_color_enabled(void);
|
||||
void elog_set_fmt(uint8_t level, size_t set);
|
||||
void elog_set_filter(uint8_t level, const char *tag, const char *keyword);
|
||||
void elog_set_filter_lvl(uint8_t level);
|
||||
void elog_set_filter_tag(const char *tag);
|
||||
void elog_set_filter_kw(const char *keyword);
|
||||
void elog_set_filter_tag_lvl(const char *tag, uint8_t level);
|
||||
uint8_t elog_get_filter_tag_lvl(const char *tag);
|
||||
void elog_raw(const char *format, ...);
|
||||
void elog_output(uint8_t level, const char *tag, const char *file, const char *func,
|
||||
const long line, const char *format, ...);
|
||||
void elog_output_lock_enabled(bool enabled);
|
||||
extern void (*elog_assert_hook)(const char* expr, const char* func, size_t line);
|
||||
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line));
|
||||
int8_t elog_find_lvl(const char *log);
|
||||
const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len);
|
||||
void elog_hexdump(const char *name, uint8_t width, uint8_t *buf, uint16_t size);
|
||||
|
||||
#define elog_a(tag, ...) elog_assert(tag, __VA_ARGS__)
|
||||
#define elog_e(tag, ...) elog_error(tag, __VA_ARGS__)
|
||||
#define elog_w(tag, ...) elog_warn(tag, __VA_ARGS__)
|
||||
#define elog_i(tag, ...) elog_info(tag, __VA_ARGS__)
|
||||
#define elog_d(tag, ...) elog_debug(tag, __VA_ARGS__)
|
||||
#define elog_v(tag, ...) elog_verbose(tag, __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* log API short definition
|
||||
* NOTE: The `LOG_TAG` and `LOG_LVL` must defined before including the <elog.h> when you want to use log_x API.
|
||||
*/
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "NO_TAG"
|
||||
#endif
|
||||
#if !defined(LOG_LVL)
|
||||
#define LOG_LVL ELOG_LVL_VERBOSE
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_ASSERT
|
||||
#define log_a(...) elog_a(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_a(...) ((void)0);
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_ERROR
|
||||
#define log_e(...) elog_e(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_e(...) ((void)0);
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_WARN
|
||||
#define log_w(...) elog_w(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_w(...) ((void)0);
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_INFO
|
||||
#define log_i(...) elog_i(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_i(...) ((void)0);
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_DEBUG
|
||||
#define log_d(...) elog_d(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_d(...) ((void)0);
|
||||
#endif
|
||||
#if LOG_LVL >= ELOG_LVL_VERBOSE
|
||||
#define log_v(...) elog_v(LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define log_v(...) ((void)0);
|
||||
#endif
|
||||
|
||||
/* assert API short definition */
|
||||
#if !defined(assert)
|
||||
#define assert ELOG_ASSERT
|
||||
#endif
|
||||
|
||||
/* elog_buf.c */
|
||||
void elog_buf_enabled(bool enabled);
|
||||
void elog_flush(void);
|
||||
|
||||
/* elog_async.c */
|
||||
void elog_async_enabled(bool enabled);
|
||||
size_t elog_async_get_log(char *log, size_t size);
|
||||
size_t elog_async_get_line_log(char *log, size_t size);
|
||||
|
||||
/* elog_utils.c */
|
||||
size_t elog_strcpy(size_t cur_len, char *dst, const char *src);
|
||||
size_t elog_cpyln(char *line, const char *log, size_t len);
|
||||
void *elog_memcpy(void *dst, const void *src, size_t count);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ELOG_H__ */
|
||||
@ -1,77 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2016, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is the configure head file for this library.
|
||||
* Created on: 2015-07-30
|
||||
*/
|
||||
|
||||
#ifndef _ELOG_CFG_H_
|
||||
#define _ELOG_CFG_H_
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* enable log output. */
|
||||
#define ELOG_OUTPUT_ENABLE
|
||||
/* setting static output log level. range: from ELOG_LVL_ASSERT to ELOG_LVL_VERBOSE */
|
||||
#define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE
|
||||
/* enable assert check */
|
||||
#define ELOG_ASSERT_ENABLE
|
||||
/* buffer size for every line's log */
|
||||
#define ELOG_LINE_BUF_SIZE 1024
|
||||
/* output line number max length */
|
||||
#define ELOG_LINE_NUM_MAX_LEN 5
|
||||
/* output filter's tag max length */
|
||||
#define ELOG_FILTER_TAG_MAX_LEN 30
|
||||
/* output filter's keyword max length */
|
||||
#define ELOG_FILTER_KW_MAX_LEN 16
|
||||
/* output filter's tag level max num */
|
||||
#define ELOG_FILTER_TAG_LVL_MAX_NUM 5
|
||||
/* output newline sign */
|
||||
#define ELOG_NEWLINE_SIGN "\n"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* enable log color */
|
||||
#define ELOG_COLOR_ENABLE
|
||||
/* change the some level logs to not default color if you want */
|
||||
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
|
||||
#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL)
|
||||
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
|
||||
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
|
||||
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
|
||||
#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* enable asynchronous output mode */
|
||||
#define ELOG_ASYNC_OUTPUT_ENABLE
|
||||
/* the highest output level for async mode, other level will sync output */
|
||||
#define ELOG_ASYNC_OUTPUT_LVL ELOG_LVL_ASSERT
|
||||
/* buffer size for asynchronous output mode */
|
||||
#define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
|
||||
/* each asynchronous output's log which must end with newline sign */
|
||||
#define ELOG_ASYNC_LINE_OUTPUT
|
||||
/* asynchronous output mode using POSIX pthread implementation */
|
||||
#define ELOG_ASYNC_OUTPUT_USING_PTHREAD
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* enable buffered output mode */
|
||||
#define ELOG_BUF_OUTPUT_ENABLE
|
||||
/* buffer size for buffered output mode */
|
||||
#define ELOG_BUF_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
|
||||
|
||||
#endif /* _ELOG_CFG_H_ */
|
||||
@ -1,174 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2019, Qintl, <qintl_linux@163.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Save log to file.
|
||||
* Created on: 2019-01-05
|
||||
*/
|
||||
|
||||
#define LOG_TAG "elog.file"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "elog_file.h"
|
||||
|
||||
/* initialize OK flag */
|
||||
static bool init_ok = false;
|
||||
static FILE *fp = NULL;
|
||||
static ElogFileCfg local_cfg;
|
||||
|
||||
ElogErrCode elog_file_init(void)
|
||||
{
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
ElogFileCfg cfg;
|
||||
|
||||
if (init_ok)
|
||||
goto __exit;
|
||||
|
||||
elog_file_port_init();
|
||||
|
||||
cfg.name = ELOG_FILE_NAME;
|
||||
cfg.max_size = ELOG_FILE_MAX_SIZE;
|
||||
cfg.max_rotate = ELOG_FILE_MAX_ROTATE;
|
||||
|
||||
elog_file_config(&cfg);
|
||||
|
||||
init_ok = true;
|
||||
__exit:
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* rotate the log file xxx.log.n-1 => xxx.log.n, and xxx.log => xxx.log.0
|
||||
*/
|
||||
static bool elog_file_rotate(void)
|
||||
{
|
||||
#define SUFFIX_LEN 10
|
||||
/* mv xxx.log.n-1 => xxx.log.n, and xxx.log => xxx.log.0 */
|
||||
int n, err = 0;
|
||||
char oldpath[256], newpath[256];
|
||||
size_t base = strlen(local_cfg.name);
|
||||
bool result = true;
|
||||
FILE *tmp_fp;
|
||||
|
||||
memcpy(oldpath, local_cfg.name, base);
|
||||
memcpy(newpath, local_cfg.name, base);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
for (n = local_cfg.max_rotate - 1; n >= 0; --n) {
|
||||
snprintf(oldpath + base, SUFFIX_LEN, n ? ".%d" : "", n - 1);
|
||||
snprintf(newpath + base, SUFFIX_LEN, ".%d", n);
|
||||
/* remove the old file */
|
||||
if ((tmp_fp = fopen(newpath , "r")) != NULL) {
|
||||
fclose(tmp_fp);
|
||||
remove(newpath);
|
||||
}
|
||||
/* change the new log file to old file name */
|
||||
if ((tmp_fp = fopen(oldpath , "r")) != NULL) {
|
||||
fclose(tmp_fp);
|
||||
err = rename(oldpath, newpath);
|
||||
}
|
||||
|
||||
if (err < 0) {
|
||||
result = false;
|
||||
goto __exit;
|
||||
}
|
||||
}
|
||||
|
||||
__exit:
|
||||
/* reopen the file */
|
||||
fp = fopen(local_cfg.name, "a+");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void elog_file_write(const char *log, size_t size)
|
||||
{
|
||||
size_t file_size = 0;
|
||||
|
||||
ELOG_ASSERT(init_ok);
|
||||
ELOG_ASSERT(log);
|
||||
|
||||
elog_file_port_lock();
|
||||
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
|
||||
if (unlikely(file_size > local_cfg.max_size)) {
|
||||
#if ELOG_FILE_MAX_ROTATE > 0
|
||||
if (!elog_file_rotate()) {
|
||||
goto __exit;
|
||||
}
|
||||
#else
|
||||
goto __exit;
|
||||
#endif
|
||||
}
|
||||
|
||||
fwrite(log, size, 1, fp);
|
||||
|
||||
#ifdef ELOG_FILE_FLUSH_CACHE_ENABLE
|
||||
fflush(fp);
|
||||
#endif
|
||||
|
||||
__exit:
|
||||
elog_file_port_unlock();
|
||||
}
|
||||
|
||||
void elog_file_deinit(void)
|
||||
{
|
||||
ELOG_ASSERT(init_ok);
|
||||
|
||||
ElogFileCfg cfg = {NULL, 0, 0};
|
||||
|
||||
elog_file_config(&cfg);
|
||||
|
||||
elog_file_port_deinit();
|
||||
|
||||
init_ok = false;
|
||||
}
|
||||
|
||||
void elog_file_config(ElogFileCfg *cfg)
|
||||
{
|
||||
elog_file_port_lock();
|
||||
|
||||
if (fp) {
|
||||
fclose(fp);
|
||||
fp = NULL;
|
||||
}
|
||||
|
||||
if (cfg != NULL) {
|
||||
local_cfg.name = cfg->name;
|
||||
local_cfg.max_size = cfg->max_size;
|
||||
local_cfg.max_rotate = cfg->max_rotate;
|
||||
|
||||
if (local_cfg.name != NULL && strlen(local_cfg.name) > 0)
|
||||
fp = fopen(local_cfg.name, "a+");
|
||||
}
|
||||
|
||||
elog_file_port_unlock();
|
||||
}
|
||||
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2019, Qintl, <qintl_linux@163.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is an head file for file log plugin. You can see all be called functions.
|
||||
* Created on: 2019-01-05
|
||||
*/
|
||||
|
||||
#ifndef __ELOG_FILE__H__
|
||||
#define __ELOG_FILE__H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <elog.h>
|
||||
#include <elog_file_cfg.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* EasyLogger file log plugin's software version number */
|
||||
#define ELOG_FILE_SW_VERSION "V1.0.0"
|
||||
#ifdef linux
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
#else
|
||||
#define likely(x) (x)
|
||||
#define unlikely(x) (x)
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
char *name; /* file name */
|
||||
size_t max_size; /* file max size */
|
||||
int max_rotate; /* max rotate file count */
|
||||
} ElogFileCfg;
|
||||
|
||||
/* elog_file.c */
|
||||
ElogErrCode elog_file_init(void);
|
||||
void elog_file_write(const char *log, size_t size);
|
||||
void elog_file_config(ElogFileCfg *cfg);
|
||||
void elog_file_deinit(void);
|
||||
|
||||
/* elog_file_port.c */
|
||||
ElogErrCode elog_file_port_init(void);
|
||||
void elog_file_port_lock(void);
|
||||
void elog_file_port_unlock(void);
|
||||
void elog_file_port_deinit(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2019, Qintl, <qintl_linux@163.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is the configure head file for this flash log plugin.
|
||||
* Created on: 2019-01-05
|
||||
*/
|
||||
|
||||
#ifndef _ELOG_FILE_CFG_H_
|
||||
#define _ELOG_FILE_CFG_H_
|
||||
|
||||
/* EasyLogger file log plugin's using file name */
|
||||
#define ELOG_FILE_NAME /* @note you must define it for a value */
|
||||
|
||||
/* EasyLogger file log plugin's using file max size */
|
||||
#define ELOG_FILE_MAX_SIZE /* @note you must define it for a value */
|
||||
|
||||
/* EasyLogger file log plugin's using max rotate file count */
|
||||
#define ELOG_FILE_MAX_ROTATE /* @note you must define it for a value */
|
||||
|
||||
#endif /* _ELOG_FILE_CFG_H_ */
|
||||
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2019, Qintl, <qintl_linux@163.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Portable interface for EasyLogger's file log pulgin.
|
||||
* Created on: 2019-01-05
|
||||
*/
|
||||
|
||||
#include "elog_file.h"
|
||||
|
||||
/**
|
||||
* EasyLogger flile log pulgin port initialize
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_file_port_init(void)
|
||||
{
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
/* add your code here */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* file log lock
|
||||
*/
|
||||
void elog_file_port_lock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* file log unlock
|
||||
*/
|
||||
void elog_file_port_unlock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* file log deinit
|
||||
*/
|
||||
void elog_file_port_deinit(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
@ -1,308 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2017, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Save log to flash. Must use EasyFlash(https://github.com/armink/EasyFlash) library.
|
||||
* Created on: 2015-06-05
|
||||
*/
|
||||
|
||||
#define LOG_TAG "elog.flash"
|
||||
|
||||
#include "elog_flash.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
/* flash log buffer */
|
||||
static char log_buf[ELOG_FLASH_BUF_SIZE] = { 0 };
|
||||
/* current flash log buffer write position */
|
||||
static size_t cur_buf_size = 0;
|
||||
#endif
|
||||
|
||||
/* initialize OK flag */
|
||||
static bool init_ok = false;
|
||||
/* the flash log buffer lock enable or disable. default is enable */
|
||||
static bool log_buf_lock_enabled = true;
|
||||
/* the flash log buffer is locked before enable. */
|
||||
static bool log_buf_is_locked_before_enable = false;
|
||||
/* the flash log buffer is locked before disable. */
|
||||
static bool log_buf_is_locked_before_disable = false;
|
||||
static void log_buf_lock(void);
|
||||
static void log_buf_unlock(void);
|
||||
|
||||
/**
|
||||
* EasyLogger flash log plugin initialize.
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_flash_init(void) {
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
/* buffer size must be word alignment */
|
||||
ELOG_ASSERT(ELOG_FLASH_BUF_SIZE % 4 == 0);
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
/* initialize current flash log buffer write position */
|
||||
cur_buf_size = 0;
|
||||
#endif
|
||||
|
||||
/* port initialize */
|
||||
elog_flash_port_init();
|
||||
/* initialize OK */
|
||||
init_ok = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and output log which saved in flash.
|
||||
*
|
||||
* @param index index for saved log. @note It will auto word alignment.
|
||||
* Minimum index is 0.
|
||||
* Maximum index is log used flash total size - 1.
|
||||
* @param size
|
||||
*/
|
||||
void elog_flash_output(size_t index, size_t size) {
|
||||
/* 128 bytes buffer */
|
||||
uint32_t buf[32] = { 0 };
|
||||
size_t log_total_size = ef_log_get_used_size();
|
||||
size_t buf_size = sizeof(buf);
|
||||
size_t read_size = 0, read_overage_size = 0;
|
||||
|
||||
/* word alignment for index */
|
||||
index = index / 4 * 4;
|
||||
if (index + size > log_total_size) {
|
||||
log_i("The output position and size is out of bound. The max size is %d.", log_total_size);
|
||||
return;
|
||||
}
|
||||
/* must be call this function after initialize OK */
|
||||
ELOG_ASSERT(init_ok);
|
||||
/* lock flash log buffer */
|
||||
log_buf_lock();
|
||||
/* output all flash saved log. It will use filter */
|
||||
while (true) {
|
||||
if (read_size + buf_size < size) {
|
||||
ef_log_read(index + read_size, buf, buf_size);
|
||||
elog_flash_port_output((const char*)buf, buf_size);
|
||||
read_size += buf_size;
|
||||
} else {
|
||||
/* flash read is word alignment */
|
||||
if ((size - read_size) % 4 == 0) {
|
||||
read_overage_size = 0;
|
||||
} else {
|
||||
read_overage_size = 4 - ((size - read_size) % 4);
|
||||
}
|
||||
ef_log_read(index + read_size, buf, size - read_size + read_overage_size);
|
||||
elog_flash_port_output((const char*) buf + read_overage_size, size - read_size);
|
||||
/* output newline sign */
|
||||
elog_flash_port_output(ELOG_NEWLINE_SIGN, strlen(ELOG_NEWLINE_SIGN));
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* unlock flash log buffer */
|
||||
log_buf_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and output all log which saved in flash.
|
||||
*/
|
||||
void elog_flash_output_all(void) {
|
||||
elog_flash_output(0, ef_log_get_used_size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and output recent log which saved in flash.
|
||||
*
|
||||
* @param size recent log size
|
||||
*/
|
||||
void elog_flash_output_recent(size_t size) {
|
||||
size_t max_size = ef_log_get_used_size();
|
||||
|
||||
if (size == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (size > max_size) {
|
||||
log_i("The output size is out of bound. The max size is %d.", max_size);
|
||||
} else {
|
||||
elog_flash_output(max_size - size, size);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write log to flash. The flash write use buffer mode.
|
||||
*
|
||||
* @param log log
|
||||
* @param size log size
|
||||
*/
|
||||
void elog_flash_write(const char *log, size_t size) {
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
size_t write_size = 0, write_index = 0;
|
||||
#else
|
||||
size_t write_size_temp = 0;
|
||||
EfErrCode result = EF_NO_ERR;
|
||||
/* write some '\r' for word alignment */
|
||||
char write_overage_c[4] = { '\r', '\r', '\r', '\r' };
|
||||
#endif
|
||||
|
||||
/* must be call this function after initialize OK */
|
||||
ELOG_ASSERT(init_ok);
|
||||
|
||||
/* lock flash log buffer */
|
||||
log_buf_lock();
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
while (true) {
|
||||
if (cur_buf_size + size > ELOG_FLASH_BUF_SIZE) {
|
||||
write_size = ELOG_FLASH_BUF_SIZE - cur_buf_size;
|
||||
elog_memcpy(log_buf + cur_buf_size, log + write_index, write_size);
|
||||
write_index += write_size;
|
||||
size -= write_size;
|
||||
cur_buf_size += write_size;
|
||||
/* unlock flash log buffer */
|
||||
log_buf_unlock();
|
||||
/* write all buffered log to flash, cur_buf_size will reset */
|
||||
elog_flash_flush();
|
||||
/* lock flash log buffer */
|
||||
log_buf_lock();
|
||||
} else {
|
||||
elog_memcpy(log_buf + cur_buf_size, log + write_index, size);
|
||||
cur_buf_size += size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* calculate the word alignment write size */
|
||||
write_size_temp = size / 4 * 4;
|
||||
/* write log to flash */
|
||||
result = ef_log_write((uint32_t *) log, write_size_temp);
|
||||
/* write last word alignment data */
|
||||
if ((result == EF_NO_ERR) && (write_size_temp != size)) {
|
||||
elog_memcpy(write_overage_c, log + write_size_temp, size - write_size_temp);
|
||||
ef_log_write((uint32_t *) write_overage_c, 4);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* unlock flash log buffer */
|
||||
log_buf_unlock();
|
||||
}
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
/**
|
||||
* write all buffered log to flash
|
||||
*/
|
||||
void elog_flash_flush(void) {
|
||||
size_t write_overage_size = 0;
|
||||
|
||||
/* must be call this function after initialize OK */
|
||||
ELOG_ASSERT(init_ok);
|
||||
/* lock flash log buffer */
|
||||
log_buf_lock();
|
||||
/* flash write is word alignment */
|
||||
if (cur_buf_size % 4 != 0) {
|
||||
write_overage_size = 4 - (cur_buf_size % 4);
|
||||
}
|
||||
/* fill '\r' for word alignment */
|
||||
memset(log_buf + cur_buf_size, '\r', write_overage_size);
|
||||
/* write all buffered log to flash */
|
||||
ef_log_write((uint32_t *) log_buf, cur_buf_size + write_overage_size);
|
||||
/* reset position */
|
||||
cur_buf_size = 0;
|
||||
/* unlock flash log buffer */
|
||||
log_buf_unlock();
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* clean all log which in flash and ram buffer
|
||||
*/
|
||||
void elog_flash_clean(void) {
|
||||
EfErrCode clean_result = EF_NO_ERR;
|
||||
|
||||
/* must be call this function after initialize OK */
|
||||
ELOG_ASSERT(init_ok);
|
||||
/* lock flash log buffer */
|
||||
log_buf_lock();
|
||||
/* clean all log which in flash */
|
||||
clean_result = ef_log_clean();
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
/* reset position */
|
||||
cur_buf_size = 0;
|
||||
#endif
|
||||
|
||||
/* unlock flash log buffer */
|
||||
log_buf_unlock();
|
||||
|
||||
if(clean_result == EF_NO_ERR) {
|
||||
log_i("All logs which in flash is clean OK.");
|
||||
} else {
|
||||
log_e("Clean logs which in flash has an error!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* enable or disable flash plugin lock
|
||||
* @note disable this lock is not recommended except you want output system exception log
|
||||
*
|
||||
* @param enabled true: enable false: disable
|
||||
*/
|
||||
void elog_flash_lock_enabled(bool enabled) {
|
||||
log_buf_lock_enabled = enabled;
|
||||
/* it will re-lock or re-unlock before log buffer lock enable */
|
||||
if (log_buf_lock_enabled) {
|
||||
if (!log_buf_is_locked_before_disable && log_buf_is_locked_before_enable) {
|
||||
/* the log buffer lock is unlocked before disable, and the lock will unlocking after enable */
|
||||
elog_flash_port_lock();
|
||||
} else if (log_buf_is_locked_before_disable && !log_buf_is_locked_before_enable) {
|
||||
/* the log buffer lock is locked before disable, and the lock will locking after enable */
|
||||
elog_flash_port_unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* lock flash log buffer
|
||||
*/
|
||||
static void log_buf_lock(void) {
|
||||
if (log_buf_lock_enabled) {
|
||||
elog_flash_port_lock();
|
||||
log_buf_is_locked_before_disable = true;
|
||||
} else {
|
||||
log_buf_is_locked_before_enable = true;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* unlock flash log buffer
|
||||
*/
|
||||
static void log_buf_unlock(void) {
|
||||
if (log_buf_lock_enabled) {
|
||||
elog_flash_port_unlock();
|
||||
log_buf_is_locked_before_disable = false;
|
||||
} else {
|
||||
log_buf_is_locked_before_enable = false;
|
||||
}
|
||||
}
|
||||
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2017, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is an head file for flash log plugin. You can see all be called functions.
|
||||
* Created on: 2015-06-05
|
||||
*/
|
||||
|
||||
#ifndef __ELOG_FLASH_H__
|
||||
#define __ELOG_FLASH_H__
|
||||
|
||||
#include <elog.h>
|
||||
#include <elog_flash_cfg.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_FLASH_BUF_SIZE)
|
||||
#error "Please configure RAM buffer size (in elog_flash_cfg.h)"
|
||||
#endif
|
||||
|
||||
/* EasyLogger flash log plugin's software version number */
|
||||
#define ELOG_FLASH_SW_VERSION "V2.0.1"
|
||||
|
||||
/* elog_flash.c */
|
||||
ElogErrCode elog_flash_init(void);
|
||||
void elog_flash_output(size_t pos, size_t size);
|
||||
void elog_flash_output_all(void);
|
||||
void elog_flash_output_recent(size_t size);
|
||||
void elog_flash_set_filter(uint8_t level,const char *tag,const char *keyword);
|
||||
void elog_flash_write(const char *log, size_t size);
|
||||
void elog_flash_clean(void);
|
||||
void elog_flash_lock_enabled(bool enabled);
|
||||
|
||||
#ifdef ELOG_FLASH_USING_BUF_MODE
|
||||
void elog_flash_flush(void);
|
||||
#endif
|
||||
|
||||
/* elog_flash_port.c */
|
||||
ElogErrCode elog_flash_port_init(void);
|
||||
void elog_flash_port_output(const char *log, size_t size);
|
||||
void elog_flash_port_lock(void);
|
||||
void elog_flash_port_unlock(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ELOG_FLASH_H__ */
|
||||
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: It is the configure head file for this flash log plugin.
|
||||
* Created on: 2015-07-30
|
||||
*/
|
||||
|
||||
#ifndef _ELOG_FLASH_CFG_H_
|
||||
#define _ELOG_FLASH_CFG_H_
|
||||
|
||||
/* EasyLogger flash log plugin's using buffer mode */
|
||||
#define ELOG_FLASH_USING_BUF_MODE
|
||||
/* EasyLogger flash log plugin's RAM buffer size */
|
||||
#define ELOG_FLASH_BUF_SIZE /* @note you must define it for a value */
|
||||
|
||||
#endif /* _ELOG_FLASH_CFG_H_ */
|
||||
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Portable interface for EasyLogger's flash log pulgin.
|
||||
* Created on: 2015-07-28
|
||||
*/
|
||||
|
||||
#include "elog_flash.h"
|
||||
|
||||
/**
|
||||
* EasyLogger flash log pulgin port initialize
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_flash_port_init(void) {
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
/* add your code here */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* output flash saved log port interface
|
||||
*
|
||||
* @param log flash saved log
|
||||
* @param size log size
|
||||
*/
|
||||
void elog_flash_port_output(const char *log, size_t size) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* flash log lock
|
||||
*/
|
||||
void elog_flash_port_lock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* flash log unlock
|
||||
*/
|
||||
void elog_flash_port_unlock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
@ -1,115 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Portable interface for each platform.
|
||||
* Created on: 2015-04-28
|
||||
*/
|
||||
|
||||
#include <elog.h>
|
||||
|
||||
/**
|
||||
* EasyLogger port initialize
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_port_init(void) {
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
/* add your code here */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* EasyLogger port deinitialize
|
||||
*
|
||||
*/
|
||||
void elog_port_deinit(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* output log port interface
|
||||
*
|
||||
* @param log output of log
|
||||
* @param size log size
|
||||
*/
|
||||
void elog_port_output(const char *log, size_t size) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* output lock
|
||||
*/
|
||||
void elog_port_output_lock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* output unlock
|
||||
*/
|
||||
void elog_port_output_unlock(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* get current time interface
|
||||
*
|
||||
* @return current time
|
||||
*/
|
||||
const char *elog_port_get_time(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* get current process name interface
|
||||
*
|
||||
* @return current process name
|
||||
*/
|
||||
const char *elog_port_get_p_info(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* get current thread name interface
|
||||
*
|
||||
* @return current thread name
|
||||
*/
|
||||
const char *elog_port_get_t_info(void) {
|
||||
|
||||
/* add your code here */
|
||||
|
||||
}
|
||||
@ -1,922 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2018, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Initialize function and other general function.
|
||||
* Created on: 2015-04-28
|
||||
*/
|
||||
|
||||
#define LOG_TAG "elog"
|
||||
|
||||
#include <elog.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if !defined(ELOG_OUTPUT_LVL)
|
||||
#error "Please configure static output log level (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_LINE_NUM_MAX_LEN)
|
||||
#error "Please configure output line number max length (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_LINE_BUF_SIZE)
|
||||
#error "Please configure buffer size for every line's log (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_FILTER_TAG_MAX_LEN)
|
||||
#error "Please configure output filter's tag max length (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_FILTER_KW_MAX_LEN)
|
||||
#error "Please configure output filter's keyword max length (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
#if !defined(ELOG_NEWLINE_SIGN)
|
||||
#error "Please configure output newline sign (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
/* output filter's tag level max num */
|
||||
#ifndef ELOG_FILTER_TAG_LVL_MAX_NUM
|
||||
#define ELOG_FILTER_TAG_LVL_MAX_NUM 4
|
||||
#endif
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/**
|
||||
* CSI(Control Sequence Introducer/Initiator) sign
|
||||
* more information on https://en.wikipedia.org/wiki/ANSI_escape_code
|
||||
*/
|
||||
#define CSI_START "\033["
|
||||
#define CSI_END "\033[0m"
|
||||
/* output log front color */
|
||||
#define F_BLACK "30;"
|
||||
#define F_RED "31;"
|
||||
#define F_GREEN "32;"
|
||||
#define F_YELLOW "33;"
|
||||
#define F_BLUE "34;"
|
||||
#define F_MAGENTA "35;"
|
||||
#define F_CYAN "36;"
|
||||
#define F_WHITE "37;"
|
||||
/* output log background color */
|
||||
#define B_NULL
|
||||
#define B_BLACK "40;"
|
||||
#define B_RED "41;"
|
||||
#define B_GREEN "42;"
|
||||
#define B_YELLOW "43;"
|
||||
#define B_BLUE "44;"
|
||||
#define B_MAGENTA "45;"
|
||||
#define B_CYAN "46;"
|
||||
#define B_WHITE "47;"
|
||||
/* output log fonts style */
|
||||
#define S_BOLD "1m"
|
||||
#define S_UNDERLINE "4m"
|
||||
#define S_BLINK "5m"
|
||||
#define S_NORMAL "22m"
|
||||
/* output log default color definition: [front color] + [background color] + [show style] */
|
||||
#ifndef ELOG_COLOR_ASSERT
|
||||
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
|
||||
#endif
|
||||
#ifndef ELOG_COLOR_ERROR
|
||||
#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL)
|
||||
#endif
|
||||
#ifndef ELOG_COLOR_WARN
|
||||
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
|
||||
#endif
|
||||
#ifndef ELOG_COLOR_INFO
|
||||
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
|
||||
#endif
|
||||
#ifndef ELOG_COLOR_DEBUG
|
||||
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
|
||||
#endif
|
||||
#ifndef ELOG_COLOR_VERBOSE
|
||||
#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL)
|
||||
#endif
|
||||
#endif /* ELOG_COLOR_ENABLE */
|
||||
|
||||
/* EasyLogger object */
|
||||
static EasyLogger elog;
|
||||
/* every line log's buffer */
|
||||
static char log_buf[ELOG_LINE_BUF_SIZE] = { 0 };
|
||||
/* level output info */
|
||||
static const char *level_output_info[] = {
|
||||
[ELOG_LVL_ASSERT] = "A/",
|
||||
[ELOG_LVL_ERROR] = "E/",
|
||||
[ELOG_LVL_WARN] = "W/",
|
||||
[ELOG_LVL_INFO] = "I/",
|
||||
[ELOG_LVL_DEBUG] = "D/",
|
||||
[ELOG_LVL_VERBOSE] = "V/",
|
||||
};
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/* color output info */
|
||||
static const char *color_output_info[] = {
|
||||
[ELOG_LVL_ASSERT] = ELOG_COLOR_ASSERT,
|
||||
[ELOG_LVL_ERROR] = ELOG_COLOR_ERROR,
|
||||
[ELOG_LVL_WARN] = ELOG_COLOR_WARN,
|
||||
[ELOG_LVL_INFO] = ELOG_COLOR_INFO,
|
||||
[ELOG_LVL_DEBUG] = ELOG_COLOR_DEBUG,
|
||||
[ELOG_LVL_VERBOSE] = ELOG_COLOR_VERBOSE,
|
||||
};
|
||||
#endif /* ELOG_COLOR_ENABLE */
|
||||
|
||||
static bool get_fmt_enabled(uint8_t level, size_t set);
|
||||
static void elog_set_filter_tag_lvl_default();
|
||||
|
||||
/* EasyLogger assert hook */
|
||||
void (*elog_assert_hook)(const char* expr, const char* func, size_t line);
|
||||
|
||||
extern void elog_port_output(const char *log, size_t size);
|
||||
extern void elog_port_output_lock(void);
|
||||
extern void elog_port_output_unlock(void);
|
||||
|
||||
/**
|
||||
* EasyLogger initialize.
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_init(void) {
|
||||
extern ElogErrCode elog_port_init(void);
|
||||
extern ElogErrCode elog_async_init(void);
|
||||
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
if (elog.init_ok == true) {
|
||||
return result;
|
||||
}
|
||||
|
||||
/* port initialize */
|
||||
result = elog_port_init();
|
||||
if (result != ELOG_NO_ERR) {
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
|
||||
result = elog_async_init();
|
||||
if (result != ELOG_NO_ERR) {
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* enable the output lock */
|
||||
elog_output_lock_enabled(true);
|
||||
/* output locked status initialize */
|
||||
elog.output_is_locked_before_enable = false;
|
||||
elog.output_is_locked_before_disable = false;
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/* disable text color by default */
|
||||
elog_set_text_color_enabled(false);
|
||||
#endif
|
||||
|
||||
/* set level is ELOG_LVL_VERBOSE */
|
||||
elog_set_filter_lvl(ELOG_LVL_VERBOSE);
|
||||
|
||||
/* set tag_level to default val */
|
||||
elog_set_filter_tag_lvl_default();
|
||||
|
||||
elog.init_ok = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* EasyLogger deinitialize.
|
||||
*
|
||||
*/
|
||||
void elog_deinit(void) {
|
||||
extern ElogErrCode elog_port_deinit(void);
|
||||
extern ElogErrCode elog_async_deinit(void);
|
||||
|
||||
if (!elog.init_ok) {
|
||||
return ;
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
|
||||
elog_async_deinit();
|
||||
#endif
|
||||
|
||||
/* port deinitialize */
|
||||
elog_port_deinit();
|
||||
|
||||
elog.init_ok = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EasyLogger start after initialize.
|
||||
*/
|
||||
void elog_start(void) {
|
||||
if (!elog.init_ok) {
|
||||
return ;
|
||||
}
|
||||
|
||||
/* enable output */
|
||||
elog_set_output_enabled(true);
|
||||
|
||||
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
|
||||
elog_async_enabled(true);
|
||||
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
|
||||
elog_buf_enabled(true);
|
||||
#endif
|
||||
|
||||
/* show version */
|
||||
log_i("EasyLogger V%s is initialize success.", ELOG_SW_VERSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* EasyLogger stop after initialize.
|
||||
*/
|
||||
void elog_stop(void) {
|
||||
if (!elog.init_ok) {
|
||||
return ;
|
||||
}
|
||||
|
||||
/* disable output */
|
||||
elog_set_output_enabled(false);
|
||||
|
||||
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
|
||||
elog_async_enabled(false);
|
||||
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
|
||||
elog_buf_enabled(false);
|
||||
#endif
|
||||
|
||||
/* show version */
|
||||
log_i("EasyLogger V%s is deinitialize success.", ELOG_SW_VERSION);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set output enable or disable
|
||||
*
|
||||
* @param enabled TRUE: enable FALSE: disable
|
||||
*/
|
||||
void elog_set_output_enabled(bool enabled) {
|
||||
ELOG_ASSERT((enabled == false) || (enabled == true));
|
||||
|
||||
elog.output_enabled = enabled;
|
||||
}
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/**
|
||||
* set log text color enable or disable
|
||||
*
|
||||
* @param enabled TRUE: enable FALSE:disable
|
||||
*/
|
||||
void elog_set_text_color_enabled(bool enabled) {
|
||||
elog.text_color_enabled = enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* get log text color enable status
|
||||
*
|
||||
* @return enable or disable
|
||||
*/
|
||||
bool elog_get_text_color_enabled(void) {
|
||||
return elog.text_color_enabled;
|
||||
}
|
||||
#endif /* ELOG_COLOR_ENABLE */
|
||||
|
||||
/**
|
||||
* get output is enable or disable
|
||||
*
|
||||
* @return enable or disable
|
||||
*/
|
||||
bool elog_get_output_enabled(void) {
|
||||
return elog.output_enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* set log output format. only enable or disable
|
||||
*
|
||||
* @param level level
|
||||
* @param set format set
|
||||
*/
|
||||
void elog_set_fmt(uint8_t level, size_t set) {
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
|
||||
elog.enabled_fmt_set[level] = set;
|
||||
}
|
||||
|
||||
/**
|
||||
* set log filter all parameter
|
||||
*
|
||||
* @param level level
|
||||
* @param tag tag
|
||||
* @param keyword keyword
|
||||
*/
|
||||
void elog_set_filter(uint8_t level, const char *tag, const char *keyword) {
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
|
||||
elog_set_filter_lvl(level);
|
||||
elog_set_filter_tag(tag);
|
||||
elog_set_filter_kw(keyword);
|
||||
}
|
||||
|
||||
/**
|
||||
* set log filter's level
|
||||
*
|
||||
* @param level level
|
||||
*/
|
||||
void elog_set_filter_lvl(uint8_t level) {
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
|
||||
elog.filter.level = level;
|
||||
}
|
||||
|
||||
/**
|
||||
* set log filter's tag
|
||||
*
|
||||
* @param tag tag
|
||||
*/
|
||||
void elog_set_filter_tag(const char *tag) {
|
||||
strncpy(elog.filter.tag, tag, ELOG_FILTER_TAG_MAX_LEN);
|
||||
}
|
||||
|
||||
/**
|
||||
* set log filter's keyword
|
||||
*
|
||||
* @param keyword keyword
|
||||
*/
|
||||
void elog_set_filter_kw(const char *keyword) {
|
||||
strncpy(elog.filter.keyword, keyword, ELOG_FILTER_KW_MAX_LEN);
|
||||
}
|
||||
|
||||
/**
|
||||
* lock output
|
||||
*/
|
||||
void elog_output_lock(void) {
|
||||
if (elog.output_lock_enabled) {
|
||||
elog_port_output_lock();
|
||||
elog.output_is_locked_before_disable = true;
|
||||
} else {
|
||||
elog.output_is_locked_before_enable = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* unlock output
|
||||
*/
|
||||
void elog_output_unlock(void) {
|
||||
if (elog.output_lock_enabled) {
|
||||
elog_port_output_unlock();
|
||||
elog.output_is_locked_before_disable = false;
|
||||
} else {
|
||||
elog.output_is_locked_before_enable = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set log filter's tag level val to default
|
||||
*/
|
||||
static void elog_set_filter_tag_lvl_default()
|
||||
{
|
||||
uint8_t i = 0;
|
||||
|
||||
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
|
||||
memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1);
|
||||
elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT;
|
||||
elog.filter.tag_lvl[i].tag_use_flag = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the filter's level by different tag.
|
||||
* The log on this tag which level is less than it will stop output.
|
||||
*
|
||||
* example:
|
||||
* // the example tag log enter silent mode
|
||||
* elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_SILENT);
|
||||
* // the example tag log which level is less than INFO level will stop output
|
||||
* elog_set_filter_tag_lvl("example", ELOG_LVL_INFO);
|
||||
* // remove example tag's level filter, all level log will resume output
|
||||
* elog_set_filter_tag_lvl("example", ELOG_FILTER_LVL_ALL);
|
||||
*
|
||||
* @param tag log tag
|
||||
* @param level The filter level. When the level is ELOG_FILTER_LVL_SILENT, the log enter silent mode.
|
||||
* When the level is ELOG_FILTER_LVL_ALL, it will remove this tag's level filer.
|
||||
* Then all level log will resume output.
|
||||
*
|
||||
*/
|
||||
void elog_set_filter_tag_lvl(const char *tag, uint8_t level)
|
||||
{
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
ELOG_ASSERT(tag != ((void *)0));
|
||||
uint8_t i = 0;
|
||||
|
||||
if (!elog.init_ok) {
|
||||
return;
|
||||
}
|
||||
|
||||
elog_port_output_lock();
|
||||
/* find the tag in arr */
|
||||
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
|
||||
if (elog.filter.tag_lvl[i].tag_use_flag == true &&
|
||||
!strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < ELOG_FILTER_TAG_LVL_MAX_NUM){
|
||||
/* find OK */
|
||||
if (level == ELOG_FILTER_LVL_ALL){
|
||||
/* remove current tag's level filter when input level is the lowest level */
|
||||
elog.filter.tag_lvl[i].tag_use_flag = false;
|
||||
memset(elog.filter.tag_lvl[i].tag, '\0', ELOG_FILTER_TAG_MAX_LEN + 1);
|
||||
elog.filter.tag_lvl[i].level = ELOG_FILTER_LVL_SILENT;
|
||||
} else{
|
||||
elog.filter.tag_lvl[i].level = level;
|
||||
}
|
||||
} else{
|
||||
/* only add the new tag's level filer when level is not ELOG_FILTER_LVL_ALL */
|
||||
if (level != ELOG_FILTER_LVL_ALL){
|
||||
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
|
||||
if (elog.filter.tag_lvl[i].tag_use_flag == false){
|
||||
strncpy(elog.filter.tag_lvl[i].tag, tag, ELOG_FILTER_TAG_MAX_LEN);
|
||||
elog.filter.tag_lvl[i].level = level;
|
||||
elog.filter.tag_lvl[i].tag_use_flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elog_output_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* get the level on tag's level filer
|
||||
*
|
||||
* @param tag tag
|
||||
*
|
||||
* @return It will return the lowest level when tag was not found.
|
||||
* Other level will return when tag was found.
|
||||
*/
|
||||
uint8_t elog_get_filter_tag_lvl(const char *tag)
|
||||
{
|
||||
ELOG_ASSERT(tag != ((void *)0));
|
||||
uint8_t i = 0;
|
||||
uint8_t level = ELOG_FILTER_LVL_ALL;
|
||||
|
||||
if (!elog.init_ok) {
|
||||
return level;
|
||||
}
|
||||
|
||||
elog_port_output_lock();
|
||||
/* find the tag in arr */
|
||||
for (i =0; i< ELOG_FILTER_TAG_LVL_MAX_NUM; i++){
|
||||
if (elog.filter.tag_lvl[i].tag_use_flag == true &&
|
||||
!strncmp(tag, elog.filter.tag_lvl[i].tag,ELOG_FILTER_TAG_MAX_LEN)){
|
||||
level = elog.filter.tag_lvl[i].level;
|
||||
break;
|
||||
}
|
||||
}
|
||||
elog_output_unlock();
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
/**
|
||||
* output RAW format log
|
||||
*
|
||||
* @param format output format
|
||||
* @param ... args
|
||||
*/
|
||||
void elog_raw(const char *format, ...) {
|
||||
va_list args;
|
||||
size_t log_len = 0;
|
||||
int fmt_result;
|
||||
|
||||
/* check output enabled */
|
||||
if (!elog.output_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* args point to the first variable parameter */
|
||||
va_start(args, format);
|
||||
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
|
||||
/* package log data to buffer */
|
||||
fmt_result = vsnprintf(log_buf, ELOG_LINE_BUF_SIZE, format, args);
|
||||
|
||||
/* output converted log */
|
||||
if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) {
|
||||
log_len = fmt_result;
|
||||
} else {
|
||||
log_len = ELOG_LINE_BUF_SIZE;
|
||||
}
|
||||
/* output log */
|
||||
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
|
||||
extern void elog_async_output(uint8_t level, const char *log, size_t size);
|
||||
/* raw log will using assert level */
|
||||
elog_async_output(ELOG_LVL_ASSERT, log_buf, log_len);
|
||||
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
|
||||
extern void elog_buf_output(const char *log, size_t size);
|
||||
elog_buf_output(log_buf, log_len);
|
||||
#else
|
||||
elog_port_output(log_buf, log_len);
|
||||
#endif
|
||||
/* unlock output */
|
||||
elog_output_unlock();
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* output the log
|
||||
*
|
||||
* @param level level
|
||||
* @param tag tag
|
||||
* @param file file name
|
||||
* @param func function name
|
||||
* @param line line number
|
||||
* @param format output format
|
||||
* @param ... args
|
||||
*
|
||||
*/
|
||||
void elog_output(uint8_t level, const char *tag, const char *file, const char *func,
|
||||
const long line, const char *format, ...) {
|
||||
extern const char *elog_port_get_time(void);
|
||||
extern const char *elog_port_get_p_info(void);
|
||||
extern const char *elog_port_get_t_info(void);
|
||||
|
||||
size_t tag_len = strlen(tag), log_len = 0, newline_len = strlen(ELOG_NEWLINE_SIGN);
|
||||
char line_num[ELOG_LINE_NUM_MAX_LEN + 1] = { 0 };
|
||||
char tag_sapce[ELOG_FILTER_TAG_MAX_LEN / 2 + 1] = { 0 };
|
||||
va_list args;
|
||||
int fmt_result;
|
||||
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
|
||||
/* check output enabled */
|
||||
if (!elog.output_enabled) {
|
||||
return;
|
||||
}
|
||||
/* level filter */
|
||||
if (level > elog.filter.level || level > elog_get_filter_tag_lvl(tag)) {
|
||||
return;
|
||||
} else if (!strstr(tag, elog.filter.tag)) { /* tag filter */
|
||||
return;
|
||||
}
|
||||
/* args point to the first variable parameter */
|
||||
va_start(args, format);
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/* add CSI start sign and color info */
|
||||
if (elog.text_color_enabled) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, CSI_START);
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, color_output_info[level]);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* package level info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_LVL)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, level_output_info[level]);
|
||||
}
|
||||
/* package tag info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_TAG)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, tag);
|
||||
/* if the tag length is less than 50% ELOG_FILTER_TAG_MAX_LEN, then fill space */
|
||||
if (tag_len <= ELOG_FILTER_TAG_MAX_LEN / 2) {
|
||||
memset(tag_sapce, ' ', ELOG_FILTER_TAG_MAX_LEN / 2 - tag_len);
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, tag_sapce);
|
||||
}
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
/* package time, process and thread info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_TIME | ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, "[");
|
||||
/* package time info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_TIME)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_time());
|
||||
if (get_fmt_enabled(level, ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
}
|
||||
/* package process info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_P_INFO)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_p_info());
|
||||
if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
}
|
||||
/* package thread info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_T_INFO)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, elog_port_get_t_info());
|
||||
}
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, "] ");
|
||||
}
|
||||
/* package file directory and name, function name and line number info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_DIR | ELOG_FMT_FUNC | ELOG_FMT_LINE)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, "(");
|
||||
/* package file info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_DIR)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, file);
|
||||
if (get_fmt_enabled(level, ELOG_FMT_FUNC)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, ":");
|
||||
} else if (get_fmt_enabled(level, ELOG_FMT_LINE)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
}
|
||||
/* package line info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_LINE)) {
|
||||
snprintf(line_num, ELOG_LINE_NUM_MAX_LEN, "%ld", line);
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, line_num);
|
||||
if (get_fmt_enabled(level, ELOG_FMT_FUNC)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
}
|
||||
/* package func info */
|
||||
if (get_fmt_enabled(level, ELOG_FMT_FUNC)) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, func);
|
||||
|
||||
}
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, ")");
|
||||
}
|
||||
/* package other log data to buffer. '\0' must be added in the end by vsnprintf. */
|
||||
fmt_result = vsnprintf(log_buf + log_len, ELOG_LINE_BUF_SIZE - log_len, format, args);
|
||||
|
||||
va_end(args);
|
||||
/* calculate log length */
|
||||
if ((log_len + fmt_result <= ELOG_LINE_BUF_SIZE) && (fmt_result > -1)) {
|
||||
log_len += fmt_result;
|
||||
} else {
|
||||
/* using max length */
|
||||
log_len = ELOG_LINE_BUF_SIZE;
|
||||
}
|
||||
/* overflow check and reserve some space for CSI end sign and newline sign */
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
if (log_len + (sizeof(CSI_END) - 1) + newline_len > ELOG_LINE_BUF_SIZE) {
|
||||
/* using max length */
|
||||
log_len = ELOG_LINE_BUF_SIZE;
|
||||
/* reserve some space for CSI end sign */
|
||||
log_len -= (sizeof(CSI_END) - 1);
|
||||
#else
|
||||
if (log_len + newline_len > ELOG_LINE_BUF_SIZE) {
|
||||
/* using max length */
|
||||
log_len = ELOG_LINE_BUF_SIZE;
|
||||
#endif /* ELOG_COLOR_ENABLE */
|
||||
/* reserve some space for newline sign */
|
||||
log_len -= newline_len;
|
||||
}
|
||||
/* keyword filter */
|
||||
if (elog.filter.keyword[0] != '\0') {
|
||||
/* add string end sign */
|
||||
log_buf[log_len] = '\0';
|
||||
/* find the keyword */
|
||||
if (!strstr(log_buf, elog.filter.keyword)) {
|
||||
/* unlock output */
|
||||
elog_output_unlock();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
/* add CSI end sign */
|
||||
if (elog.text_color_enabled) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, CSI_END);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* package newline sign */
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN);
|
||||
/* output log */
|
||||
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
|
||||
extern void elog_async_output(uint8_t level, const char *log, size_t size);
|
||||
elog_async_output(level, log_buf, log_len);
|
||||
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
|
||||
extern void elog_buf_output(const char *log, size_t size);
|
||||
elog_buf_output(log_buf, log_len);
|
||||
#else
|
||||
elog_port_output(log_buf, log_len);
|
||||
#endif
|
||||
/* unlock output */
|
||||
elog_output_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* get format enabled
|
||||
*
|
||||
* @param level level
|
||||
* @param set format set
|
||||
*
|
||||
* @return enable or disable
|
||||
*/
|
||||
static bool get_fmt_enabled(uint8_t level, size_t set) {
|
||||
ELOG_ASSERT(level <= ELOG_LVL_VERBOSE);
|
||||
|
||||
if (elog.enabled_fmt_set[level] & set) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* enable or disable logger output lock
|
||||
* @note disable this lock is not recommended except you want output system exception log
|
||||
*
|
||||
* @param enabled true: enable false: disable
|
||||
*/
|
||||
void elog_output_lock_enabled(bool enabled) {
|
||||
elog.output_lock_enabled = enabled;
|
||||
/* it will re-lock or re-unlock before output lock enable */
|
||||
if (elog.output_lock_enabled) {
|
||||
if (!elog.output_is_locked_before_disable && elog.output_is_locked_before_enable) {
|
||||
/* the output lock is unlocked before disable, and the lock will unlocking after enable */
|
||||
elog_port_output_lock();
|
||||
} else if (elog.output_is_locked_before_disable && !elog.output_is_locked_before_enable) {
|
||||
/* the output lock is locked before disable, and the lock will locking after enable */
|
||||
elog_port_output_unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a hook function to EasyLogger assert. It will run when the expression is false.
|
||||
*
|
||||
* @param hook the hook function
|
||||
*/
|
||||
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line)) {
|
||||
elog_assert_hook = hook;
|
||||
}
|
||||
|
||||
/**
|
||||
* find the log level
|
||||
* @note make sure the log level is output on each format
|
||||
*
|
||||
* @param log log buffer
|
||||
*
|
||||
* @return log level, found failed will return -1
|
||||
*/
|
||||
int8_t elog_find_lvl(const char *log) {
|
||||
ELOG_ASSERT(log);
|
||||
/* make sure the log level is output on each format */
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ASSERT] & ELOG_FMT_LVL);
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_ERROR] & ELOG_FMT_LVL);
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_WARN] & ELOG_FMT_LVL);
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_INFO] & ELOG_FMT_LVL);
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_DEBUG] & ELOG_FMT_LVL);
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[ELOG_LVL_VERBOSE] & ELOG_FMT_LVL);
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
uint8_t i;
|
||||
size_t csi_start_len = strlen(CSI_START);
|
||||
for(i = 0; i < ELOG_LVL_TOTAL_NUM; i ++) {
|
||||
if (!strncmp(color_output_info[i], log + csi_start_len, strlen(color_output_info[i]))) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
/* found failed */
|
||||
return -1;
|
||||
#else
|
||||
switch (log[0]) {
|
||||
case 'A': return ELOG_LVL_ASSERT;
|
||||
case 'E': return ELOG_LVL_ERROR;
|
||||
case 'W': return ELOG_LVL_WARN;
|
||||
case 'I': return ELOG_LVL_INFO;
|
||||
case 'D': return ELOG_LVL_DEBUG;
|
||||
case 'V': return ELOG_LVL_VERBOSE;
|
||||
default: return -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* find the log tag
|
||||
* @note make sure the log tag is output on each format
|
||||
* @note the tag don't have space in it
|
||||
*
|
||||
* @param log log buffer
|
||||
* @param lvl log level, you can get it by @see elog_find_lvl
|
||||
* @param tag_len found tag length
|
||||
*
|
||||
* @return log tag, found failed will return NULL
|
||||
*/
|
||||
const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len) {
|
||||
const char *tag = NULL, *tag_end = NULL;
|
||||
|
||||
ELOG_ASSERT(log);
|
||||
ELOG_ASSERT(tag_len);
|
||||
ELOG_ASSERT(lvl < ELOG_LVL_TOTAL_NUM);
|
||||
/* make sure the log tag is output on each format */
|
||||
ELOG_ASSERT(elog.enabled_fmt_set[lvl] & ELOG_FMT_TAG);
|
||||
|
||||
#ifdef ELOG_COLOR_ENABLE
|
||||
tag = log + strlen(CSI_START) + strlen(color_output_info[lvl]) + strlen(level_output_info[lvl]);
|
||||
#else
|
||||
tag = log + strlen(level_output_info[lvl]);
|
||||
#endif
|
||||
/* find the first space after tag */
|
||||
if ((tag_end = memchr(tag, ' ', ELOG_FILTER_TAG_MAX_LEN)) != NULL) {
|
||||
*tag_len = tag_end - tag;
|
||||
} else {
|
||||
tag = NULL;
|
||||
}
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
/**
|
||||
* dump the hex format data to log
|
||||
*
|
||||
* @param name name for hex object, it will show on log header
|
||||
* @param width hex number for every line, such as: 16, 32
|
||||
* @param buf hex buffer
|
||||
* @param size buffer size
|
||||
*/
|
||||
void elog_hexdump(const char *name, uint8_t width, uint8_t *buf, uint16_t size)
|
||||
{
|
||||
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
|
||||
|
||||
uint16_t i, j;
|
||||
uint16_t log_len = 0;
|
||||
char dump_string[8] = {0};
|
||||
int fmt_result;
|
||||
|
||||
if (!elog.output_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* level filter */
|
||||
if (ELOG_LVL_DEBUG > elog.filter.level) {
|
||||
return;
|
||||
} else if (!strstr(name, elog.filter.tag)) { /* tag filter */
|
||||
return;
|
||||
}
|
||||
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
|
||||
for (i = 0; i < size; i += width) {
|
||||
/* package header */
|
||||
fmt_result = snprintf(log_buf, ELOG_LINE_BUF_SIZE, "D/HEX %s: %04X-%04X: ", name, i, i + width - 1);
|
||||
/* calculate log length */
|
||||
if ((fmt_result > -1) && (fmt_result <= ELOG_LINE_BUF_SIZE)) {
|
||||
log_len = fmt_result;
|
||||
} else {
|
||||
log_len = ELOG_LINE_BUF_SIZE;
|
||||
}
|
||||
/* dump hex */
|
||||
for (j = 0; j < width; j++) {
|
||||
if (i + j < size) {
|
||||
snprintf(dump_string, sizeof(dump_string), "%02X ", buf[i + j]);
|
||||
} else {
|
||||
strncpy(dump_string, " ", sizeof(dump_string));
|
||||
}
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, dump_string);
|
||||
if ((j + 1) % 8 == 0) {
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
}
|
||||
}
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, " ");
|
||||
/* dump char for hex */
|
||||
for (j = 0; j < width; j++) {
|
||||
if (i + j < size) {
|
||||
snprintf(dump_string, sizeof(dump_string), "%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, dump_string);
|
||||
}
|
||||
}
|
||||
/* overflow check and reserve some space for newline sign */
|
||||
if (log_len + strlen(ELOG_NEWLINE_SIGN) > ELOG_LINE_BUF_SIZE) {
|
||||
log_len = ELOG_LINE_BUF_SIZE - strlen(ELOG_NEWLINE_SIGN);
|
||||
}
|
||||
/* package newline sign */
|
||||
log_len += elog_strcpy(log_len, log_buf + log_len, ELOG_NEWLINE_SIGN);
|
||||
/* do log output */
|
||||
#if defined(ELOG_ASYNC_OUTPUT_ENABLE)
|
||||
extern void elog_async_output(uint8_t level, const char *log, size_t size);
|
||||
elog_async_output(ELOG_LVL_DEBUG, log_buf, log_len);
|
||||
#elif defined(ELOG_BUF_OUTPUT_ENABLE)
|
||||
extern void elog_buf_output(const char *log, size_t size);
|
||||
elog_buf_output(log_buf, log_len);
|
||||
#else
|
||||
elog_port_output(log_buf, log_len);
|
||||
#endif
|
||||
}
|
||||
/* unlock output */
|
||||
elog_output_unlock();
|
||||
}
|
||||
@ -1,386 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2016-2017, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Logs asynchronous output.
|
||||
* Created on: 2016-11-06
|
||||
*/
|
||||
|
||||
#include <elog.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_ENABLE
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
#include <semaphore.h>
|
||||
/* thread default stack size */
|
||||
#ifndef ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE
|
||||
#if PTHREAD_STACK_MIN > 4*1024
|
||||
#define ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE PTHREAD_STACK_MIN
|
||||
#else
|
||||
#define ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE (1*1024)
|
||||
#endif
|
||||
/* thread default priority */
|
||||
#ifndef ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY
|
||||
#define ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY (sched_get_priority_max(SCHED_RR) - 1)
|
||||
#endif
|
||||
/* output thread poll get log buffer size */
|
||||
#ifndef ELOG_ASYNC_LINE_OUTPUT
|
||||
#ifndef ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE
|
||||
#define ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE (ELOG_ASYNC_OUTPUT_BUF_SIZE - 4)
|
||||
#endif
|
||||
#else
|
||||
#ifndef ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE
|
||||
#define ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE (ELOG_LINE_BUF_SIZE - 4)
|
||||
#endif
|
||||
#endif
|
||||
#endif /* ELOG_ASYNC_OUTPUT_USING_PTHREAD */
|
||||
|
||||
/* asynchronous output log notice */
|
||||
static sem_t output_notice;
|
||||
/* asynchronous output pthread thread */
|
||||
static pthread_t async_output_thread;
|
||||
#endif /* ELOG_ASYNC_OUTPUT_ENABLE */
|
||||
|
||||
/* the highest output level for async mode, other level will sync output */
|
||||
#ifdef ELOG_ASYNC_OUTPUT_LVL
|
||||
#define OUTPUT_LVL ELOG_ASYNC_OUTPUT_LVL
|
||||
#else
|
||||
#define OUTPUT_LVL ELOG_LVL_ASSERT
|
||||
#endif /* ELOG_ASYNC_OUTPUT_LVL */
|
||||
|
||||
/* buffer size for asynchronous output mode */
|
||||
#ifdef ELOG_ASYNC_OUTPUT_BUF_SIZE
|
||||
#define OUTPUT_BUF_SIZE ELOG_ASYNC_OUTPUT_BUF_SIZE
|
||||
#else
|
||||
#define OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
|
||||
#endif /* ELOG_ASYNC_OUTPUT_BUF_SIZE */
|
||||
|
||||
/* Initialize OK flag */
|
||||
static bool init_ok = false;
|
||||
/* thread running flag */
|
||||
static bool thread_running = false;
|
||||
/* asynchronous output mode enabled flag */
|
||||
static bool is_enabled = false;
|
||||
/* asynchronous output mode's ring buffer */
|
||||
static char log_buf[OUTPUT_BUF_SIZE] = { 0 };
|
||||
/* log ring buffer write index */
|
||||
static size_t write_index = 0;
|
||||
/* log ring buffer read index */
|
||||
static size_t read_index = 0;
|
||||
/* log ring buffer full flag */
|
||||
static bool buf_is_full = false;
|
||||
/* log ring buffer empty flag */
|
||||
static bool buf_is_empty = true;
|
||||
|
||||
extern void elog_port_output(const char *log, size_t size);
|
||||
extern void elog_output_lock(void);
|
||||
extern void elog_output_unlock(void);
|
||||
|
||||
/**
|
||||
* asynchronous output ring buffer used size
|
||||
*
|
||||
* @return used size
|
||||
*/
|
||||
static size_t elog_async_get_buf_used(void) {
|
||||
if (write_index > read_index) {
|
||||
return write_index - read_index;
|
||||
} else {
|
||||
if (!buf_is_full && !buf_is_empty) {
|
||||
return OUTPUT_BUF_SIZE - (read_index - write_index);
|
||||
} else if (buf_is_full) {
|
||||
return OUTPUT_BUF_SIZE;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* asynchronous output ring buffer remain space
|
||||
*
|
||||
* @return remain space
|
||||
*/
|
||||
static size_t async_get_buf_space(void) {
|
||||
return OUTPUT_BUF_SIZE - elog_async_get_buf_used();
|
||||
}
|
||||
|
||||
/**
|
||||
* put log to asynchronous output ring buffer
|
||||
*
|
||||
* @param log put log buffer
|
||||
* @param size log size
|
||||
*
|
||||
* @return put log size, the log which beyond ring buffer space will be dropped
|
||||
*/
|
||||
static size_t async_put_log(const char *log, size_t size) {
|
||||
size_t space = 0;
|
||||
|
||||
space = async_get_buf_space();
|
||||
/* no space */
|
||||
if (!space) {
|
||||
size = 0;
|
||||
goto __exit;
|
||||
}
|
||||
/* drop some log */
|
||||
if (space <= size) {
|
||||
size = space;
|
||||
buf_is_full = true;
|
||||
}
|
||||
|
||||
if (write_index + size < OUTPUT_BUF_SIZE) {
|
||||
memcpy(log_buf + write_index, log, size);
|
||||
write_index += size;
|
||||
} else {
|
||||
memcpy(log_buf + write_index, log, OUTPUT_BUF_SIZE - write_index);
|
||||
memcpy(log_buf, log + OUTPUT_BUF_SIZE - write_index,
|
||||
size - (OUTPUT_BUF_SIZE - write_index));
|
||||
write_index += size - OUTPUT_BUF_SIZE;
|
||||
}
|
||||
|
||||
buf_is_empty = false;
|
||||
|
||||
__exit:
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_LINE_OUTPUT
|
||||
/**
|
||||
* Get line log from asynchronous output ring buffer.
|
||||
* It will copy all log when the newline sign isn't find.
|
||||
*
|
||||
* @param log get line log buffer
|
||||
* @param size line log size
|
||||
*
|
||||
* @return get line log size, the log size is less than ring buffer used size
|
||||
*/
|
||||
size_t elog_async_get_line_log(char *log, size_t size) {
|
||||
size_t used = 0, cpy_log_size = 0;
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
used = elog_async_get_buf_used();
|
||||
|
||||
/* no log */
|
||||
if (!used || !size) {
|
||||
goto __exit;
|
||||
}
|
||||
/* less log */
|
||||
if (used <= size) {
|
||||
size = used;
|
||||
}
|
||||
|
||||
if (read_index + size < OUTPUT_BUF_SIZE) {
|
||||
cpy_log_size = elog_cpyln(log, log_buf + read_index, size);
|
||||
read_index += cpy_log_size;
|
||||
} else {
|
||||
cpy_log_size = elog_cpyln(log, log_buf + read_index, OUTPUT_BUF_SIZE - read_index);
|
||||
if (cpy_log_size == OUTPUT_BUF_SIZE - read_index) {
|
||||
cpy_log_size += elog_cpyln(log + cpy_log_size, log_buf, size - cpy_log_size);
|
||||
read_index += cpy_log_size - OUTPUT_BUF_SIZE;
|
||||
} else {
|
||||
read_index += cpy_log_size;
|
||||
}
|
||||
}
|
||||
|
||||
if (used == cpy_log_size) {
|
||||
buf_is_empty = true;
|
||||
}
|
||||
|
||||
if (cpy_log_size) {
|
||||
buf_is_full = false;
|
||||
}
|
||||
|
||||
__exit:
|
||||
/* lock output */
|
||||
elog_output_unlock();
|
||||
return cpy_log_size;
|
||||
}
|
||||
#else
|
||||
/**
|
||||
* get log from asynchronous output ring buffer
|
||||
*
|
||||
* @param log get log buffer
|
||||
* @param size log size
|
||||
*
|
||||
* @return get log size, the log size is less than ring buffer used size
|
||||
*/
|
||||
size_t elog_async_get_log(char *log, size_t size) {
|
||||
size_t used = 0;
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
used = elog_async_get_buf_used();
|
||||
/* no log */
|
||||
if (!used || !size) {
|
||||
size = 0;
|
||||
goto __exit;
|
||||
}
|
||||
/* less log */
|
||||
if (used <= size) {
|
||||
size = used;
|
||||
buf_is_empty = true;
|
||||
}
|
||||
|
||||
if (read_index + size < OUTPUT_BUF_SIZE) {
|
||||
memcpy(log, log_buf + read_index, size);
|
||||
read_index += size;
|
||||
} else {
|
||||
memcpy(log, log_buf + read_index, OUTPUT_BUF_SIZE - read_index);
|
||||
memcpy(log + OUTPUT_BUF_SIZE - read_index, log_buf,
|
||||
size - (OUTPUT_BUF_SIZE - read_index));
|
||||
read_index += size - OUTPUT_BUF_SIZE;
|
||||
}
|
||||
|
||||
buf_is_full = false;
|
||||
|
||||
__exit:
|
||||
/* lock output */
|
||||
elog_output_unlock();
|
||||
return size;
|
||||
}
|
||||
#endif /* ELOG_ASYNC_LINE_OUTPUT */
|
||||
|
||||
void elog_async_output(uint8_t level, const char *log, size_t size) {
|
||||
/* this function must be implement by user when ELOG_ASYNC_OUTPUT_USING_PTHREAD is not defined */
|
||||
extern void elog_async_output_notice(void);
|
||||
size_t put_size;
|
||||
|
||||
if (is_enabled) {
|
||||
if (level >= OUTPUT_LVL) {
|
||||
put_size = async_put_log(log, size);
|
||||
/* notify output log thread */
|
||||
if (put_size > 0) {
|
||||
elog_async_output_notice();
|
||||
}
|
||||
} else {
|
||||
elog_port_output(log, size);
|
||||
}
|
||||
} else {
|
||||
elog_port_output(log, size);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD
|
||||
void elog_async_output_notice(void) {
|
||||
sem_post(&output_notice);
|
||||
}
|
||||
|
||||
static void *async_output(void *arg) {
|
||||
size_t get_log_size = 0;
|
||||
static char poll_get_buf[ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE];
|
||||
|
||||
while(thread_running) {
|
||||
/* waiting log */
|
||||
sem_wait(&output_notice);
|
||||
/* polling gets and outputs the log */
|
||||
while(true) {
|
||||
|
||||
#ifdef ELOG_ASYNC_LINE_OUTPUT
|
||||
get_log_size = elog_async_get_line_log(poll_get_buf, ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE);
|
||||
#else
|
||||
get_log_size = elog_async_get_log(poll_get_buf, ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE);
|
||||
#endif
|
||||
|
||||
if (get_log_size) {
|
||||
elog_port_output(poll_get_buf, get_log_size);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* enable or disable asynchronous output mode
|
||||
* the log will be output directly when mode is disabled
|
||||
*
|
||||
* @param enabled true: enabled, false: disabled
|
||||
*/
|
||||
void elog_async_enabled(bool enabled) {
|
||||
is_enabled = enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* asynchronous output mode initialize
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
ElogErrCode elog_async_init(void) {
|
||||
ElogErrCode result = ELOG_NO_ERR;
|
||||
|
||||
if (init_ok) {
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD
|
||||
pthread_attr_t thread_attr;
|
||||
struct sched_param thread_sched_param;
|
||||
|
||||
sem_init(&output_notice, 0, 0);
|
||||
|
||||
thread_running = true;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
//pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
|
||||
pthread_attr_setstacksize(&thread_attr, ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE);
|
||||
pthread_attr_setschedpolicy(&thread_attr, SCHED_RR);
|
||||
thread_sched_param.sched_priority = ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY;
|
||||
pthread_attr_setschedparam(&thread_attr, &thread_sched_param);
|
||||
pthread_create(&async_output_thread, &thread_attr, async_output, NULL);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
#endif
|
||||
|
||||
init_ok = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* asynchronous output mode deinitialize
|
||||
*
|
||||
*/
|
||||
void elog_async_deinit(void) {
|
||||
if (!init_ok) {
|
||||
return ;
|
||||
}
|
||||
|
||||
#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD
|
||||
thread_running = false;
|
||||
|
||||
elog_async_output_notice();
|
||||
|
||||
pthread_join(async_output_thread, NULL);
|
||||
|
||||
sem_destroy(&output_notice);
|
||||
#endif
|
||||
|
||||
init_ok = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* ELOG_ASYNC_OUTPUT_ENABLE */
|
||||
@ -1,106 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2016, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Logs buffered output.
|
||||
* Created on: 2016-11-09
|
||||
*/
|
||||
|
||||
#include <elog.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef ELOG_BUF_OUTPUT_ENABLE
|
||||
#if !defined(ELOG_BUF_OUTPUT_BUF_SIZE)
|
||||
#error "Please configure buffer size for buffered output mode (in elog_cfg.h)"
|
||||
#endif
|
||||
|
||||
/* buffered output mode's buffer */
|
||||
static char log_buf[ELOG_BUF_OUTPUT_BUF_SIZE] = { 0 };
|
||||
/* log buffer current write size */
|
||||
static size_t buf_write_size = 0;
|
||||
/* buffered output mode enabled flag */
|
||||
static bool is_enabled = false;
|
||||
|
||||
extern void elog_port_output(const char *log, size_t size);
|
||||
extern void elog_output_lock(void);
|
||||
extern void elog_output_unlock(void);
|
||||
|
||||
/**
|
||||
* output buffered logs when buffer is full
|
||||
*
|
||||
* @param log will be buffered line's log
|
||||
* @param size log size
|
||||
*/
|
||||
void elog_buf_output(const char *log, size_t size) {
|
||||
size_t write_size = 0, write_index = 0;
|
||||
|
||||
if (!is_enabled) {
|
||||
elog_port_output(log, size);
|
||||
return;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
if (buf_write_size + size > ELOG_BUF_OUTPUT_BUF_SIZE) {
|
||||
write_size = ELOG_BUF_OUTPUT_BUF_SIZE - buf_write_size;
|
||||
memcpy(log_buf + buf_write_size, log + write_index, write_size);
|
||||
write_index += write_size;
|
||||
size -= write_size;
|
||||
buf_write_size += write_size;
|
||||
/* output log */
|
||||
elog_port_output(log_buf, buf_write_size);
|
||||
/* reset write index */
|
||||
buf_write_size = 0;
|
||||
} else {
|
||||
memcpy(log_buf + buf_write_size, log + write_index, size);
|
||||
buf_write_size += size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* flush all buffered logs to output device
|
||||
*/
|
||||
void elog_flush(void) {
|
||||
if (buf_write_size == 0)
|
||||
return;
|
||||
/* lock output */
|
||||
elog_output_lock();
|
||||
/* output log */
|
||||
elog_port_output(log_buf, buf_write_size);
|
||||
/* reset write index */
|
||||
buf_write_size = 0;
|
||||
/* unlock output */
|
||||
elog_output_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* enable or disable buffered output mode
|
||||
* the log will be output directly when mode is disabled
|
||||
*
|
||||
* @param enabled true: enabled, false: disabled
|
||||
*/
|
||||
void elog_buf_enabled(bool enabled) {
|
||||
is_enabled = enabled;
|
||||
}
|
||||
#endif /* ELOG_BUF_OUTPUT_ENABLE */
|
||||
@ -1,103 +0,0 @@
|
||||
/*
|
||||
* This file is part of the EasyLogger Library.
|
||||
*
|
||||
* Copyright (c) 2015-2018, Armink, <armink.ztl@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Function: Some utils for this library.
|
||||
* Created on: 2015-04-28
|
||||
*/
|
||||
|
||||
#include <elog.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* another copy string function
|
||||
*
|
||||
* @param cur_len current copied log length, max size is ELOG_LINE_BUF_SIZE
|
||||
* @param dst destination
|
||||
* @param src source
|
||||
*
|
||||
* @return copied length
|
||||
*/
|
||||
size_t elog_strcpy(size_t cur_len, char *dst, const char *src) {
|
||||
const char *src_old = src;
|
||||
|
||||
assert(dst);
|
||||
assert(src);
|
||||
|
||||
while (*src != 0) {
|
||||
/* make sure destination has enough space */
|
||||
if (cur_len++ < ELOG_LINE_BUF_SIZE) {
|
||||
*dst++ = *src++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return src - src_old;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy line log split by newline sign. It will copy all log when the newline sign isn't find.
|
||||
*
|
||||
* @param line line log buffer
|
||||
* @param log origin log buffer
|
||||
* @param len origin log buffer length
|
||||
*
|
||||
* @return copy size
|
||||
*/
|
||||
size_t elog_cpyln(char *line, const char *log, size_t len) {
|
||||
size_t newline_len = strlen(ELOG_NEWLINE_SIGN), copy_size = 0;
|
||||
|
||||
assert(line);
|
||||
assert(log);
|
||||
|
||||
while (len--) {
|
||||
*line++ = *log++;
|
||||
copy_size++;
|
||||
if (copy_size >= newline_len && !strncmp(log - newline_len, ELOG_NEWLINE_SIGN, newline_len)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return copy_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will copy memory content from source address to destination
|
||||
* address.
|
||||
*
|
||||
* @param dst the address of destination memory
|
||||
* @param src the address of source memory
|
||||
* @param count the copied length
|
||||
*
|
||||
* @return the address of destination memory
|
||||
*/
|
||||
void *elog_memcpy(void *dst, const void *src, size_t count) {
|
||||
char *tmp = (char *) dst, *s = (char *) src;
|
||||
|
||||
assert(dst);
|
||||
assert(src);
|
||||
|
||||
while (count--)
|
||||
*tmp++ = *s++;
|
||||
|
||||
return dst;
|
||||
}
|
||||
Loading…
Reference in New Issue