C# Grpc全局日志GrpcEnviroment.SetLogger

Grpc本身提供了全局日志接口,但该日志是异常产生后的日志,也就是说不能拦截异常信息。

源代码、Grpc预留的ILogger接口

namespace Grpc.Core.Logging
{
    public interface ILogger
    {
        ILogger ForType();
        void Debug(string message);
        void Debug(string format, params object[] formatArgs);
        void Info(string message);
        void Info(string format, params object[] formatArgs);

        void Warning(string message);
        void Warning(string format, params object[] formatArgs);
        void Warning(Exception exception, string message);
        void Error(string message);
        void Error(string format, params object[] formatArgs);
        void Error(Exception exception, string message);
    }
}

要实现 全局日志的话
第一步 需要实现 ILogger接口,特别注意 ForType() 返回 this

public class GrpcLogger : ILogger
{
    public GrpcLogger(/*可自定义参数*/)
    {

    }

    public ILogger ForType()
    {
        return this;
    }

    Debug 略

    public void Error(string message)   
    { 
        Error(null, message); 
    }
    public void Error(string format, params object[] formatArgs)
    {   
        Error(string.Format(format, formatArgs));
    }

    public void Error(Exception exception, string message)
    {
        FileLogger.Error(message, exception);
    }

    public void Info(string message)
    {
        FileLogger.Info(message, exception);
    }

    public void Info(string format, params object[] formatArgs)
    {
        Info(string.Format(format, formatArgs));
    }

    public void Warning(string message)
    {
        Warning(null, message);
    }

    public void Warning(string format, params object[] formatArgs)
    {
        Warning(string.Format(format, formatArgs));
    }

    public void Warning(Exception exception, string message)
    {
        FileLogger.Error(message, exception);
    }
}

然后在 程序启动的时候(如:Main方法),添加以下代码:

GrpcEnvironment.SetLogger(new GrpcLogger());

另外 如果想只接收某种日志,可以通过ILogger ForType() 进行判断 返回对应的日志对象。

public ILogger ForType()
{
    if (typeof(T) == typeof(Server))
        return new ServerLogger();

    if(typeof(T) == typeof(Channel))
    if(typeof(T) == typeof(GrpcThreadPool))
    等等的
    return this;
}

注:如果想要实现拦截式的日志,则可以实现 Grpc.Core.Interceptors.Interceptor 抽象类(部分老版本没有,好像是1.10.0以后版本才有),
应用是在创建ServerServiceDefinition(即Grpc的Service)后,调用Intercept方法引入Interceptor实现类。

你可能感兴趣的:(C# Grpc全局日志GrpcEnviroment.SetLogger)