Support adding a request ID to logged / printed exceptions
authorTim Düsterhus <duesterhus@woltlab.com>
Sun, 5 May 2019 19:17:52 +0000 (21:17 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Sun, 5 May 2019 20:48:40 +0000 (22:48 +0200)
This can be used to correlate requests in logfiles across the whole
stack from reverse proxy / CDN through web server to PHP and WoltLab
Suite.

wcfsetup/install/files/lib/core.functions.php

index a287a9b374491d853262869c6a072f4d8e297cc5..8a888d0a9e55742ab29cb0bfa5ae4a23ebab66a7 100644 (file)
@@ -97,6 +97,14 @@ namespace {
 }
 
 // @codingStandardsIgnoreStart
+namespace wcf {
+       function getRequestId() {
+               if (!defined('WCF_REQUEST_ID_HEADER') || !WCF_REQUEST_ID_HEADER) return '';
+               
+               return $_SERVER[WCF_REQUEST_ID_HEADER] ?? '';
+       }
+}
+
 namespace wcf\functions\exception {
        use wcf\system\WCF;
        use wcf\system\exception\IExtraInformationException;
@@ -124,7 +132,7 @@ namespace wcf\functions\exception {
                        'Message: '.$stripNewlines($e->getMessage())."\n".
                        'PHP version: '.phpversion()."\n".
                        'WoltLab Suite version: '.WCF_VERSION."\n".
-                       'Request URI: '.$stripNewlines($_SERVER['REQUEST_URI'] ?? '')."\n".
+                       'Request URI: '.$stripNewlines($_SERVER['REQUEST_URI'] ?? '').(\wcf\getRequestId() ? ' ('.\wcf\getRequestId().')' : '')."\n".
                        'Referrer: '.$stripNewlines($_SERVER['HTTP_REFERER'] ?? '')."\n".
                        'User Agent: '.$stripNewlines($_SERVER['HTTP_USER_AGENT'] ?? '')."\n".
                        'Peak Memory Usage: '.memory_get_peak_usage().'/'.FileUtil::getMemoryLimit()."\n";
@@ -178,6 +186,7 @@ namespace wcf\functions\exception {
         */
        function printThrowable($e) {
                $exceptionID = logThrowable($e, $logFile);
+               if (\wcf\getRequestId()) $exceptionID .= '/'.\wcf\getRequestId();
                
                $exceptionTitle = $exceptionSubtitle = $exceptionExplanation = '';
                $logFile = sanitizePath($logFile);