0

我正在使用: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'。

我的要求是能够在使用 WebSocketSharp 的 Nuget 包时禁用日志记录(所以我不能真正评论内部代码)。我想我在这里遗漏了一些非常简单的东西。

// 编辑 1

如果我处理消息以实际将输出发送到控制台,它会出现两次,因此这意味着默认操作不会被替换。

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

2 回答 2

0

来自 GitHub:https ://github.com/sta/websocket-sharp

#if DEBUG
      // To change the logging level.
      httpsv.Log.Level = LogLevel.Trace;
#endif
于 2020-12-01T21:00:53.290 回答
0

我用hacky方式解决了它:

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) => { }));
}
于 2019-03-31T15:41:09.407 回答