/// <summary>
        /// Creates and starts a binary log writer putting records down to the memory stream, which can be obtained remotely.
        /// </summary>
        /// <param name="maximumMemorySize">The maximum possible size of memory space occupied by log records.</param>
        /// <param name="logOptions">The options specifying what information will be saved into the log.</param>
        public static void SetUpLoggingToMemory(int maximumMemorySize, string logOptions)
        {
            lock (_accessToLocalMembers)
            {
                if (_memoryWritingWriter == null)
                {
                    _memoryWritingStream = new MemoryWritingStream(maximumMemorySize);
                    _memoryWritingWriter = new BinaryLogWriter(_memoryWritingStream);

                    SetUpLoggingOptionsFromString(_memoryWritingWriter, GenuineLoggingServices.DefaultLoggingOptions);
                    SetUpLoggingOptionsFromString(_memoryWritingWriter, logOptions);

                    _remoteLogService = new RemoteLogService(_memoryWritingStream);
                    RemotingServices.Marshal(_remoteLogService, GenuineLoggingServices.RemoteLogServiceObjectUri);
                    Belikov.GenuineChannels.DirectExchange.DirectExchangeManager.RegisterGlobalServerService(GenuineLoggingServices.RemoteLogServiceObjectUri, _remoteLogService);
                    Belikov.GenuineChannels.Security.SecuritySessionServices.SetGlobalKey(GenuineLoggingServices.LoggingSESSPName, new Belikov.GenuineChannels.Security.KeyProvider_SelfEstablishingSymmetric());
                }

                GenuineLoggingServices.BinaryLogWriter = _memoryWritingWriter;
            }
        }
        /// <summary>
        /// Stops putting down log records.
        /// </summary>
        public static void StopLogging()
        {
            lock (_accessToLocalMembers)
            {
                GenuineLoggingServices.BinaryLogWriter = null;

                if (_memoryWritingWriter != null)
                {
                    RemotingServices.Disconnect(_remoteLogService);
                    _remoteLogService.StopLogging();
                    _remoteLogService = null;

                    _memoryWritingStream = null;
                    _memoryWritingWriter = null;
                }
            }
        }
        /// <summary>
        /// Creates and starts a binary log writer putting records down to the memory stream, which can be obtained remotely.
        /// </summary>
        /// <param name="maximumMemorySize">The maximum possible size of memory space occupied by log records.</param>
        /// <param name="logOptions">The options specifying what information will be saved into the log.</param>
        public static void SetUpLoggingToMemory(int maximumMemorySize, string logOptions)
        {
            lock (_accessToLocalMembers)
            {
                if (_memoryWritingWriter == null)
                {
                    _memoryWritingStream = new MemoryWritingStream(maximumMemorySize);
                    _memoryWritingWriter = new BinaryLogWriter(_memoryWritingStream);

                    SetUpLoggingOptionsFromString(_memoryWritingWriter, GenuineLoggingServices.DefaultLoggingOptions);
                    SetUpLoggingOptionsFromString(_memoryWritingWriter, logOptions);

                    _remoteLogService = new RemoteLogService(_memoryWritingStream);
                    RemotingServices.Marshal(_remoteLogService, GenuineLoggingServices.RemoteLogServiceObjectUri);
                    Belikov.GenuineChannels.DirectExchange.DirectExchangeManager.RegisterGlobalServerService(GenuineLoggingServices.RemoteLogServiceObjectUri, _remoteLogService);
                    Belikov.GenuineChannels.Security.SecuritySessionServices.SetGlobalKey(GenuineLoggingServices.LoggingSESSPName, new Belikov.GenuineChannels.Security.KeyProvider_SelfEstablishingSymmetric());
                }

                GenuineLoggingServices.BinaryLogWriter = _memoryWritingWriter;
            }
        }