Commit 980baaf5 authored by Harsh Poddar's avatar Harsh Poddar Committed by Facebook Github Bot

Add function name property to LogMessage

Summary: This update adds the name of the function which called the LOG() to the `LogMessage` object so that a custom formatter could use it to show method name with logs.

Reviewed By: simpkins

Differential Revision: D9071926

fbshipit-source-id: 9d5359d84cf2544371c6f1826f99d8b47a272dd1
parent daf5e5df
...@@ -26,6 +26,7 @@ LogMessage::LogMessage( ...@@ -26,6 +26,7 @@ LogMessage::LogMessage(
LogLevel level, LogLevel level,
StringPiece filename, StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
StringPiece functionName,
std::string&& msg) std::string&& msg)
: category_{category}, : category_{category},
level_{level}, level_{level},
...@@ -33,6 +34,7 @@ LogMessage::LogMessage( ...@@ -33,6 +34,7 @@ LogMessage::LogMessage(
timestamp_{system_clock::now()}, timestamp_{system_clock::now()},
filename_{filename}, filename_{filename},
lineNumber_{lineNumber}, lineNumber_{lineNumber},
functionName_{functionName},
rawMessage_{std::move(msg)} { rawMessage_{std::move(msg)} {
sanitizeMessage(); sanitizeMessage();
} }
...@@ -43,6 +45,7 @@ LogMessage::LogMessage( ...@@ -43,6 +45,7 @@ LogMessage::LogMessage(
system_clock::time_point timestamp, system_clock::time_point timestamp,
StringPiece filename, StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
StringPiece functionName,
std::string&& msg) std::string&& msg)
: category_{category}, : category_{category},
level_{level}, level_{level},
...@@ -50,6 +53,7 @@ LogMessage::LogMessage( ...@@ -50,6 +53,7 @@ LogMessage::LogMessage(
timestamp_{timestamp}, timestamp_{timestamp},
filename_{filename}, filename_{filename},
lineNumber_{lineNumber}, lineNumber_{lineNumber},
functionName_{functionName},
rawMessage_{std::move(msg)} { rawMessage_{std::move(msg)} {
sanitizeMessage(); sanitizeMessage();
} }
......
...@@ -42,14 +42,22 @@ class LogMessage { ...@@ -42,14 +42,22 @@ class LogMessage {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
std::string&& msg); std::string&& msg);
LogMessage( LogMessage(
const LogCategory* category, const LogCategory* category,
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
folly::StringPiece msg) folly::StringPiece msg)
: LogMessage(category, level, filename, lineNumber, msg.str()) {} : LogMessage(
category,
level,
filename,
lineNumber,
functionName,
msg.str()) {}
/** /**
* Construct a LogMessage with an explicit timestamp. * Construct a LogMessage with an explicit timestamp.
...@@ -62,6 +70,7 @@ class LogMessage { ...@@ -62,6 +70,7 @@ class LogMessage {
std::chrono::system_clock::time_point timestamp, std::chrono::system_clock::time_point timestamp,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
std::string&& msg); std::string&& msg);
const LogCategory* getCategory() const { const LogCategory* getCategory() const {
...@@ -81,6 +90,10 @@ class LogMessage { ...@@ -81,6 +90,10 @@ class LogMessage {
return lineNumber_; return lineNumber_;
} }
folly::StringPiece getFunctionName() const {
return functionName_;
}
std::chrono::system_clock::time_point getTimestamp() const { std::chrono::system_clock::time_point getTimestamp() const {
return timestamp_; return timestamp_;
} }
...@@ -123,6 +136,11 @@ class LogMessage { ...@@ -123,6 +136,11 @@ class LogMessage {
*/ */
unsigned int const lineNumber_{0}; unsigned int const lineNumber_{0};
/**
* The name of the function that generated this log message.
*/
folly::StringPiece const functionName_;
/** /**
* containsNewlines_ will be true if the message contains internal newlines. * containsNewlines_ will be true if the message contains internal newlines.
* *
......
...@@ -25,12 +25,14 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -25,12 +25,14 @@ LogStreamProcessor::LogStreamProcessor(
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept AppendType) noexcept
: LogStreamProcessor( : LogStreamProcessor(
category, category,
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
std::string()) {} std::string()) {}
...@@ -41,6 +43,7 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -41,6 +43,7 @@ LogStreamProcessor::LogStreamProcessor(
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept AppendType) noexcept
: LogStreamProcessor( : LogStreamProcessor(
categoryInfo, categoryInfo,
...@@ -49,6 +52,7 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -49,6 +52,7 @@ LogStreamProcessor::LogStreamProcessor(
isCategoryNameOverridden, isCategoryNameOverridden,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
std::string()) {} std::string()) {}
...@@ -57,12 +61,14 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -57,12 +61,14 @@ LogStreamProcessor::LogStreamProcessor(
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept std::string&& msg) noexcept
: category_{category}, : category_{category},
level_{level}, level_{level},
filename_{filename}, filename_{filename},
lineNumber_{lineNumber}, lineNumber_{lineNumber},
functionName_{functionName},
message_{std::move(msg)}, message_{std::move(msg)},
stream_{this} {} stream_{this} {}
...@@ -92,6 +98,7 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -92,6 +98,7 @@ LogStreamProcessor::LogStreamProcessor(
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept std::string&& msg) noexcept
: category_{getXlogCategory( : category_{getXlogCategory(
...@@ -101,6 +108,7 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -101,6 +108,7 @@ LogStreamProcessor::LogStreamProcessor(
level_{level}, level_{level},
filename_{filename}, filename_{filename},
lineNumber_{lineNumber}, lineNumber_{lineNumber},
functionName_{functionName},
message_{std::move(msg)}, message_{std::move(msg)},
stream_{this} {} stream_{this} {}
...@@ -132,12 +140,14 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -132,12 +140,14 @@ LogStreamProcessor::LogStreamProcessor(
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept std::string&& msg) noexcept
: category_{getXlogCategory(fileScopeInfo)}, : category_{getXlogCategory(fileScopeInfo)},
level_{level}, level_{level},
filename_{filename}, filename_{filename},
lineNumber_{lineNumber}, lineNumber_{lineNumber},
functionName_{functionName},
message_{std::move(msg)}, message_{std::move(msg)},
stream_{this} {} stream_{this} {}
...@@ -146,12 +156,14 @@ LogStreamProcessor::LogStreamProcessor( ...@@ -146,12 +156,14 @@ LogStreamProcessor::LogStreamProcessor(
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept AppendType) noexcept
: LogStreamProcessor( : LogStreamProcessor(
fileScopeInfo, fileScopeInfo,
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
std::string()) {} std::string()) {}
#endif #endif
...@@ -182,6 +194,7 @@ void LogStreamProcessor::logNow() noexcept { ...@@ -182,6 +194,7 @@ void LogStreamProcessor::logNow() noexcept {
level_, level_,
filename_, filename_,
lineNumber_, lineNumber_,
functionName_,
extractMessageString(stream_)}); extractMessageString(stream_)});
} }
......
...@@ -105,6 +105,7 @@ class LogStreamProcessor { ...@@ -105,6 +105,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept; AppendType) noexcept;
/** /**
...@@ -122,6 +123,7 @@ class LogStreamProcessor { ...@@ -122,6 +123,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType, AppendType,
Args&&... args) noexcept Args&&... args) noexcept
: LogStreamProcessor( : LogStreamProcessor(
...@@ -129,6 +131,7 @@ class LogStreamProcessor { ...@@ -129,6 +131,7 @@ class LogStreamProcessor {
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
createLogString(std::forward<Args>(args)...)) {} createLogString(std::forward<Args>(args)...)) {}
...@@ -147,6 +150,7 @@ class LogStreamProcessor { ...@@ -147,6 +150,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
FormatType, FormatType,
folly::StringPiece fmt, folly::StringPiece fmt,
Args&&... args) noexcept Args&&... args) noexcept
...@@ -155,6 +159,7 @@ class LogStreamProcessor { ...@@ -155,6 +159,7 @@ class LogStreamProcessor {
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {} formatLogString(fmt, std::forward<Args>(args)...)) {}
...@@ -174,6 +179,7 @@ class LogStreamProcessor { ...@@ -174,6 +179,7 @@ class LogStreamProcessor {
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept; AppendType) noexcept;
template <typename... Args> template <typename... Args>
LogStreamProcessor( LogStreamProcessor(
...@@ -183,6 +189,7 @@ class LogStreamProcessor { ...@@ -183,6 +189,7 @@ class LogStreamProcessor {
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType, AppendType,
Args&&... args) noexcept Args&&... args) noexcept
: LogStreamProcessor( : LogStreamProcessor(
...@@ -192,6 +199,7 @@ class LogStreamProcessor { ...@@ -192,6 +199,7 @@ class LogStreamProcessor {
isCategoryNameOverridden, isCategoryNameOverridden,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
createLogString(std::forward<Args>(args)...)) {} createLogString(std::forward<Args>(args)...)) {}
template <typename... Args> template <typename... Args>
...@@ -202,6 +210,7 @@ class LogStreamProcessor { ...@@ -202,6 +210,7 @@ class LogStreamProcessor {
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
FormatType, FormatType,
folly::StringPiece fmt, folly::StringPiece fmt,
Args&&... args) noexcept Args&&... args) noexcept
...@@ -212,6 +221,7 @@ class LogStreamProcessor { ...@@ -212,6 +221,7 @@ class LogStreamProcessor {
isCategoryNameOverridden, isCategoryNameOverridden,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {} formatLogString(fmt, std::forward<Args>(args)...)) {}
...@@ -231,6 +241,7 @@ class LogStreamProcessor { ...@@ -231,6 +241,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept; AppendType) noexcept;
LogStreamProcessor( LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo, XlogFileScopeInfo* fileScopeInfo,
...@@ -239,9 +250,15 @@ class LogStreamProcessor { ...@@ -239,9 +250,15 @@ class LogStreamProcessor {
bool /* isCategoryNameOverridden */, bool /* isCategoryNameOverridden */,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType) noexcept AppendType) noexcept
: LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) { : LogStreamProcessor(
} fileScopeInfo,
level,
filename,
lineNumber,
functionName,
APPEND) {}
template <typename... Args> template <typename... Args>
LogStreamProcessor( LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo, XlogFileScopeInfo* fileScopeInfo,
...@@ -250,6 +267,7 @@ class LogStreamProcessor { ...@@ -250,6 +267,7 @@ class LogStreamProcessor {
bool /* isCategoryNameOverridden */, bool /* isCategoryNameOverridden */,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
AppendType, AppendType,
Args&&... args) noexcept Args&&... args) noexcept
: LogStreamProcessor( : LogStreamProcessor(
...@@ -257,6 +275,7 @@ class LogStreamProcessor { ...@@ -257,6 +275,7 @@ class LogStreamProcessor {
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
createLogString(std::forward<Args>(args)...)) {} createLogString(std::forward<Args>(args)...)) {}
template <typename... Args> template <typename... Args>
...@@ -267,6 +286,7 @@ class LogStreamProcessor { ...@@ -267,6 +286,7 @@ class LogStreamProcessor {
bool /* isCategoryNameOverridden */, bool /* isCategoryNameOverridden */,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
FormatType, FormatType,
folly::StringPiece fmt, folly::StringPiece fmt,
Args&&... args) noexcept Args&&... args) noexcept
...@@ -275,6 +295,7 @@ class LogStreamProcessor { ...@@ -275,6 +295,7 @@ class LogStreamProcessor {
level, level,
filename, filename,
lineNumber, lineNumber,
functionName,
INTERNAL, INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {} formatLogString(fmt, std::forward<Args>(args)...)) {}
#endif #endif
...@@ -308,6 +329,7 @@ class LogStreamProcessor { ...@@ -308,6 +329,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept; std::string&& msg) noexcept;
LogStreamProcessor( LogStreamProcessor(
...@@ -317,6 +339,7 @@ class LogStreamProcessor { ...@@ -317,6 +339,7 @@ class LogStreamProcessor {
bool isCategoryNameOverridden, bool isCategoryNameOverridden,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept; std::string&& msg) noexcept;
LogStreamProcessor( LogStreamProcessor(
...@@ -324,6 +347,7 @@ class LogStreamProcessor { ...@@ -324,6 +347,7 @@ class LogStreamProcessor {
LogLevel level, LogLevel level,
folly::StringPiece filename, folly::StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
folly::StringPiece functionName,
InternalType, InternalType,
std::string&& msg) noexcept; std::string&& msg) noexcept;
...@@ -411,6 +435,7 @@ class LogStreamProcessor { ...@@ -411,6 +435,7 @@ class LogStreamProcessor {
LogLevel const level_; LogLevel const level_;
folly::StringPiece filename_; folly::StringPiece filename_;
unsigned int lineNumber_; unsigned int lineNumber_;
folly::StringPiece functionName_;
std::string message_; std::string message_;
LogStream stream_; LogStream stream_;
}; };
......
...@@ -72,28 +72,31 @@ ...@@ -72,28 +72,31 @@
* LogLevel variable. (This differs from FB_LOG() and FB_LOGF() which accept * LogLevel variable. (This differs from FB_LOG() and FB_LOGF() which accept
* an unqualified LogLevel name.) * an unqualified LogLevel name.)
*/ */
#define FB_LOG_RAW(logger, level, filename, linenumber, ...) \ #define FB_LOG_RAW(logger, level, filename, linenumber, functionName, ...) \
FB_LOG_RAW_IMPL( \ FB_LOG_RAW_IMPL( \
logger, \ logger, \
level, \ level, \
filename, \ filename, \
linenumber, \ linenumber, \
::folly::LogStreamProcessor::APPEND, \ functionName, \
::folly::LogStreamProcessor::APPEND, \
##__VA_ARGS__) ##__VA_ARGS__)
/** /**
* FB_LOGF_RAW() is similar to FB_LOG_RAW(), but formats the log arguments * FB_LOGF_RAW() is similar to FB_LOG_RAW(), but formats the log arguments
* using folly::format(). * using folly::format().
*/ */
#define FB_LOGF_RAW(logger, level, filename, linenumber, fmt, arg1, ...) \ #define FB_LOGF_RAW( \
FB_LOG_RAW_IMPL( \ logger, level, filename, linenumber, functionName, fmt, arg1, ...) \
logger, \ FB_LOG_RAW_IMPL( \
level, \ logger, \
filename, \ level, \
linenumber, \ filename, \
::folly::LogStreamProcessor::FORMAT, \ linenumber, \
fmt, \ functionName, \
arg1, \ ::folly::LogStreamProcessor::FORMAT, \
fmt, \
arg1, \
##__VA_ARGS__) ##__VA_ARGS__)
/** /**
...@@ -110,6 +113,7 @@ ...@@ -110,6 +113,7 @@
(level), \ (level), \
__FILE__, \ __FILE__, \
__LINE__, \ __LINE__, \
__func__, \
(type), \ (type), \
##__VA_ARGS__} \ ##__VA_ARGS__} \
.stream() .stream()
...@@ -123,16 +127,18 @@ ...@@ -123,16 +127,18 @@
* instead of a compile-time constant, we cannot detect at compile time if this * instead of a compile-time constant, we cannot detect at compile time if this
* is a fatal log message or not. * is a fatal log message or not.
*/ */
#define FB_LOG_RAW_IMPL(logger, level, filename, line, type, ...) \ #define FB_LOG_RAW_IMPL( \
(!(logger).getCategory()->logCheck(level)) \ logger, level, filename, line, functionName, type, ...) \
? static_cast<void>(0) \ (!(logger).getCategory()->logCheck(level)) \
: ::folly::LogStreamVoidify<false>{} & \ ? static_cast<void>(0) \
::folly::LogStreamProcessor{(logger).getCategory(), \ : ::folly::LogStreamVoidify<false>{} & \
(level), \ ::folly::LogStreamProcessor{(logger).getCategory(), \
(filename), \ (level), \
(line), \ (filename), \
(type), \ (line), \
##__VA_ARGS__} \ (functionName), \
(type), \
##__VA_ARGS__} \
.stream() .stream()
namespace folly { namespace folly {
......
...@@ -41,6 +41,7 @@ std::string formatMsg( ...@@ -41,6 +41,7 @@ std::string formatMsg(
StringPiece msg, StringPiece msg,
StringPiece filename, StringPiece filename,
unsigned int lineNumber, unsigned int lineNumber,
StringPiece functionName,
// Default timestamp: 2017-04-17 13:45:56.123456 UTC // Default timestamp: 2017-04-17 13:45:56.123456 UTC
uint64_t timestampNS = 1492436756123456789ULL) { uint64_t timestampNS = 1492436756123456789ULL) {
LoggerDB db{LoggerDB::TESTING}; LoggerDB db{LoggerDB::TESTING};
...@@ -50,8 +51,13 @@ std::string formatMsg( ...@@ -50,8 +51,13 @@ std::string formatMsg(
std::chrono::system_clock::time_point logTimePoint{ std::chrono::system_clock::time_point logTimePoint{
std::chrono::duration_cast<std::chrono::system_clock::duration>( std::chrono::duration_cast<std::chrono::system_clock::duration>(
std::chrono::nanoseconds{timestampNS})}; std::chrono::nanoseconds{timestampNS})};
LogMessage logMessage{ LogMessage logMessage{category,
category, level, logTimePoint, filename, lineNumber, msg.str()}; level,
logTimePoint,
filename,
lineNumber,
functionName,
msg.str()};
return formatter.formatMessage(logMessage, category); return formatter.formatMessage(logMessage, category);
} }
...@@ -64,7 +70,9 @@ TEST(GlogFormatter, log) { ...@@ -64,7 +70,9 @@ TEST(GlogFormatter, log) {
auto expected = folly::sformat( auto expected = folly::sformat(
"W0417 13:45:56.123456 {:5d} myfile.cpp:1234] hello world\n", tid); "W0417 13:45:56.123456 {:5d} myfile.cpp:1234] hello world\n", tid);
EXPECT_EQ( EXPECT_EQ(
expected, formatMsg(LogLevel::WARN, "hello world", "myfile.cpp", 1234)); expected,
formatMsg(
LogLevel::WARN, "hello world", "myfile.cpp", 1234, "testFunction"));
} }
TEST(GlogFormatter, filename) { TEST(GlogFormatter, filename) {
...@@ -79,7 +87,8 @@ TEST(GlogFormatter, filename) { ...@@ -79,7 +87,8 @@ TEST(GlogFormatter, filename) {
LogLevel::WARN, LogLevel::WARN,
"hello world", "hello world",
"src/test/logging/code/myfile.cpp", "src/test/logging/code/myfile.cpp",
1234)); 1234,
"testFunction"));
// Log a message with a very long file name. // Log a message with a very long file name.
expected = folly::sformat( expected = folly::sformat(
...@@ -94,7 +103,8 @@ TEST(GlogFormatter, filename) { ...@@ -94,7 +103,8 @@ TEST(GlogFormatter, filename) {
"oh noes", "oh noes",
"this_is_a_really_long_file_name_that_will_probably_exceed_" "this_is_a_really_long_file_name_that_will_probably_exceed_"
"our_buffer_allocation_guess.cpp", "our_buffer_allocation_guess.cpp",
123456789)); 123456789,
"testFunction"));
} }
TEST(GlogFormatter, multiline) { TEST(GlogFormatter, multiline) {
...@@ -126,7 +136,8 @@ TEST(GlogFormatter, multiline) { ...@@ -126,7 +136,8 @@ TEST(GlogFormatter, multiline) {
"\n" "\n"
"=============", "=============",
"src/rodent.cpp", "src/rodent.cpp",
777)); 777,
"testFunction"));
} }
TEST(GlogFormatter, singleNewline) { TEST(GlogFormatter, singleNewline) {
...@@ -139,7 +150,9 @@ TEST(GlogFormatter, singleNewline) { ...@@ -139,7 +150,9 @@ TEST(GlogFormatter, singleNewline) {
"V0417 13:45:56.123456 {tid:>5s} foo.txt:123] \n" "V0417 13:45:56.123456 {tid:>5s} foo.txt:123] \n"
"V0417 13:45:56.123456 {tid:>5s} foo.txt:123] \n", "V0417 13:45:56.123456 {tid:>5s} foo.txt:123] \n",
formatMap); formatMap);
EXPECT_EQ(expected, formatMsg(LogLevel::DBG9, "\n", "foo.txt", 123)); EXPECT_EQ(
expected,
formatMsg(LogLevel::DBG9, "\n", "foo.txt", 123, "testFunction"));
} }
TEST(GlogFormatter, unprintableChars) { TEST(GlogFormatter, unprintableChars) {
...@@ -151,17 +164,28 @@ TEST(GlogFormatter, unprintableChars) { ...@@ -151,17 +164,28 @@ TEST(GlogFormatter, unprintableChars) {
tid); tid);
EXPECT_EQ( EXPECT_EQ(
expected, expected,
formatMsg(LogLevel::ERR, "foo\abar\x1btest", "escapes.cpp", 97)); formatMsg(
LogLevel::ERR,
"foo\abar\x1btest",
"escapes.cpp",
97,
"testFunction"));
expected = folly::sformat( expected = folly::sformat(
"I0417 13:45:56.123456 {:5d} escapes.cpp:98] foo\\\\bar\"test\n", tid); "I0417 13:45:56.123456 {:5d} escapes.cpp:98] foo\\\\bar\"test\n", tid);
EXPECT_EQ( EXPECT_EQ(
expected, formatMsg(LogLevel::INFO, "foo\\bar\"test", "escapes.cpp", 98)); expected,
formatMsg(
LogLevel::INFO, "foo\\bar\"test", "escapes.cpp", 98, "testFunction"));
expected = folly::sformat( expected = folly::sformat(
"C0417 13:45:56.123456 {:5d} escapes.cpp:99] nul\\x00byte\n", tid); "C0417 13:45:56.123456 {:5d} escapes.cpp:99] nul\\x00byte\n", tid);
EXPECT_EQ( EXPECT_EQ(
expected, expected,
formatMsg( formatMsg(
LogLevel::CRITICAL, std::string("nul\0byte", 8), "escapes.cpp", 99)); LogLevel::CRITICAL,
std::string("nul\0byte", 8),
"escapes.cpp",
99,
"testFunction"));
} }
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
......
...@@ -26,8 +26,12 @@ using namespace folly; ...@@ -26,8 +26,12 @@ using namespace folly;
{ \ { \
SCOPED_TRACE( \ SCOPED_TRACE( \
"input string: \"" + folly::backslashify<std::string>(value) + "\""); \ "input string: \"" + folly::backslashify<std::string>(value) + "\""); \
LogMessage checkMsg{ \ LogMessage checkMsg{category, \
category, LogLevel::ERR, __FILE__, __LINE__, std::string{value}}; \ LogLevel::ERR, \
__FILE__, \
__LINE__, \
__func__, \
std::string{value}}; \
EXPECT_EQ(expected, checkMsg.getMessage()); \ EXPECT_EQ(expected, checkMsg.getMessage()); \
EXPECT_EQ(static_cast<int>(hasNewlines), checkMsg.containsNewlines()); \ EXPECT_EQ(static_cast<int>(hasNewlines), checkMsg.containsNewlines()); \
EXPECT_EQ(__FILE__, checkMsg.getFileName()); \ EXPECT_EQ(__FILE__, checkMsg.getFileName()); \
......
...@@ -357,7 +357,15 @@ TEST_F(LoggerTest, logRawMacros) { ...@@ -357,7 +357,15 @@ TEST_F(LoggerTest, logRawMacros) {
auto& messages = handler_->getMessages(); auto& messages = handler_->getMessages();
FB_LOG_RAW(foobar, LogLevel::DBG1, "src/some/file.c", 1234, "hello", ' ', 1) FB_LOG_RAW(
foobar,
LogLevel::DBG1,
"src/some/file.c",
1234,
"testFunction",
"hello",
' ',
1)
<< " world"; << " world";
ASSERT_EQ(1, messages.size()); ASSERT_EQ(1, messages.size());
EXPECT_EQ("hello 1 world", messages[0].first.getMessage()); EXPECT_EQ("hello 1 world", messages[0].first.getMessage());
...@@ -367,7 +375,15 @@ TEST_F(LoggerTest, logRawMacros) { ...@@ -367,7 +375,15 @@ TEST_F(LoggerTest, logRawMacros) {
messages.clear(); messages.clear();
auto level = LogLevel::DBG1; auto level = LogLevel::DBG1;
FB_LOGF_RAW(foobar, level, "test/mytest.c", 99, "{}: num={}", "test", 42) FB_LOGF_RAW(
foobar,
level,
"test/mytest.c",
99,
"testFunction",
"{}: num={}",
"test",
42)
<< " plus extra stuff"; << " plus extra stuff";
ASSERT_EQ(1, messages.size()); ASSERT_EQ(1, messages.size());
EXPECT_EQ("test: num=42 plus extra stuff", messages[0].first.getMessage()); EXPECT_EQ("test: num=42 plus extra stuff", messages[0].first.getMessage());
......
...@@ -82,6 +82,7 @@ TEST(StandardLogHandler, simple) { ...@@ -82,6 +82,7 @@ TEST(StandardLogHandler, simple) {
LogLevel::DBG8, LogLevel::DBG8,
"src/test.cpp", "src/test.cpp",
1234, 1234,
"testMethod",
std::string{"hello world"}}; std::string{"hello world"}};
handler.handleMessage(msg, handlerCategory); handler.handleMessage(msg, handlerCategory);
ASSERT_EQ(1, writer->getMessages().size()); ASSERT_EQ(1, writer->getMessages().size());
...@@ -100,7 +101,8 @@ TEST(StandardLogHandler, levelCheck) { ...@@ -100,7 +101,8 @@ TEST(StandardLogHandler, levelCheck) {
auto handlerCategory = db.getCategory("handler_cat"); auto handlerCategory = db.getCategory("handler_cat");
auto logMsg = [&](LogLevel level, folly::StringPiece message) { auto logMsg = [&](LogLevel level, folly::StringPiece message) {
LogMessage msg{logCategory, level, "src/test.cpp", 1234, message}; LogMessage msg{
logCategory, level, "src/test.cpp", 1234, "testMethod", message};
handler.handleMessage(msg, handlerCategory); handler.handleMessage(msg, handlerCategory);
}; };
......
...@@ -228,6 +228,7 @@ ...@@ -228,6 +228,7 @@
xlog_detail::isXlogCategoryOverridden(0), \ xlog_detail::isXlogCategoryOverridden(0), \
XLOG_FILENAME, \ XLOG_FILENAME, \
__LINE__, \ __LINE__, \
__func__, \
(type), \ (type), \
##__VA_ARGS__) \ ##__VA_ARGS__) \
.stream() .stream()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment