INTERNAL,
std::string()) {}
-LogStreamProcessor::LogStreamProcessor(
- XlogFileScopeInfo* fileScopeInfo,
- LogLevel level,
- folly::StringPiece filename,
- unsigned int lineNumber,
- AppendType) noexcept
- : LogStreamProcessor(
- fileScopeInfo,
- level,
- filename,
- lineNumber,
- INTERNAL,
- std::string()) {}
-
LogStreamProcessor::LogStreamProcessor(
const LogCategory* category,
LogLevel level,
}
return categoryInfo->getCategory(&xlog_detail::xlogFileScopeInfo);
}
-
-LogCategory* getXlogCategory(XlogFileScopeInfo* fileScopeInfo) {
- // By the time a LogStreamProcessor is created, the XlogFileScopeInfo object
- // should have already been initialized to perform the log level check.
- // Therefore we never need to check if it is initialized here.
- return fileScopeInfo->category;
-}
}
/**
message_{std::move(msg)},
stream_{this} {}
+#ifdef __INCLUDE_LEVEL__
+namespace {
+LogCategory* getXlogCategory(XlogFileScopeInfo* fileScopeInfo) {
+ // By the time a LogStreamProcessor is created, the XlogFileScopeInfo object
+ // should have already been initialized to perform the log level check.
+ // Therefore we never need to check if it is initialized here.
+ return fileScopeInfo->category;
+}
+}
+
/**
* Construct a LogStreamProcessor from an XlogFileScopeInfo.
*
* We intentionally define this in LogStreamProcessor.cpp instead of
* LogStreamProcessor.h to avoid having it inlined at every XLOG() call site,
* to reduce the emitted code size.
+ *
+ * This is only defined if __INCLUDE_LEVEL__ is available. The
+ * XlogFileScopeInfo APIs are only invoked if we can use __INCLUDE_LEVEL__ to
+ * tell that an XLOG() statement occurs in a non-header file. For compilers
+ * that do not support __INCLUDE_LEVEL__, the category information is always
+ * passed in as XlogCategoryInfo<true> rather than as XlogFileScopeInfo.
*/
LogStreamProcessor::LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
message_{std::move(msg)},
stream_{this} {}
+LogStreamProcessor::LogStreamProcessor(
+ XlogFileScopeInfo* fileScopeInfo,
+ LogLevel level,
+ folly::StringPiece filename,
+ unsigned int lineNumber,
+ AppendType) noexcept
+ : LogStreamProcessor(
+ fileScopeInfo,
+ level,
+ filename,
+ lineNumber,
+ INTERNAL,
+ std::string()) {}
+#endif
+
/*
* We intentionally define the LogStreamProcessor destructor in
* LogStreamProcessor.cpp instead of LogStreamProcessor.h to avoid having it
AppendType) noexcept;
/**
- * LogStreamProcessor constructors for use with XLOG() macros with no extra
- * arguments.
+ * LogStreamProcessor constructor for use with a LOG() macro with arguments
+ * to be concatenated with folly::to<std::string>()
*
- * These are defined separately from the above constructor so that the work
- * of initializing the XLOG LogCategory data is done in a separate function
- * body defined in LogStreamProcessor.cpp. We intentionally want to avoid
- * inlining this work at every XLOG() statement, to reduce the emitted code
- * size.
+ * Note that the filename argument is not copied. The caller should ensure
+ * that it points to storage that will remain valid for the lifetime of the
+ * LogStreamProcessor. (This is always the case for the __FILE__
+ * preprocessor macro.)
*/
+ template <typename... Args>
LogStreamProcessor(
- XlogCategoryInfo<true>* categoryInfo,
- LogLevel level,
- folly::StringPiece categoryName,
- bool isCategoryNameOverridden,
- folly::StringPiece filename,
- unsigned int lineNumber,
- AppendType) noexcept;
- LogStreamProcessor(
- XlogFileScopeInfo* fileScopeInfo,
- LogLevel level,
- folly::StringPiece filename,
- unsigned int lineNumber,
- AppendType) noexcept;
- LogStreamProcessor(
- XlogFileScopeInfo* fileScopeInfo,
+ const LogCategory* category,
LogLevel level,
- folly::StringPiece /* categoryName */,
- bool /* isCategoryNameOverridden */,
folly::StringPiece filename,
unsigned int lineNumber,
- AppendType) noexcept
- : LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
- }
+ AppendType,
+ Args&&... args) noexcept
+ : LogStreamProcessor(
+ category,
+ level,
+ filename,
+ lineNumber,
+ INTERNAL,
+ createLogString(std::forward<Args>(args)...)) {}
/**
* LogStreamProcessor constructor for use with a LOG() macro with arguments
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
- AppendType,
+ FormatType,
+ folly::StringPiece fmt,
Args&&... args) noexcept
: LogStreamProcessor(
category,
filename,
lineNumber,
INTERNAL,
- createLogString(std::forward<Args>(args)...)) {}
+ formatLogString(fmt, std::forward<Args>(args)...)) {}
- /**
- * Versions of the above constructor for use in XLOG() statements.
+ /*
+ * Versions of the above constructors for use in XLOG() statements.
+ *
+ * These are defined separately from the above constructor so that the work
+ * of initializing the XLOG LogCategory data is done in a separate function
+ * body defined in LogStreamProcessor.cpp. We intentionally want to avoid
+ * inlining this work at every XLOG() statement, to reduce the emitted code
+ * size.
*/
+ LogStreamProcessor(
+ XlogCategoryInfo<true>* categoryInfo,
+ LogLevel level,
+ folly::StringPiece categoryName,
+ bool isCategoryNameOverridden,
+ folly::StringPiece filename,
+ unsigned int lineNumber,
+ AppendType) noexcept;
template <typename... Args>
LogStreamProcessor(
XlogCategoryInfo<true>* categoryInfo,
createLogString(std::forward<Args>(args)...)) {}
template <typename... Args>
LogStreamProcessor(
- XlogFileScopeInfo* fileScopeInfo,
+ XlogCategoryInfo<true>* categoryInfo,
LogLevel level,
- folly::StringPiece /* categoryName */,
- bool /* isCategoryNameOverridden */,
+ folly::StringPiece categoryName,
+ bool isCategoryNameOverridden,
folly::StringPiece filename,
unsigned int lineNumber,
- AppendType,
+ FormatType,
+ folly::StringPiece fmt,
Args&&... args) noexcept
: LogStreamProcessor(
- fileScopeInfo,
+ categoryInfo,
level,
+ categoryName,
+ isCategoryNameOverridden,
filename,
lineNumber,
INTERNAL,
- createLogString(std::forward<Args>(args)...)) {}
+ formatLogString(fmt, std::forward<Args>(args)...)) {}
- /**
- * LogStreamProcessor constructor for use with a LOG() macro with arguments
- * to be concatenated with folly::to<std::string>()
+#ifdef __INCLUDE_LEVEL__
+ /*
+ * Versions of the above constructors to use in XLOG() macros that appear in
+ * .cpp files. These are only used if the compiler supports the
+ * __INCLUDE_LEVEL__ macro, which we need to determine that the XLOG()
+ * statement is not in a header file.
*
- * Note that the filename argument is not copied. The caller should ensure
- * that it points to storage that will remain valid for the lifetime of the
- * LogStreamProcessor. (This is always the case for the __FILE__
- * preprocessor macro.)
+ * These behave identically to the XlogCategoryInfo<true> versions of the
+ * APIs, but slightly more optimized, and allow the XLOG() code to avoid
+ * storing category information at each XLOG() call site.
*/
- template <typename... Args>
LogStreamProcessor(
- const LogCategory* category,
+ XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
- FormatType,
- folly::StringPiece fmt,
- Args&&... args) noexcept
- : LogStreamProcessor(
- category,
- level,
- filename,
- lineNumber,
- INTERNAL,
- formatLogString(fmt, std::forward<Args>(args)...)) {}
-
- /**
- * Versions of the above constructor for use in XLOG() statements.
- */
+ AppendType) noexcept;
+ LogStreamProcessor(
+ XlogFileScopeInfo* fileScopeInfo,
+ LogLevel level,
+ folly::StringPiece /* categoryName */,
+ bool /* isCategoryNameOverridden */,
+ folly::StringPiece filename,
+ unsigned int lineNumber,
+ AppendType) noexcept
+ : LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
+ }
template <typename... Args>
LogStreamProcessor(
- XlogCategoryInfo<true>* categoryInfo,
+ XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
- folly::StringPiece categoryName,
- bool isCategoryNameOverridden,
+ folly::StringPiece /* categoryName */,
+ bool /* isCategoryNameOverridden */,
folly::StringPiece filename,
unsigned int lineNumber,
- FormatType,
- folly::StringPiece fmt,
+ AppendType,
Args&&... args) noexcept
: LogStreamProcessor(
- categoryInfo,
+ fileScopeInfo,
level,
- categoryName,
- isCategoryNameOverridden,
filename,
lineNumber,
INTERNAL,
- formatLogString(fmt, std::forward<Args>(args)...)) {}
-
+ createLogString(std::forward<Args>(args)...)) {}
template <typename... Args>
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
lineNumber,
INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {}
+#endif
~LogStreamProcessor() noexcept;