网关转发日志非常有用可以进行数据和行为分析,组件提供一个默认的日志插件,但默认记录的东西比较简单不一定满足业务的需要;其实组件提供信息非常完善足以满足不同情况的需要。在这里介绍一下如何实现一个日志插件来记录自己需要的信息,。
插件接口
IRequestedHandler
是一个代理转发完成的接口,通过实现这一接口可以把转发的结果信息记录下来,先看一下这个接口的定义:
public interface IPlugin{string Name { get; }string Description { get; }PluginLevel Level { get; }void Init(Gateway gateway, Assembly assembly);void LoadSetting(JToken setting);object SaveSetting();}public interface IRequestedHandler : IPlugin{void Execute(EventRequestCompletedArgs e);}
IRequestedHandler
承继了IPlugin
,而IPlugin
则是描述一个插件的基础信息,主要有包括名称,说明,执行级别和配置处理等.
实现
接下来实现一个转发完成把信息输出控制台的扩展:
class ConsoleLog : Bumblebee.Plugins.IRequestedHandler{public string Name => "custom_console_log";public string Description => "custom_console_log";public PluginLevel Level => PluginLevel.None;public void Execute(EventRequestCompletedArgs e){Console.WriteLine($"{DateTime.Now} {e.RemoteIPAddress} {e.Gateway.InstanceID} {e.RequestID} {e.SourceUrl} {e.Code}");}public void Init(Gateway gateway, Assembly assembly){}public void LoadSetting(JToken setting){}public object SaveSetting(){return null;}}
代码很简单就是把转发完成的信息在控制台打印出来,LoadSetting
和SaveSetting
并没有实现,因为这个记录日志的功能并不需要配置;如果需要把内容写入数据库或一些服务那则需要实现这两个方法来加载和配置处理相关服务信息。
事件信息
接下来就看了下完成事件提供有那些信息了:
public struct EventRequestCompletedArgs{public Routes.UrlRoute UrlRoute { get; set; }public int Code { get; }public ServerAgent Server { get; set; }public long Time { get; set; }public bool UrlRewrite { get; set; }public string SourceBaseUrl { get; set; }public string SourceUrl { get; set; }public string SourcePath { get; set; }public long RequestID { get; set; }public string Method { get; set; }public IDictionary<string, string> Cookies { get; set; }public IDictionary<string, object> Data { get; set; }public string RemoteIPAddress { get; set; }public Gateway Gateway { get; set; }public string BaseUrl { get; set; }public string Url { get; set; }public string Path { get; set; }public string Host { get; set; }public IDictionary<string, string> Headers { get; set; }public string Error { get; set; }}
这个类提供了非常详细的信息,请求有那些信息,是否有经过url重写,来源于那个地址和转发到那个服务节点上都有详细记录。
使用插件
插件的引入非常简单,只需要通过组件Gateway.LoadPlugin
加载插件所在的程序集即可,代码如下:
gateway.LoadPlugin(typeof(Bumblebee.Configuration.Config).Assembly, typeof(Program).Assembly);
插件加载完成后还需要配置到网关中
gateway.Pluginer.SetRequested("custom_console_log");
通过以上配置,这个日志插件就会把所有代理请求都输出到控制台用。
获取示例详细代码: https://github.com/IKende/BeetleX-Samples/tree/master/Gateway.LogPlugin