mirror of
https://github.com/gabime/spdlog.git
synced 2024-11-15 16:35:45 +08:00
Allow filename/line number at all levels. Add function name %! support.
This commit is contained in:
parent
5b273a33b4
commit
2124b7bf64
@ -52,8 +52,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Get the basename of __FILE__ (at compile time if possible)
|
// Get the basename of __FILE__ (at compile time if possible)
|
||||||
#if FMT_HAS_FEATURE(__builtin_strrchr)
|
#if FMT_HAS_FEATURE(__builtin_strrchr)
|
||||||
#define SPDLOG_STRRCHR(str, sep) __builtin_strrchr(str, sep)
|
#define SPDLOG_STRRCHR(str, sep) __builtin_strrchr(str, sep)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_STRRCHR(str, sep) strrchr(str, sep)
|
#define SPDLOG_STRRCHR(str, sep) strrchr(str, sep)
|
||||||
@ -204,11 +204,13 @@ struct source_loc
|
|||||||
SPDLOG_CONSTEXPR source_loc()
|
SPDLOG_CONSTEXPR source_loc()
|
||||||
: filename{""}
|
: filename{""}
|
||||||
, line{0}
|
, line{0}
|
||||||
|
, funcname{""}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
SPDLOG_CONSTEXPR source_loc(const char *filename, int line)
|
SPDLOG_CONSTEXPR source_loc(const char *filename, int line, const char *funcname)
|
||||||
: filename{filename}
|
: filename{filename}
|
||||||
, line{static_cast<uint32_t>(line)}
|
, line{static_cast<uint32_t>(line)}
|
||||||
|
, funcname{funcname}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,6 +220,7 @@ struct source_loc
|
|||||||
}
|
}
|
||||||
const char *filename;
|
const char *filename;
|
||||||
uint32_t line;
|
uint32_t line;
|
||||||
|
const char *funcname;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace details {
|
namespace details {
|
||||||
|
@ -895,6 +895,26 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// print source funcname
|
||||||
|
class source_funcname_formatter final : public flag_formatter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit source_funcname_formatter(padding_info padinfo)
|
||||||
|
: flag_formatter(padinfo){};
|
||||||
|
|
||||||
|
void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override
|
||||||
|
{
|
||||||
|
if (msg.source.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scoped_pad p(msg.source.funcname, padinfo_, dest);
|
||||||
|
fmt_helper::append_string_view(msg.source.funcname, dest);
|
||||||
|
#ifdef SPDLOG_FUNCTION_SUFFIX
|
||||||
|
fmt_helper::append_string_view(SPDLOG_FUNCTION_SUFFIX, dest);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Full info formatter
|
// Full info formatter
|
||||||
// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] %v
|
// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] %v
|
||||||
@ -1216,6 +1236,10 @@ private:
|
|||||||
formatters_.push_back(details::make_unique<details::source_linenum_formatter>(padding));
|
formatters_.push_back(details::make_unique<details::source_linenum_formatter>(padding));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ('!'): // source funcname
|
||||||
|
formatters_.push_back(details::make_unique<details::source_funcname_formatter>(padding));
|
||||||
|
break;
|
||||||
|
|
||||||
case ('%'): // % char
|
case ('%'): // % char
|
||||||
formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
|
formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
|
||||||
break;
|
break;
|
||||||
|
@ -313,10 +313,20 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
// SPDLOG_LEVEL_OFF
|
// SPDLOG_LEVEL_OFF
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#ifndef SPDLOG_FUNCTION
|
||||||
|
#define SPDLOG_FUNCTION __FUNCTION__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SPDLOG_SOURCE_MACROS_ON
|
||||||
|
#define SPDLOG_LOG_MACRO(...) log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, __VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define SPDLOG_LOG_MACRO(...) log(__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_TRACE
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_TRACE
|
||||||
#define SPDLOG_LOGGER_TRACE(logger, ...)\
|
#define SPDLOG_LOGGER_TRACE(logger, ...)\
|
||||||
if(logger->should_log(spdlog::level::trace))\
|
if(logger->should_log(spdlog::level::trace))\
|
||||||
logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__}, spdlog::level::trace, __VA_ARGS__)
|
logger->SPDLOG_LOG_MACRO(spdlog::level::trace, __VA_ARGS__)
|
||||||
#define SPDLOG_TRACE(...) SPDLOG_LOGGER_TRACE(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_TRACE(...) SPDLOG_LOGGER_TRACE(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_TRACE(logger, ...) (void)0
|
#define SPDLOG_LOGGER_TRACE(logger, ...) (void)0
|
||||||
@ -324,7 +334,7 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_DEBUG
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_DEBUG
|
||||||
#define SPDLOG_LOGGER_DEBUG(logger, ...) logger->log(spdlog::level::debug, __VA_ARGS__)
|
#define SPDLOG_LOGGER_DEBUG(logger, ...) logger->SPDLOG_LOG_MACRO(spdlog::level::debug, __VA_ARGS__)
|
||||||
#define SPDLOG_DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_DEBUG(logger, ...) (void)0
|
#define SPDLOG_LOGGER_DEBUG(logger, ...) (void)0
|
||||||
@ -332,7 +342,7 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_INFO
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_INFO
|
||||||
#define SPDLOG_LOGGER_INFO(logger, ...) logger->log(spdlog::level::info, __VA_ARGS__)
|
#define SPDLOG_LOGGER_INFO(logger, ...) logger->SPDLOG_LOG_MACRO(spdlog::level::info, __VA_ARGS__)
|
||||||
#define SPDLOG_INFO(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_INFO(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_INFO(logger, ...) (void)0
|
#define SPDLOG_LOGGER_INFO(logger, ...) (void)0
|
||||||
@ -340,7 +350,7 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_WARN
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_WARN
|
||||||
#define SPDLOG_LOGGER_WARN(logger, ...) logger->log(spdlog::level::warn, __VA_ARGS__)
|
#define SPDLOG_LOGGER_WARN(logger, ...) logger->SPDLOG_LOG_MACRO(spdlog::level::warn, __VA_ARGS__)
|
||||||
#define SPDLOG_WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_WARN(logger, ...) (void)0
|
#define SPDLOG_LOGGER_WARN(logger, ...) (void)0
|
||||||
@ -348,7 +358,7 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_ERROR
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_ERROR
|
||||||
#define SPDLOG_LOGGER_ERROR(logger, ...) logger->log(spdlog::level::err, __VA_ARGS__)
|
#define SPDLOG_LOGGER_ERROR(logger, ...) logger->SPDLOG_LOG_MACRO(spdlog::level::err, __VA_ARGS__)
|
||||||
#define SPDLOG_ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_ERROR(logger, ...) (void)0
|
#define SPDLOG_LOGGER_ERROR(logger, ...) (void)0
|
||||||
@ -356,7 +366,7 @@ inline void critical(const wchar_t *fmt, const Args &... args)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_CRITICAL
|
#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_CRITICAL
|
||||||
#define SPDLOG_LOGGER_CRITICAL(logger, ...) logger->log(spdlog::level::critical, __VA_ARGS__)
|
#define SPDLOG_LOGGER_CRITICAL(logger, ...) logger->SPDLOG_LOG_MACRO(spdlog::level::critical, __VA_ARGS__)
|
||||||
#define SPDLOG_CRITICAL(...) SPDLOG_LOGGER_CRITICAL(spdlog::default_logger_raw(), __VA_ARGS__)
|
#define SPDLOG_CRITICAL(...) SPDLOG_LOGGER_CRITICAL(spdlog::default_logger_raw(), __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define SPDLOG_LOGGER_CRITICAL(logger, ...) (void)0
|
#define SPDLOG_LOGGER_CRITICAL(logger, ...) (void)0
|
||||||
|
@ -133,4 +133,27 @@
|
|||||||
// Macros like SPDLOG_DEBUG(..), SPDLOG_INFO(..) will expand to empty statements if not enabled
|
// Macros like SPDLOG_DEBUG(..), SPDLOG_INFO(..) will expand to empty statements if not enabled
|
||||||
//
|
//
|
||||||
// #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
|
// #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Uncomment to enable file name, file number and function name macros.
|
||||||
|
// Used in macros like SPDLOG_DEBUG(..), SPDLOG_INFO(..) etc
|
||||||
|
//
|
||||||
|
// #define SPDLOG_SOURCE_MACROS_ON
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Uncomment (and change if desired) macro to use for function names.
|
||||||
|
// This is compiler dependent.
|
||||||
|
// __PRETTY_FUNCTION__ might be nicer in clang/gcc, and __FUNCTION__ in msvc.
|
||||||
|
// Defaults to __FUNCTION__ (should work on all compilers) if not defined.
|
||||||
|
//
|
||||||
|
// #define SPDLOG_FUNCTION __PRETTY_FUNCTION__
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Uncomment (and change if desired) string to add to the end of functions names.
|
||||||
|
// Used in macros like SPDLOG_DEBUG(..), SPDLOG_INFO(..) etc
|
||||||
|
//
|
||||||
|
// #define SPDLOG_FUNCTION_SUFFIX "()"
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
Loading…
Reference in New Issue
Block a user