WebSocketSharp - отключение ведения журнала консоли не работает - PullRequest
0 голосов
/ 30 марта 2019

Я использую: 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

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

enter image description here

Я выделил проблему для этогокод внутри 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());
};

1 Ответ

0 голосов
/ 31 марта 2019

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

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) => { }));
}
...