dubbo的accessLog可以记录请求信息,配置如下:
<dubbo:protocol accesslog="true" />
然后配置一下日志文件就OK了,具体百度一下,这里只分析一下其中的原理。
accessLog的处理是在filter中,具体为AccessLogFilter,看下类的定义
@Activate(group = Constants.PROVIDER, value = Constants.ACCESS_LOG_KEY)
public class AccessLogFilter implements Filter {
//....
}
类上有Activate注解,其中有两个属性,一个是group,值为provider,代表该filter对provider有效;另外一个是value,值为accesslog,根据扩展机制,代表当url中有accesslog属性,那么该Filter就会被激活,加入到过滤器链中。
接下来,分析一下调用过程,Filter触发入口是invoke方法
public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {
try {
String accesslog = invoker.getUrl().getParameter(Constants.ACCESS_LOG_KEY);
if (ConfigUtils.isNotEmpty(accesslog)) {
//判断accesslog属性是否有值
//从上下文中获取调用信息,拼装成字符串
RpcContext context = RpcContext.getContext();
String serviceName = invoker.getInterface().getName();
String version = invoker.getUrl().getParameter(Constants.VERSION_KEY);
String group = invoke