in agent/native/ext/log.cpp [528:618]
void vLogWithLoggerImpl(
Logger* logger
, bool isForced
, LogLevel statementLevel
, StringView category
, StringView filePath
, UInt lineNumber
, StringView funcName
, String msgPrintfFmt
, va_list msgPrintfFmtArgs
)
{
if ( logger->reentrancyDepth + 1 > maxLoggerReentrancyDepth ) return;
++ logger->reentrancyDepth;
ELASTIC_APM_ASSERT_GT_UINT64( logger->reentrancyDepth, 0 );
ELASTIC_APM_ASSERT_VALID_PTR( logger );
enum
{
commonPrefixBufferSize = 200 + ELASTIC_APM_TEXT_OUTPUT_STREAM_RESERVED_SPACE_SIZE,
};
char commonPrefixBuffer[commonPrefixBufferSize];
StringView commonPrefix = {nullptr, 0};
if ( isForced || logger->config.levelPerSinkType[ logSink_stderr ] >= statementLevel )
{
if (commonPrefix.begin == nullptr) {
commonPrefix = buildCommonPrefix( statementLevel, category, filePath, lineNumber, funcName, commonPrefixBuffer, commonPrefixBufferSize );
}
// create a separate copy of va_list because functions using it (such as fprintf, etc.) modify it
va_list msgPrintfFmtArgsCopy;
va_copy( /* dst: */ msgPrintfFmtArgsCopy, /* src: */ msgPrintfFmtArgs );
writeToStderr( logger, statementLevel, commonPrefix, msgPrintfFmt, msgPrintfFmtArgsCopy );
va_end( msgPrintfFmtArgsCopy );
}
#ifndef PHP_WIN32
if ( isForced || logger->config.levelPerSinkType[ logSink_syslog ] >= statementLevel )
{
if (commonPrefix.begin == nullptr) {
commonPrefix = buildCommonPrefix( statementLevel, category, filePath, lineNumber, funcName, commonPrefixBuffer, commonPrefixBufferSize );
}
// create a separate copy of va_list because functions using it (such as fprintf, etc.) modify it
va_list msgPrintfFmtArgsCopy;
va_copy( /* dst: */ msgPrintfFmtArgsCopy, /* src: */ msgPrintfFmtArgs );
writeToSyslog( logger, statementLevel, commonPrefix, msgPrintfFmt, msgPrintfFmtArgsCopy );
va_end( msgPrintfFmtArgsCopy );
}
#endif
#ifdef PHP_WIN32
if ( isForced || logger->config.levelPerSinkType[ logSink_winSysDebug ] >= statementLevel )
{
if (commonPrefix.begin == nullptr) {
commonPrefix = buildCommonPrefix( statementLevel, category, filePath, lineNumber, funcName, commonPrefixBuffer, commonPrefixBufferSize );
}
// create a separate copy of va_list because functions using it (such as fprintf, etc.) modify it
va_list msgPrintfFmtArgsCopy;
va_copy( /* dst: */ msgPrintfFmtArgsCopy, /* src: */ msgPrintfFmtArgs );
writeToWinSysDebug( logger, commonPrefix, msgPrintfFmt, msgPrintfFmtArgsCopy );
va_end( msgPrintfFmtArgsCopy );
}
#endif
if ( ( isForced || logger->config.levelPerSinkType[ logSink_file ] >= statementLevel ) && isLogFileInGoodState( logger ) )
{
if (commonPrefix.begin == nullptr) {
commonPrefix = buildCommonPrefix( statementLevel, category, filePath, lineNumber, funcName, commonPrefixBuffer, commonPrefixBufferSize );
}
// create a separate copy of va_list because functions using it (such as fprintf, etc.) modify it
va_list msgPrintfFmtArgsCopy;
va_copy( /* dst: */ msgPrintfFmtArgsCopy, /* src: */ msgPrintfFmtArgs );
writeToFile( logger, commonPrefix, msgPrintfFmt, msgPrintfFmtArgsCopy );
va_end( msgPrintfFmtArgsCopy );
}
#ifdef ELASTIC_APM_LOG_CUSTOM_SINK_FUNC
if (commonPrefix.begin == nullptr) {
commonPrefix = buildCommonPrefix( statementLevel, category, filePath, lineNumber, funcName, commonPrefixBuffer, commonPrefixBufferSize );
}
va_list msgPrintfFmtArgsCopy;
va_copy( /* dst: */ msgPrintfFmtArgsCopy, /* src: */ msgPrintfFmtArgs );
buildFullTextAndWriteToCustomSink( logger, commonPrefix, msgPrintfFmt, msgPrintfFmtArgsCopy );
va_end( msgPrintfFmtArgsCopy );
#endif
ELASTIC_APM_ASSERT_GT_UINT64( logger->reentrancyDepth, 0 );
-- logger->reentrancyDepth;
}