public static function start($skipConfiguration = false)
    {
        if (self::$instance !== null) {
            throw new LogException("Logger already started!");
        }

        // Load the logger.
        self::$instance = new Writer();

        // Apply configuration.
        if (! $skipConfiguration && Configuration::get('app.log', true)) {
            // Get configuration
            $logPath = Configuration::get('app.logPath');
            if ($logPath === null) {// @codeCoverageIgnore
                throw new ConfigurationException("app.logPath is not valid!");  // @codeCoverageIgnore
            }                       // @codeCoverageIgnore

            if (! file_exists($logPath)) {  // @codeCoverageIgnore
                if (! mkdir($logPath)) {    // @codeCoverageIgnore
                    throw new PermissionDeniedException("Could not create directory '" . $logPath . "'!");  // @codeCoverageIgnore
                }                           // @codeCoverageIgnore
            }                               // @codeCoverageIgnore

            // Get all level and log files.
            self::$files = Configuration::get('app.logFile', ['app.log' => self::ERROR]);

            self::$path = $logPath;

            // Load all handlers.
            foreach (self::$files as $file => $minimumLevel) {
                self::$instance->addHandler(new StreamHandler($logPath . $file, $minimumLevel));
            }
        }

        // Register exception/error handler
        ExceptionHandler::register();
    }