acl/lib_acl_cpp/include/acl_cpp/stdlib/log.hpp

208 lines
7.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "../acl_cpp_define.hpp"
#include <stdarg.h>
#ifndef ACL_LOGGER_MACRO_OFF
# define logger_open acl::log::open
# define logger_close acl::log::close
# if defined(_WIN32) || defined(_WIN64)
# if _MSC_VER >= 1500
# define logger(fmt, ...) \
acl::log::msg4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
# define logger_warn(fmt, ...) \
acl::log::warn4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
# define logger_error(fmt, ...) \
acl::log::error4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
# define logger_fatal(fmt, ...) \
acl::log::fatal4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
# define logger_debug(section, level, fmt, ...) \
acl::log::msg6(section, level, __FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
# else
# define logger acl::log::msg1
# define logger_warn acl::log::warn1
# define logger_error acl::log::error1
# define logger_fatal acl::log::fatal1
# define logger_debug acl::log::msg3
# endif
# else
# ifdef ACL_CPP_LOG_SKIP_FILE
# define logger(fmt, args...) \
acl::log::msg4("none", __LINE__, __FUNCTION__, fmt, ##args)
# define logger_warn(fmt, args...) \
acl::log::warn4("none", __LINE__, __FUNCTION__, fmt, ##args)
# define logger_error(fmt, args...) \
acl::log::error4("none", __LINE__, __FUNCTION__, fmt, ##args)
# define logger_fatal(fmt, args...) \
acl::log::fatal4("none", __LINE__, __FUNCTION__, fmt, ##args)
# define logger_debug(section, level, fmt, args...) \
acl::log::msg6(section, level, __FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# else
# define logger(fmt, args...) \
acl::log::msg4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# define logger_warn(fmt, args...) \
acl::log::warn4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# define logger_error(fmt, args...) \
acl::log::error4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# define logger_fatal(fmt, args...) \
acl::log::fatal4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# define logger_debug(section, level, fmt, args...) \
acl::log::msg6(section, level, __FILE__, __LINE__, __FUNCTION__, fmt, ##args)
# endif
# endif
#endif // ACL_LOG_MACRO_OFF
namespace acl {
class string;
class ACL_CPP_API log
{
public:
/**
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD>, <20>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
* @param recipients {const char*} <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD> "|" <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>׽ӿڣ<D3BF><DAA3><EFBFBD>:
* /tmp/test.log|UDP:127.0.0.1:12345|TCP:127.0.0.1:12345|UNIX:/tmp/test.sock
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD> /tmp/test.log, UDP:127.0.0.1:12345,
* TCP:127.0.0.1:12345 <20><> UNIX:/tmp/test.sock <20>ĸ<EFBFBD><C4B8><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param procname <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>: test
* @param cfg <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>, <20><>ʽΪ: {section}:{level}; {section}:{level}; ...
* <20><>: 100:2; 101:3; 102: 4, <20><>ʾֻ<CABE><D6BB>¼<EFBFBD><C2BC>ʶΪ 100/<2F><><EFBFBD><EFBFBD> < 2,
* <20>Լ<EFBFBD><D4BC><EFBFBD>ʶΪ 101/<2F><><EFBFBD><EFBFBD> < 3, <20>Լ<EFBFBD><D4BC><EFBFBD>ʶΪ 102/<2F><><EFBFBD><EFBFBD> < 4 <20><><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
*/
static void open(const char* recipients, const char* procname = "unknown",
const char* cfg = NULL);
/**
* <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>־
*/
static void close(void);
/**
* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD>Ե<EFBFBD><D4B5>ýӿ<C3BD>
* @param cfg {const char*} <20><><EFBFBD>Ա<EFBFBD>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>, <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>:
* {section}:{level}; {section}:{level}; ...
* <20><>: 1:1, 2:10, 3:8... or 1:1; 2:10; 3:8... or all:1
*/
static void debug_init(const char* cfg);
/**
* <20><>δͨ<CEB4><CDA8> open <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>ʱ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϣ
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
* @param onoff {bool}
*/
static void stdout_open(bool onoff);
/**
* <20><>־<EFBFBD><D6BE>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
*/
static void ACL_CPP_PRINTF(1, 2) msg1(const char* fmt, ...);
static void ACL_CPP_PRINTF(4, 5) msg4(const char* fname,
int line, const char* func, const char* fmt, ...);
static void ACL_CPP_PRINTF(3, 4) msg3(size_t section,
size_t level, const char* fmt, ...);
static void ACL_CPP_PRINTF(6, 7) msg6(size_t section, size_t level,
const char* fname, int line, const char* func, const char* fmt, ...);
static void ACL_CPP_PRINTF(1, 2) warn1(const char* fmt, ...);
static void ACL_CPP_PRINTF(4, 5) warn4(const char* fname, int line,
const char* func, const char* fmt, ...);
static void ACL_CPP_PRINTF(1, 2) error1(const char* fmt, ...);
static void ACL_CPP_PRINTF(4, 5) error4(const char* fname, int line,
const char* func, const char* fmt, ...);
static void ACL_CPP_PRINTF(1, 2) fatal1(const char* fmt, ...);
static void ACL_CPP_PRINTF(4, 5) fatal4(const char* fname, int line,
const char* func, const char* fmt, ...);
static void vmsg2(const char* fmt, va_list ap);
static void vmsg5(const char* fname, int line, const char* func,
const char* fmt, va_list ap);
static void vmsg4(size_t section, size_t level, const char* fmt, va_list ap);
static void vmsg7(size_t section, size_t level, const char* fname,
int line, const char* func, const char* fmt, va_list ap);
static void vwarn2(const char* fmt, va_list ap);
static void vwarn5(const char* fname, int line, const char* func,
const char* fmt, va_list ap);
static void verror2(const char* fmt, va_list ap);
static void verror5(const char* fname, int line, const char* func,
const char* fmt, va_list ap);
static void vfatal2(const char* fmt, va_list ap);
static void vfatal5(const char* fname, int line, const char* func,
const char* fmt, va_list ap);
/************************************************************************/
/* ʾ<><CABE> */
/************************************************************************/
static void logger_test1(void)
{
#define DEBUG_BASE 100
#define DEBUG_TEST1 (DEBUG_BASE + 1)
#define DEBUG_TEST2 (DEBUG_BASE + 2)
#define DEBUG_TEST3 (DEBUG_BASE + 3)
const char* logfile = "test.log", *procname = "test";
const char* cfg = "101:2; 102:3; 103:2";
// <20>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
logger_open(logfile, procname, cfg);
#if defined(VC2003) || defined(VC2002) || defined(VC6)
// <20><>д<EFBFBD><D0B4>־
logger("%s(%d), %s: %s", __FILE__, __LINE__, __FUNCTION__, "zsx");
logger_debug(DEBUG_TEST1, 1, "%s(%d), %s: hello world11(%s)!",
__FILE__, __LINE__, __FUNCTION__, "zsx");
logger_debug(DEBUG_TEST2, 3, "%s(%d), %s: hello world12(%s)!",
__FILE__, __LINE__, __FUNCTION__, "zsx");
logger_debug(DEBUG_TEST3, 2, "%s(%d), %s: hello world13(%s)!",
__FILE__, __LINE__, __FUNCTION__, "zsx");
// <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>־
logger_debug(DEBUG_TEST1, 3, "%s(%d), %s: hello world21(%s)!",
__FILE__, __LINE__, __FUNCTION__, "zsx");
#else // VC2005, VC2008, VC2010
// <20><>д<EFBFBD><D0B4>־
logger("error(%s)!", "zsx");
logger_debug(DEBUG_TEST1, 1, "hello world11(%s)!", "zsx");
logger_debug(DEBUG_TEST2, 3, "hello world12(%s)!", "zsx");
logger_debug(DEBUG_TEST3, 2, "hello world13(%s)!", "zsx");
// <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>־
logger_debug(DEBUG_TEST1, 3, "hello world21(%s)!", "zsx");
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ر<EFBFBD><D8B1><EFBFBD>־
logger_close();
}
static void logger_test2(void)
{
logger("logger ok!");
logger_warn("logger_warn ok!");
logger_error("logger_error ok!");
logger_fatal("logger_fatal ok!");
}
};
} // namespace acl