pinpoint 添加 日志查询功能

1. 下载 pinpoint 插件

开启日志功能需要自己写一个插件 ,参考 https://pinpoint-apm.github.io/pinpoint/perrequestfeatureguide.html#3-expose-log-in-pinpoint-web
,插件完成后放到 pinpoint-agent/plugin 目录下。
修改 pinpoint-agent/profiles/${profile}/pinpoint.config,
${profile} 默认有两个, 如果不确定是哪一个, 那么直接全部修改。
将下面的 false 全部改为 true ,(展示的是已经修改的)

###########################################################
# log4j (guide url : https://github.com/naver/pinpoint/blob/master/doc/per-request_feature_guide.md)
###########################################################
profiler.log4j.logging.transactioninfo=true

###########################################################
# log4j2 (guide url : https://github.com/naver/pinpoint/blob/master/doc/per-request_feature_guide.md)
###########################################################
profiler.log4j2.logging.transactioninfo=true

###########################################################
# logback (guide url : https://github.com/naver/pinpoint/blob/master/doc/per-request_feature_guide.md)
###########################################################
profiler.logback.logging.transactioninfo=true

2. 配置日志 xml 格式

参考链接: https://pinpoint-apm.github.io/pinpoint/perrequestfeatureguide.html#3-expose-log-in-pinpoint-web

  • 注意: 不一定非要按照说明配置, 重要的日志格式是 TxId : %X{PtxId} , SpanId : %X{PspanId} , 添加上这些就好,位置不限, 其他随意, 该字符串主要是用来标识查询所用。

  • log4j, log4j2, logback 配置

    1. ex) log4j : log4j.xml
Before
<appender name = "console" class= "org.apache.log4j.ConsoleAppender" >
     <layout class = "org.apache.log4j.EnhancedPatternLayout">
          <param name = "ConversionPattern" value= "%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) %m%n" />
     </layout >
</appender >

After
<appender name = "console" class= "org.apache.log4j.ConsoleAppender" >
     <layout class = "org.apache.log4j.EnhancedPatternLayout">
          <param name = "ConversionPattern" value= "%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] %m%n" />
        </layout >
</appender >
    1. ex) log4j2 - log4j2.xml
Before
<appender>
     <console name="STDOUT" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) %m%n""/>
     </console>
<appender>

After
<appender>
     <console name="STDOUT" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] %m%n""/>
     </console>
<appender>
    1. ex) logback : logback.xml
Before
<appender name = "STDOUT" class= "ch.qos.logback.core.ConsoleAppender" >
     <layout class = "ch.qos.logback.classic.PatternLayout">
          <Pattern >%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern >
     </layout >
</appender >

After
<appender name = "STDOUT" class= "ch.qos.logback.core.ConsoleAppender" >
     <layout class = "ch.qos.logback.classic.PatternLayout">
          <Pattern >%d{HH:mm} %-5level %logger{36} - [TxId : %X{PtxId} , SpanId : %X{PspanId}] %msg%n</Pattern >
     </layout >
</appender >

3. 实现日志查看(这里用的 grafana loki 实现)

3.1 实现方式

  • 这里使用 grafana loki 实现, loki 是一个轻量级日志收集工具, 配合 promtail 使用。

3.2 pinpoint 源代码修改 (如果只是配置客户端, 则不需要此步骤!)

    1. 在 web 模块添加一个 controller
package com.navercorp.pinpoint.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 这里用的 grafana loki 实现
 * <br/>
 * description:  <br/>
 * author: wanghaiming <br/>
 * date: 2021/6/4 17:01 <br/>
 *
 * @author whmmm
 */
@RequestMapping("/logview")
@Controller
public class LogViewController {

    private static final String url = "http://xxx.com/xxx/xxxx/explore?orgId=1&left=["now-24h","now","Loki",{"exemplar":true,"expr":"{job=\"%s\"} |=\"TxId : %s , SpanId : %s\""}]";

    @RequestMapping(value = "")
    public void NeloLogForTransactionId(@RequestParam(value = "transactionId", required = true) String transactionId,
                                        @RequestParam(value = "spanId", required = false) String spanId,
                                        @RequestParam(value = "time", required = true) long time,
                                        HttpServletResponse response) {
		// %5E = ^ , 解析出 jobName, 加两个斜杠 , 转移, 否则会认为是 正则表达式
        String[] split = transactionId.split("\^");
        String jobName = split[0];

        String link = String.format(url, jobName, transactionId, spanId);

        try {
            response.sendRedirect(link);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        //System.out.println(String.format(url, "", transactionId, spanId));
    }

}

    1. 修改 src/main/resources/profiles/release/pinpoint-web.properties(如果你不确定, 连同 src/main/resources/profiles/local/pinpoint-web.properties 一并修改),修改后的内容如下
pinpoint.zookeeper.address={YOUR_RELEASE_ZOOKEEPER_ADDRESS}
log.enable= true
# 这里是你自定义的 controller 请求路径
log.page.url=logview
log.button.name= 查看日志

3.3 配置 promtail

配置好你的 promtail

  • 2-1) promtail-local-config.yaml
# 只是一个简单的配置, 如果需要更深入请自行百度, 欢迎讨论

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://xxxxxxx:3100/loki/api/v1/push

scrape_configs:
- job_name: develope-server
  static_configs:
  # 这是一个示例, 需要修改
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log
  # 示例 tomcat 日志
  - targets:
      - localhost
    labels:
      job: project-name  # 这个名称必须和你的 pinpoint-agent 中指定的 agent-id 一致 !!!!!!!!!!
      __path__: /usr/local/project-tomcat/logs/catalina.out # 要监听的日志路径
  • 2-2) 启动脚本
  • start-promtail.sh
# 这里我没有丢弃日志, 你可以选择丢弃日志以增加性能
nohup ./promtail-linux-amd64 -config.file=promtail-local-config.yaml > console.log &
原文地址:https://www.cnblogs.com/whm-blog/p/14850850.html