全链路日志追踪过程:
nginx---> 网关--->服务A----服务.......
1、nginx相关配置
(1) nginx.conf
# HTTPS server
server {
listen 443 ssl http2;
server_name mp-sit.smartmidea.net;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_certificate smartmidea.net.cer;
ssl_certificate_key smartmidea.net.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include /apps/svr/nginx-1.17.5/conf/log_trace_proc.conf; //此文件是申城trace_id 、trace_path 具体内容如下
###########
set $trace_id $http_mc_trace_id;
set $trace_path $http_mc_trace_path;
set $curr_path "$msec:nginx:${server_addr}:${server_port}";
if ($trace_id != ''){
set $trace_path "${trace_path}${dollar}${curr_path}";
}
if ($trace_id = '') {
set $trace_id $request_id; //nginx版本要求(>1.11.0,下图为nginx官方关于$request_id申城唯一标识
set $trace_id "${trace_id}${dollar}${trace_id}"; // ${dollar}=$
set $trace_path "${curr_path}";
}
###########
include /apps/svr/nginx-1.17.5/conf/vhost.conf;
}
#日志格式及通用变量配置
log_format trace_log 'mp-nginx|$trace_id|$trace_path|$remote_addr|'
'$server_addr|$server_port|$http_traceId|$msec|$request_time|'
'$request_method|$request_uri|$status|$request_length|$body_bytes_sent|'
'$http_referer|$http_user_agent|$upstream_addr|$http_host';
access_log /apps/svr/nginx-1.17.5/logs/tracelog-mp-nginx.log trace_log;
}
(2) vhost.conf
location = /service {
proxy_redirect off;
proxy_ignore_client_abort on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header mc-trace-id $trace_id;
proxy_set_header mc-trace-path $trace_path; //mc-trace-id mc-trace-path 在头部转发到对应服务中;
(3) nginx日志位置:
2、服务A获取日志并打印到对应文件夹位置
(1) log4配置文件如下
服务A
/apps/logs/${modelName}
/apps/logs/${modelName}
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p -%X{requestId}- [%15.15t] %-40.40c{1.} : %m%n%xwEx
filePattern="${fileGz}/$${date:yyyy-MM}/${modelName}-info-%d{yyyy-MM-dd}-%i.log.gz">
//info日志ReportLogFilter 过滤掉
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.${modelName}-error.gz">
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.${modelName}-report.gz">
(2)ReportLogFilter 过滤器
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;
@Plugin(
name = "ReportLogFilter",
category = "Core",
elementType = "filter",
printObject = true
)
public final class ReportLogFilter extends AbstractFilter { // 参照ThresholdFilter
private ReportLogFilter(Result onMatch, Result onMismatch) {
super(onMatch, onMismatch);
}
@Override
public Result filter(Logger logger, Leve