표적
애플리케이션이 dubbo 인터페이스를 호출하거나 제공된 dubbo 인터페이스를 호출하면 인터페이스 요청의 입력 매개변수 정보, 서비스 이름, 메소드 이름 및 반환 값이 사용자 정의 필터를 통해 인쇄됩니다.
필터 구현
1. 사용자 정의 필터 구현 클래스
@Slf4j
@Activate(group = {
"provider", "consumer"})
public class DubboProviderLogFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Map<String, Object> map = new LinkedHashMap<>();
map.put("service", invocation.getTargetServiceUniqueName());
map.put("method", invocation.getMethodName());
map.put("params", getParams(invocation.getArguments(), invocation.getParameterTypes()));
Result result = null;
try {
result = invoker.invoke(invocation);
map.put("result", result.getValue());
log.info("dubbo_request_log={}", JSONObject.toJSONString(map));
return result;
} catch (Exception e) {
log.error("dubbo_request_catch_exception={}, e", JSONObject.toJSONString(map));
throw new RuntimeException(e);
}
}
private Map<String, Argument> getParams(Object[] argvs, Class<?>[] argts) {
Map<String, Argument> map = new LinkedHashMap<>();
int size = argvs.length;
try {
for (int i = 0; i < size; i++) {
map.put("param" + i, new Argument(JSONObject.toJSONString(argts[i]).replaceAll("\"", ""), argvs[i]));
}
} catch (Exception e) {
log.error("getParams_catch_exception=", e);
}
return map;
}
@Data
@AllArgsConstructor
private static class Argument {
private String type;
private Object value;
}
}
주석 @Activate
의 그룹 매개변수는 필터의 유효 범위를 지정하는 데 사용되며, 여기에 공급자와 소비자가 모두 추가되며, 그러면 애플리케이션이 자체적으로 제공하는 더보 인터페이스와 더보 인터페이스를 호출할 때 로그를 인쇄합니다.
2. 필터 구성
리소스 디렉터리에 파일을 만들고 META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
다음 내용을 작성합니다.
dubboRequestLog=com.yourapp.path.DubboProviderLogFilter
3. 필터를 효과적으로 만드세요
세 가지 방법이 있습니다
- 사용자 정의 필터 구현 클래스에서
@Activate
서비스 제공자 또는 소비자가 주석이 달린 그룹 매개변수를 통해 적용되는지 여부를 지정하거나 동시에 적용되도록 선택할 수 있습니다. - 서비스 제공자의 필터 속성에 지정됨
- xml 구성 파일에서 필터를 일률적으로 설정하거나
<dubbo:provider filter="dubboRequestLog"/>
,<dubbo:consumer filter="dubboRequestLog"/>
필터를 통해 사용할 필터를 구성하는데, 이는 모든 서비스 제공자 또는 서비스 소비자를 대상으로 합니다.