WebSocketSharp - отключение ведения журнала консоли не работает

Я использую: WebSocketSharp — https://github.com/sta/websocket-sharp

И следующий код как часть моего p2pserver:

public void Listen()
{
    var server = new WebSocketServer(P2PPort);

    server.Log.Output += (d, s) => { };
    server.AddWebSocketService<P2PServerSocketBehavior>("/", bhv =>
    {
        bhv.OnConnection += (s, e) => ConnectSocket(e.Socket);
        bhv.OnException += (s, e) => CloseSocket(e.Socket, e.Message);
        bhv.OnDisconnect += (s, e) => CloseSocket(e.Socket, e.Reason);
    });

    server.Log.Output += (d, s) => { };
    server.Start();
    server.Log.Output += (d, s) => { };

    Console.WriteLine($"Listening for peer-to-peer connections on port {P2PPort}");

    ConnectToPeers();
}

private void ConnectToPeers()
{
    PeerAddresses.ForEach(peer =>
    {
        var socket = new WebSocket(peer);
        socket.Log.Output += (d, s) => { };
        socket.OnOpen += (s, e) => ConnectSocket(socket);
        socket.OnError += (s, e) => CloseSocket(socket, e.Message);
        socket.OnClose += (s, e) => CloseSocket(socket, e.Reason);
        socket.Log.Output += (d, s) => { };
        socket.Connect();
        socket.Log.Output += (d, s) => { };
    });
}

Как вы можете видеть выше, я пытаюсь отключить ведение журнала консоли, как описано здесь: https://github.com/sta/websocket-sharp/issues/368

Несмотря на это, я все еще получаю журналы ошибок:

введите здесь описание изображения

Я выделил проблему для этого кода внутри websocket-sharp:

private static void defaultOutput(LogData data, string path)
{
    var log = data.ToString();
    Console.WriteLine(log);
    if (path != null && path.Length > 0)
        writeToFile(log, path);
}

private void output(string message, LogLevel level)
{
    lock (_sync)
    {
        if (_level > level)
            return;

        LogData data = null;
        try
        {
            data = new LogData(level, new StackFrame(2, true), message);
            _output(data, _file);
        }
        catch (Exception ex)
        {
            data = new LogData(LogLevel.Fatal, new StackFrame(0, true), ex.Message);
            Console.WriteLine(data.ToString());
        }
    }
}

Комментирование «Console.WriteLine» в первой функции решает проблему.

Таким образом, в соответствии с вышеизложенным кажется, что по какой-то причине '_output' остается 'defaultOutput', несмотря на явную установку его значения.

Мое требование состоит в том, чтобы иметь возможность отключить ведение журнала при использовании пакета Nuget WebSocketSharp (поэтому я не могу комментировать внутренний код). Я предполагаю, что мне не хватает чего-то действительно простого здесь.

// ИЗМЕНИТЬ 1

Если я обрабатываю сообщение, чтобы фактически отправить вывод на консоль, оно появляется дважды, поэтому это означает, что действие по умолчанию не заменяется.

server.Log.Output += (d, s) =>
{
    Console.WriteLine(d.ToString());
};

person rvnlord    schedule 30.03.2019    source источник


Ответы (2)


Я решил это хакерским способом:

public static void Disable(this Logger logger)
{
    var field = logger.GetType().GetField("_output", BindingFlags.NonPublic | BindingFlags.Instance);
    field?.SetValue(logger, new Action<LogData, string>((d, s) => { }));
}
person rvnlord    schedule 31.03.2019

Из GitHub: https://github.com/sta/websocket-sharp

#if DEBUG
      // To change the logging level.
      httpsv.Log.Level = LogLevel.Trace;
#endif
person ggeorge    schedule 01.12.2020