/// <summary>
        /// Create a new OICP EMP server logger using the default logging delegates.
        /// </summary>
        /// <param name="EMPServer">A OICP EMP server.</param>
        /// <param name="Context">A context of this API.</param>
        /// <param name="LogfileCreator">A delegate to create a log file from the given context and log file name.</param>
        public EMPServerLogger(EMPSOAPServer EMPServer,
                               String Context = DefaultContext,
                               LogfileCreatorDelegate LogfileCreator = null)

            : this(EMPServer,
                   Context.IsNotNullOrEmpty() ? Context : DefaultContext,
                   null,
                   null,
                   null,
                   null,
                   LogfileCreator : LogfileCreator)

        {
        }
        /// <summary>
        /// Create a new OICP EMP server logger using the given logging delegates.
        /// </summary>
        /// <param name="EMPServer">A OICP EMP server.</param>
        /// <param name="Context">A context of this API.</param>
        ///
        /// <param name="LogHTTPRequest_toConsole">A delegate to log incoming HTTP requests to console.</param>
        /// <param name="LogHTTPResponse_toConsole">A delegate to log HTTP requests/responses to console.</param>
        /// <param name="LogHTTPRequest_toDisc">A delegate to log incoming HTTP requests to disc.</param>
        /// <param name="LogHTTPResponse_toDisc">A delegate to log HTTP requests/responses to disc.</param>
        ///
        /// <param name="LogHTTPRequest_toNetwork">A delegate to log incoming HTTP requests to a network target.</param>
        /// <param name="LogHTTPResponse_toNetwork">A delegate to log HTTP requests/responses to a network target.</param>
        /// <param name="LogHTTPRequest_toHTTPSSE">A delegate to log incoming HTTP requests to a HTTP server sent events source.</param>
        /// <param name="LogHTTPResponse_toHTTPSSE">A delegate to log HTTP requests/responses to a HTTP server sent events source.</param>
        ///
        /// <param name="LogHTTPError_toConsole">A delegate to log HTTP errors to console.</param>
        /// <param name="LogHTTPError_toDisc">A delegate to log HTTP errors to disc.</param>
        /// <param name="LogHTTPError_toNetwork">A delegate to log HTTP errors to a network target.</param>
        /// <param name="LogHTTPError_toHTTPSSE">A delegate to log HTTP errors to a HTTP server sent events source.</param>
        ///
        /// <param name="LogfileCreator">A delegate to create a log file from the given context and log file name.</param>
        public EMPServerLogger(EMPSOAPServer EMPServer,
                               String Context,

                               HTTPRequestLoggerDelegate LogHTTPRequest_toConsole,
                               HTTPResponseLoggerDelegate LogHTTPResponse_toConsole,
                               HTTPRequestLoggerDelegate LogHTTPRequest_toDisc,
                               HTTPResponseLoggerDelegate LogHTTPResponse_toDisc,

                               HTTPRequestLoggerDelegate LogHTTPRequest_toNetwork   = null,
                               HTTPResponseLoggerDelegate LogHTTPResponse_toNetwork = null,
                               HTTPRequestLoggerDelegate LogHTTPRequest_toHTTPSSE   = null,
                               HTTPResponseLoggerDelegate LogHTTPResponse_toHTTPSSE = null,

                               HTTPResponseLoggerDelegate LogHTTPError_toConsole = null,
                               HTTPResponseLoggerDelegate LogHTTPError_toDisc    = null,
                               HTTPResponseLoggerDelegate LogHTTPError_toNetwork = null,
                               HTTPResponseLoggerDelegate LogHTTPError_toHTTPSSE = null,

                               LogfileCreatorDelegate LogfileCreator = null)

            : base(EMPServer?.SOAPServer.HTTPServer,
                   Context.IsNotNullOrEmpty() ? Context : DefaultContext,

                   LogHTTPRequest_toConsole,
                   LogHTTPResponse_toConsole,
                   LogHTTPRequest_toDisc,
                   LogHTTPResponse_toDisc,

                   LogHTTPRequest_toNetwork,
                   LogHTTPResponse_toNetwork,
                   LogHTTPRequest_toHTTPSSE,
                   LogHTTPResponse_toHTTPSSE,

                   LogHTTPError_toConsole,
                   LogHTTPError_toDisc,
                   LogHTTPError_toNetwork,
                   LogHTTPError_toHTTPSSE,

                   LogfileCreator)

        {
            #region Initial checks

            this.EMPServer = EMPServer ?? throw new ArgumentNullException(nameof(EMPServer), "The given EMP server must not be null!");

            #endregion

            #region Register log events

            // AuthorizeStart/-Stop

            RegisterEvent("AuthorizeStartRequest",
                          handler => EMPServer.OnAuthorizeStartSOAPRequest += handler,
                          handler => EMPServer.OnAuthorizeStartSOAPRequest -= handler,
                          "AuthorizeStart", "Authorize", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);

            RegisterEvent("AuthorizeStartResponse",
                          handler => EMPServer.OnAuthorizeStartSOAPResponse += handler,
                          handler => EMPServer.OnAuthorizeStartSOAPResponse -= handler,
                          "AuthorizeStart", "Authorize", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);


            RegisterEvent("AuthorizeStopRequest",
                          handler => EMPServer.OnAuthorizeStopSOAPRequest += handler,
                          handler => EMPServer.OnAuthorizeStopSOAPRequest -= handler,
                          "AuthorizeStop", "Authorize", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);

            RegisterEvent("AuthorizeStopResponse",
                          handler => EMPServer.OnAuthorizeStopSOAPResponse += handler,
                          handler => EMPServer.OnAuthorizeStopSOAPResponse -= handler,
                          "AuthorizeStop", "Authorize", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);


            // ChargeDetailRecord

            RegisterEvent("ChargeDetailRecordRequest",
                          handler => EMPServer.OnChargeDetailRecordSOAPRequest += handler,
                          handler => EMPServer.OnChargeDetailRecordSOAPRequest -= handler,
                          "ChargeDetailRecord", "CDR", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);

            RegisterEvent("ChargeDetailRecordResponse",
                          handler => EMPServer.OnChargeDetailRecordSOAPResponse += handler,
                          handler => EMPServer.OnChargeDetailRecordSOAPResponse -= handler,
                          "ChargeDetailRecord", "CDR", "All").
            RegisterDefaultConsoleLogTarget(this).
            RegisterDefaultDiscLogTarget(this);

            #endregion
        }