Grpc本身提供了全局日志接口,但该日志是异常产生后的日志,也就是说不能拦截异常信息。
源代码、Grpc预留的ILogger接口
namespace Grpc.Core.Logging
{
public interface ILogger
{
ILogger ForType<T>();
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<T>() 返回 this
public class GrpcLogger : ILogger
{
public GrpcLogger(/*可自定义参数*/)
{
}
public ILogger ForType<T>()
{
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<T>() 进行判断 返回对应的日志对象。
public ILogger ForType<T>()
{
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实现类。