TLOG日志框架springboot项目集成与扩展
创始人
2025-05-29 07:21:21
0

目录

前言

一、TLOG开源组件集成

1.maven引入

2. 日志文件logback-spring.xml修改

二、TLOG扩展开发自己的starter

1.项目层级

2.扩展点:1.打印请求url 2.打印响应日志

a.打印请求日志中的url实现RequestBodyAdvice 

b.打印响应日志实现ResponseBodyAdvice

 c.打印内容

三、多线程与kafka消息队列,方法中traceId的传递

1.线程池

2.kafka等消息队列



前言

随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难,那么今天所介绍的这款开源工具一定是一个不错的选择


一、TLOG开源组件集成

  1.maven引入

      com.yomahubtlog-all-spring-boot-starter${tlog.version}

2. 日志文件logback-spring.xml修改


${LOG_PATH}/${LOG_NAME}/log_error.log${LOG_PATH}/${LOG_NAME}/error/log-error-%d{yyyy-MM-dd}.%i.log10MBtrue%d{yyyy-MM-dd HH:mm:ss.SSS} %X{tl} [%thread] %-5level %logger{50} - %msg[%A][%R]%nerrorACCEPTDENY${LOG_PATH}/${LOG_NAME}/log_info.log${LOG_PATH}/${LOG_NAME}/info/log-info-%d{yyyy-MM-dd}.%i.log10MBtrue%d{yyyy-MM-dd HH:mm:ss.SSS} %X{tl} [%thread] %-5level %logger{50} - %msg[%A][%R]%ninfoACCEPTDENY${LOG_PATH}/${LOG_NAME}/log_all.log${LOG_PATH}/${LOG_NAME}/all/log-all-%d{yyyy-MM-dd}.%i.log10MBtrue%d{yyyy-MM-dd HH:mm:ss.SSS} %X{tl} [%thread] %-5level %logger{50} - %msg[%A][%R]%n%d{yyyy-MM-dd HH:mm:ss.SSS} %X{tl} [%thread] %-5level %logger{50} - %msg[%A][%R]%ndebug

二、TLOG扩展开发自己的starter

1.项目层级

2.扩展点:1.打印请求url 2.打印响应日志

a.打印请求日志中的url实现RequestBodyAdvice 


/*** 日志请求拦截* @author liangxi.zeng*/
@ControllerAdvice
@Component
public class LogRequestBodyAdvice implements RequestBodyAdvice {private static final Logger log = LoggerFactory.getLogger(LogRequestBodyAdvice.class);@Autowiredprivate LogProperties logProperties;@Autowiredprivate LogContext logContext;@Overridepublic boolean supports(MethodParameter methodParameter, Type type, Class> aClass) {return logProperties.getResponse().isEnabled() && !StringUtils.isEmpty(TLogContext.getTraceId());}@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class> aClass) throws IOException {return httpInputMessage;}@Overridepublic Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class> aClass) {try {if(logProperties.getRequest().isEnabled()) {String url = logContext.getUrlTl().get();if (StringUtils.isEmpty(url)) {url = LogUtil.getUrl(methodParameter);}if (!LogUtil.isIgnore(logProperties.getRequest().getIgnoreList(), url)) {HttpHeaders headers = httpInputMessage.getHeaders();if (headers != null) {List contentTypeList = headers.get(LogUtil.CONTENT_TYPE);if (!CollectionUtils.isEmpty(contentTypeList) &&!LogUtil.isUpload(contentTypeList.get(0))) {log.info("requestBody参数:{}", JSON.toJSONString(body));}}}}} catch (Exception e) {log.error("日志请求打印异常,不影响业务,吞并异常",e);}return body;}@Overridepublic Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class> aClass) {return body;}
}

b.打印响应日志实现ResponseBodyAdvice

