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 配置
-
- 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 >
-
- 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>
-
- 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 源代码修改 (如果只是配置客户端, 则不需要此步骤!)
-
- 在 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));
}
}
-
- 修改
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 &