void vLogWithLoggerImpl()

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;
}