/*** 脱敏日志响应拦截* @author liangxi.zeng*/
@ControllerAdvice
@Component
public class LogResponseBodyAdvice implements ResponseBodyAdvice {private static final Logger log = LoggerFactory.getLogger(LogResponseBodyAdvice.class);@Autowiredprivate LogProperties logProperties;@Autowiredprivate LogContext logContext;@Overridepublic boolean supports(MethodParameter returnType, Class> converterType) {return logProperties.getResponse().isEnabled() && !StringUtils.isEmpty(TLogContext.getTraceId());}/*** @param body* @param methodParameter* @param selectedContentType* @param selectedConverterType* @param request* @param response* @return*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType selectedContentType,Class> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {try {if(logProperties.getResponse().isEnabled()) {String url = logContext.getUrlTl().get();if (StringUtils.isEmpty(url)) {url = LogUtil.getUrl(methodParameter);}if (!LogUtil.isIgnore(logProperties.getResponse().getIgnoreList(), url)) {StringBuffer logBuffer = new StringBuffer("结束请求URL[{}]的调用,");StopWatch stopWatch = logContext.getInvokeTimeTL().get();if (Objects.nonNull(stopWatch)) {stopWatch.stop();logBuffer.append("耗时为:").append(stopWatch.getTime()).append("毫秒;");}if (LogUtil.isJson(selectedContentType.toString())) {logBuffer.append("响应内容为:").append(JSON.toJSONString(body));} else if (LogUtil.isUpload(selectedContentType.toString())) {logBuffer.append("文件上传,无需打印上传");} else {logBuffer.append("响应内容为:").append(body);}log.info(logBuffer.toString(), url);}}} catch (Exception e) {log.error("日志响应打印异常,不影响业务,吞并异常",e);}return body;}}
 

 c.打印内容

三、多线程与kafka消息队列,方法中traceId的传递

1.线程池

ExecutorService pool = Executors.newFixedThreadPool(5);
pool.submit(new TLogInheritableTask() {@Overridepublic void runTask() {log.info("我是异步线程日志");}
});

2.kafka等消息队列

TLogMqWrapBean tLogMqWrap = new TLogMqWrapBean(bizBean);
mqClient.send(tLogMqWrap);对于消费者端,你需要这么做://从mq里接受到tLogMqWrapBean
TLogMqConsumerProcessor.process(tLogMqWrapBean, new TLogMqRunner() {@Overridepublic void mqConsume(BizBean o) {//业务操作}
});

总结

TLog是一个轻量级的分布式日志标记追踪神器,10分钟即可接入,自动对日志打标签完成微服务的链路追踪。支持log4j,log4j2,logback三大日志框架,在我使用的时候,有些不满足业务需要,所以我自己在读了源码后进行了个性化定制,现在已经在项目中使用

相关内容

热门资讯

原创 中... 联合国的最新表态令人精神一振,这种明确态度其实本就顺理成章。台湾自古属于中国,这是铁一般的事实,中国...
花800元就能买自己的死亡证明... 花800元就能买到 本人的精神诊断报告和死亡证明? 近日,“假证定制”业务 在多个电商和社交平台 死...
智能平台支撑政策落地 实达集团... 11月17日,福建省发展和改革委员会网站发布《福建省数据管理局关于印发〈福建省数据流通交易管理办法(...
祥明智能:制定对外投资管理制度 祥明智能公告称,为规范公司及控股子公司对外投资、资产处置的程序及审批权限,建立有效控制机制保障资金运...
美国9月非农数据受政府关门扰动... 11月21日,中国银河证券发布研报对美国9月非农数据进行点评。研报指出,9月新增就业回到增长区间,失...
原创 高... 近日,随着日本政坛极端言论频频出现,尤其是汉奸石平的发声,再次引发了人们对中日关系未来走势的广泛关注...
日媒曝光:日本曾制定3套“夺岛... 据央视新闻报道,随着日本首相高市早苗涉台挑衅言论持续发酵,日本自卫队在靠近台海的岛屿加强军力部署的情...
舞蹈家黄豆豆获破格提拔,已任副... 今年4月拟破格提拔的舞蹈家黄豆豆,已有新消息。 澎湃新闻注意到,中国舞蹈家协会官网近日更新后显示,黄...
李霄鹏告别青岛海牛:战术调整与... 随着2023赛季的落幕,李霄鹏教练组已正式与青岛海牛球员告别,确认下赛季将不再继续执教。这一决定不仅...