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 &