blob: 38d7a1b33d8d91cc1121b5dcb82e89b447088831 [file] [log] [blame]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="prev" href="ipv6-configuration.html">
<link rel="next" href="../build-consumer/basics.html">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.19">
<title>Access Log配置 - Java Chassis 3 开发指南</title>
<link rel="stylesheet" href="../assets/stylesheets/main.66ac8b77.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#access-log" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../index.html" title="Java Chassis 3 开发指南" class="md-header__button md-logo" aria-label="Java Chassis 3 开发指南" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Java Chassis 3 开发指南
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Access Log配置
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../index.html" title="Java Chassis 3 开发指南" class="md-nav__button md-logo" aria-label="Java Chassis 3 开发指南" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
Java Chassis 3 开发指南
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../index.html" class="md-nav__link">
<span class="md-ellipsis">
概述
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../start/design.html" class="md-nav__link">
<span class="md-ellipsis">
Java Chassis设计参考
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../introduce3.x.x.html" class="md-nav__link">
<span class="md-ellipsis">
Java Chassis 3版本介绍
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
快速入门
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
快速入门
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../start/development-environment.html" class="md-nav__link">
<span class="md-ellipsis">
安装本地开发环境
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../start/first-sample.html" class="md-nav__link">
<span class="md-ellipsis">
开发第一个微服务应用
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/application-bmi.html" class="md-nav__link">
<span class="md-ellipsis">
BMI应用-使用服务治理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/application-porter.html" class="md-nav__link">
<span class="md-ellipsis">
PORTER应用-典型开发场景
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="definition/service-definition.html" class="md-nav__link">
<span class="md-ellipsis">
微服务定义
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Spring Boot集成Java Chassis
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Spring Boot集成Java Chassis
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../spring-boot/introduction.html" class="md-nav__link">
<span class="md-ellipsis">
Spring Boot集成Java Chassis介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../spring-boot/diff-spring-mvc.html" class="md-nav__link">
<span class="md-ellipsis">
与Spring Web MVC开发习惯的差异
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
开发服务提供者
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
开发服务提供者
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="basics.html" class="md-nav__link">
<span class="md-ellipsis">
基础概念
</span>
</a>
</li>
<li class="md-nav__item">
<a href="http-mapping.html" class="md-nav__link">
<span class="md-ellipsis">
HTTP参数映射参考
</span>
</a>
</li>
<li class="md-nav__item">
<a href="jaxrs.html" class="md-nav__link">
<span class="md-ellipsis">
用JAX-RS开发微服务
</span>
</a>
</li>
<li class="md-nav__item">
<a href="springmvc.html" class="md-nav__link">
<span class="md-ellipsis">
用SpringMVC开发微服务
</span>
</a>
</li>
<li class="md-nav__item">
<a href="transparent-rpc.html" class="md-nav__link">
<span class="md-ellipsis">
用透明RPC开发微服务
</span>
</a>
</li>
<li class="md-nav__item">
<a href="use-interface.html" class="md-nav__link">
<span class="md-ellipsis">
只发布interface的方法为服务接口
</span>
</a>
</li>
<li class="md-nav__item">
<a href="reactive.html" class="md-nav__link">
<span class="md-ellipsis">
异步处理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="context-param.html" class="md-nav__link">
<span class="md-ellipsis">
使用 Context 参数
</span>
</a>
</li>
<li class="md-nav__item">
<a href="multi-code.html" class="md-nav__link">
<span class="md-ellipsis">
多个返回值和错误码
</span>
</a>
</li>
<li class="md-nav__item">
<a href="swagger-annotation.html" class="md-nav__link">
<span class="md-ellipsis">
使用Swagger注解
</span>
</a>
</li>
<li class="md-nav__item">
<a href="interface-constraints.html" class="md-nav__link">
<span class="md-ellipsis">
接口定义和数据类型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="listen-address-and-publish-address.html" class="md-nav__link">
<span class="md-ellipsis">
服务监听地址和发布地址
</span>
</a>
</li>
<li class="md-nav__item">
<a href="thread-pool.html" class="md-nav__link">
<span class="md-ellipsis">
线程池
</span>
</a>
</li>
<li class="md-nav__item">
<a href="event-listener.html" class="md-nav__link">
<span class="md-ellipsis">
服务启动事件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="parameter-validator.html" class="md-nav__link">
<span class="md-ellipsis">
参数效验
</span>
</a>
</li>
<li class="md-nav__item">
<a href="bootup.html" class="md-nav__link">
<span class="md-ellipsis">
程序启动逻辑
</span>
</a>
</li>
<li class="md-nav__item">
<a href="ipv6-configuration.html" class="md-nav__link">
<span class="md-ellipsis">
IPV6配置和使用
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Access Log配置
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="access-log-configuration.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Access Log配置
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
概念阐述
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
场景描述
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
配置说明
</span>
</a>
<nav class="md-nav" aria-label="配置说明">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#access-log-request-log" class="md-nav__link">
<span class="md-ellipsis">
启用 Access Log &amp; Request Log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
日志格式配置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
日志输出文件配置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-log-request-log_1" class="md-nav__link">
<span class="md-ellipsis">
自定义扩展 Access Log &amp; Request Log
</span>
</a>
<nav class="md-nav" aria-label="自定义扩展 Access Log & Request Log">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
相关类说明
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#accesslogitemmeta" class="md-nav__link">
<span class="md-ellipsis">
AccessLogItemMeta 的匹配规则
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
示例说明
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
开发服务消费者
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
开发服务消费者
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../build-consumer/basics.html" class="md-nav__link">
<span class="md-ellipsis">
基础概念
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../build-consumer/using-resttemplate.html" class="md-nav__link">
<span class="md-ellipsis">
Restful风格 - 使用 RestOperations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../build-consumer/develop-consumer-using-rpc.html" class="md-nav__link">
<span class="md-ellipsis">
RPC风格
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../build-consumer/invoker.html" class="md-nav__link">
<span class="md-ellipsis">
泛化调用
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../build-consumer/3rd-party-service-invoke.html" class="md-nav__link">
<span class="md-ellipsis">
调用第三方REST服务
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
定制请求处理流程
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
定制请求处理流程
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../references-handlers/intruduction.html" class="md-nav__link">
<span class="md-ellipsis">
处理链介绍
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
<span class="md-ellipsis">
通用功能开发
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
通用功能开发
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../general-development/metrics.html" class="md-nav__link">
<span class="md-ellipsis">
应用性能监控
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/microservice-invocation-chain.html" class="md-nav__link">
<span class="md-ellipsis">
微服务调用链
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/customized-tracing.html" class="md-nav__link">
<span class="md-ellipsis">
自定义调用链打点
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/local-develop-test.html" class="md-nav__link">
<span class="md-ellipsis">
本地开发和测试
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/upload-download.html" class="md-nav__link">
<span class="md-ellipsis">
文件上传下载
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/reactive.html" class="md-nav__link">
<span class="md-ellipsis">
Reactive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/dnsconfig.html" class="md-nav__link">
<span class="md-ellipsis">
DNS自定义配置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/proxy.html" class="md-nav__link">
<span class="md-ellipsis">
代理设置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/report-framework-version.html" class="md-nav__link">
<span class="md-ellipsis">
框架上报版本号
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/cross-app-invocation.html" class="md-nav__link">
<span class="md-ellipsis">
跨应用调用
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/secret-field.html" class="md-nav__link">
<span class="md-ellipsis">
定制序列化和反序列化方法
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/context.html" class="md-nav__link">
<span class="md-ellipsis">
使用Context传递控制消息
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/produceprocess.html" class="md-nav__link">
<span class="md-ellipsis">
返回值序列化扩展
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/CORS.html" class="md-nav__link">
<span class="md-ellipsis">
跨域资源共享(CORS)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/AlarmEvent.html" class="md-nav__link">
<span class="md-ellipsis">
获取熔断与实例隔离告警事件信息
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/shutdown.html" class="md-nav__link">
<span class="md-ellipsis">
优雅停机
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/error-handling.html" class="md-nav__link">
<span class="md-ellipsis">
异常处理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/multienvironment.html" class="md-nav__link">
<span class="md-ellipsis">
微服务实例间多环境隔离
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/thread-model.html" class="md-nav__link">
<span class="md-ellipsis">
线程模型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../general-development/config-logs.html" class="md-nav__link">
<span class="md-ellipsis">
配置日志
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
<span class="md-ellipsis">
多样化的通信协议功能
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
多样化的通信协议功能
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../transports/introduction.html" class="md-nav__link">
<span class="md-ellipsis">
多协议介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/rest-over-vertx.html" class="md-nav__link">
<span class="md-ellipsis">
REST over HTTP(Vert.x)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/http2.html" class="md-nav__link">
<span class="md-ellipsis">
REST over HTTP2(Vert.x)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/rest-over-servlet-embedded.html" class="md-nav__link">
<span class="md-ellipsis">
REST over Servlet(Spring Boot Embedded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/rest-over-servlet.html" class="md-nav__link">
<span class="md-ellipsis">
REST over Servlet(WAR)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/highway-rpc.html" class="md-nav__link">
<span class="md-ellipsis">
Highway
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
<span class="md-ellipsis">
多样化的服务注册与发现功能
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
多样化的服务注册与发现功能
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../registry/introduction.html" class="md-nav__link">
<span class="md-ellipsis">
注册发现介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../registry/service-center.html" class="md-nav__link">
<span class="md-ellipsis">
使用Service Center
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../registry/nacos.html" class="md-nav__link">
<span class="md-ellipsis">
使用Nacos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../registry/zookeeper.html" class="md-nav__link">
<span class="md-ellipsis">
使用ZooKeeper
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../registry/local-registry.html" class="md-nav__link">
<span class="md-ellipsis">
本地注册发现
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../registry/distributed.html" class="md-nav__link">
<span class="md-ellipsis">
去中心化注册发现
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_13" >
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
<span class="md-ellipsis">
多样化的配置管理功能
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
多样化的配置管理功能
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/general-config.html" class="md-nav__link">
<span class="md-ellipsis">
服务配置介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/read-config.html" class="md-nav__link">
<span class="md-ellipsis">
在程序中读取配置信息
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/kie.html" class="md-nav__link">
<span class="md-ellipsis">
使用Kie
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/nacos.html" class="md-nav__link">
<span class="md-ellipsis">
使用Nacos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/zookeeper.html" class="md-nav__link">
<span class="md-ellipsis">
使用Zookeeper
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/apollo.html" class="md-nav__link">
<span class="md-ellipsis">
使用Apollo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/cse1.html" class="md-nav__link">
<span class="md-ellipsis">
使用CSE1.0配置中心
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" >
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-ellipsis">
服务治理功能参考
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
服务治理功能参考
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../references-handlers/rule-governance.html" class="md-nav__link">
<span class="md-ellipsis">
流量特征治理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/governance-best-practise.html" class="md-nav__link">
<span class="md-ellipsis">
流量特征治理最佳实践
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/loadbalance.html" class="md-nav__link">
<span class="md-ellipsis">
负载均衡
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/ratelimit.html" class="md-nav__link">
<span class="md-ellipsis">
限流
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/router.html" class="md-nav__link">
<span class="md-ellipsis">
灰度发布
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/fault-injection.html" class="md-nav__link">
<span class="md-ellipsis">
故障注入
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../references-handlers/fail-retry.html" class="md-nav__link">
<span class="md-ellipsis">
快速失败和重试
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_15" >
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
<span class="md-ellipsis">
网关功能参考
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
网关功能参考
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../edge/open-service.html" class="md-nav__link">
<span class="md-ellipsis">
介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../edge/by-servicecomb-sdk.html" class="md-nav__link">
<span class="md-ellipsis">
使用 Edge Service 做网关
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../edge/zuul.html" class="md-nav__link">
<span class="md-ellipsis">
使用 `zuul` 和 `spring cloud gateway` 做网关
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../edge/nginx.html" class="md-nav__link">
<span class="md-ellipsis">
nginx 网关简单介绍
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16" >
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
<span class="md-ellipsis">
安全特性参考
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
安全特性参考
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../references-handlers/publickey.html" class="md-nav__link">
<span class="md-ellipsis">
公钥认证
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../security/tls.html" class="md-nav__link">
<span class="md-ellipsis">
使用TLS通信
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../security/shi-yong-rsa-ren-zheng.html" class="md-nav__link">
<span class="md-ellipsis">
使用RSA认证
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_17" >
<label class="md-nav__link" for="__nav_17" id="__nav_17_label" tabindex="0">
<span class="md-ellipsis">
专题文章
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_17_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_17">
<span class="md-nav__icon md-icon"></span>
专题文章
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../featured-topics/features.html" class="md-nav__link">
<span class="md-ellipsis">
特性介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/secrets.html" class="md-nav__link">
<span class="md-ellipsis">
技术解密
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/upgrading.html" class="md-nav__link">
<span class="md-ellipsis">
升级指导
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/compatibility.html" class="md-nav__link">
<span class="md-ellipsis">
兼容问题和兼容性策略
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../featured-topics/performance.html" class="md-nav__link">
<span class="md-ellipsis">
性能问题分析和调优
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_18" >
<label class="md-nav__link" for="__nav_18" id="__nav_18_label" tabindex="0">
<span class="md-ellipsis">
常用配置项参考
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_18_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_18">
<span class="md-nav__icon md-icon"></span>
常用配置项参考
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config-reference/rest-transport-client.html" class="md-nav__link">
<span class="md-ellipsis">
REST Transport Client 配置项
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_19" >
<label class="md-nav__link" for="__nav_19" id="__nav_19_label" tabindex="0">
<span class="md-ellipsis">
常见问题
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_19_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_19">
<span class="md-nav__icon md-icon"></span>
常见问题
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../question-and-answer/faq.html" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../question-and-answer/question_answer.html" class="md-nav__link">
<span class="md-ellipsis">
Q & A
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../question-and-answer/interface-compatibility.html" class="md-nav__link">
<span class="md-ellipsis">
微服务接口兼容常见问题
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
概念阐述
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
场景描述
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
配置说明
</span>
</a>
<nav class="md-nav" aria-label="配置说明">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#access-log-request-log" class="md-nav__link">
<span class="md-ellipsis">
启用 Access Log &amp; Request Log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
日志格式配置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
日志输出文件配置
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-log-request-log_1" class="md-nav__link">
<span class="md-ellipsis">
自定义扩展 Access Log &amp; Request Log
</span>
</a>
<nav class="md-nav" aria-label="自定义扩展 Access Log & Request Log">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
相关类说明
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#accesslogitemmeta" class="md-nav__link">
<span class="md-ellipsis">
AccessLogItemMeta 的匹配规则
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
示例说明
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="access-log">Access Log</h1>
<h2 id="_1">概念阐述</h2>
<p>ServiceComb 提供了基于 Vert.x 的 access log 和 request log 功能。当用户使用 REST over Vertx 通信方式时,可以通过简单的配置启用 access log 打印功能。当用户 client 端进行远程调用时,可以通过简单的配置启用 request log 打印功能</p>
<h2 id="_2">场景描述</h2>
<ol>
<li>
<p>用户在调试服务时可能需要开启 access log。在使用 REST over servlet 通信方式的情况下,可以使用 web容器 的 access log 功能;而在使用 REST over Vertx 通信方式的情况下,可以使用 ServiceComb 提供的一套 access log 功能。</p>
</li>
<li>
<p>用户想要跟踪,记录客户端远程调用信息, 可以开启 request log。request log 同时支持记录 rest 和 highway 远程调用方式。</p>
</li>
</ol>
<h2 id="_3">配置说明</h2>
<h3 id="access-log-request-log">启用 Access Log &amp; Request Log</h3>
<p>用户需要在 microservice.yaml 文件中增加配置以启用 access log 和 request log,配置示例如下:</p>
<pre><code class="language-yaml">servicecomb:
accesslog:
## server 端 启用access log
enabled: true
## server 端 自定义 access log 日志格式
pattern: &quot;%h - - %t %r %s %B %D&quot;
request:
## client 端开启 request log
enabled: true
## client 端自定义 request log 日志格式
pattern: &quot;%h %SCB-transport - - %t %r %s %D&quot;
</code></pre>
<p><em><strong>Access log &amp; Request log 配置项说明</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">配置项</th>
<th style="text-align: left;">取值范围</th>
<th style="text-align: left;">默认值</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">servicecomb.accesslog.enabled</td>
<td style="text-align: left;">true/false</td>
<td style="text-align: left;"><strong>false</strong></td>
<td style="text-align: left;">如果为true则启用access log,否则不启用</td>
</tr>
<tr>
<td style="text-align: left;">servicecomb.accesslog.pattern</td>
<td style="text-align: left;">表示打印格式的字符串</td>
<td style="text-align: left;"><strong>"%h - - %t %r %s %B %D"</strong></td>
<td style="text-align: left;">配置项见_<strong>日志元素说明表</strong>_</td>
</tr>
<tr>
<td style="text-align: left;">servicecomb.accesslog.request.enabled</td>
<td style="text-align: left;">true/false</td>
<td style="text-align: left;"><strong>false</strong></td>
<td style="text-align: left;">如果为true则启用request log,否则不启用</td>
</tr>
<tr>
<td style="text-align: left;">servicecomb.accesslog.request.pattern</td>
<td style="text-align: left;">表示打印格式的字符串</td>
<td style="text-align: left;"><strong>"%h %SCB-transport - - %t %r %s %D"</strong></td>
<td style="text-align: left;">配置项见_<strong>日志元素说明表</strong>_</td>
</tr>
</tbody>
</table>
<h3 id="_4">日志格式配置</h3>
<p>目前可用的日志元素配置项见 <strong><em>日志元素说明表(Apache &amp; W3C)</em></strong><strong><em>日志元素说明表(ServiceComb)</em></strong></p>
<p><em><strong>日志元素说明表 (Apache &amp; W3C)</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">元素名称</th>
<th style="text-align: left;">Apache日志格式</th>
<th style="text-align: left;">W3C日志格式</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">HTTP method</td>
<td style="text-align: left;">%m</td>
<td style="text-align: left;">cs-method</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">HTTP status</td>
<td style="text-align: left;">%s</td>
<td style="text-align: left;">sc-status</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Duration in second</td>
<td style="text-align: left;">%T</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Duration in millisecond</td>
<td style="text-align: left;">%D</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Remote hostname</td>
<td style="text-align: left;">%h</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Local hostname</td>
<td style="text-align: left;">%v</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Local port</td>
<td style="text-align: left;">%p</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Size of response</td>
<td style="text-align: left;">%B</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">如果消息体长度为零则打印"0"</td>
</tr>
<tr>
<td style="text-align: left;">Size of response</td>
<td style="text-align: left;">%b</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">如果消息体长度为零则打印"-"</td>
</tr>
<tr>
<td style="text-align: left;">First line of request</td>
<td style="text-align: left;">%r</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">包含HTTP Method、Uri、Http版本三部分内容</td>
</tr>
<tr>
<td style="text-align: left;">URI path</td>
<td style="text-align: left;">%U</td>
<td style="text-align: left;">cs-uri-stem</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Query string</td>
<td style="text-align: left;">%q</td>
<td style="text-align: left;">cs-uri-query</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">URI path and query string</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">cs-uri</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Request protocol</td>
<td style="text-align: left;">%H</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">Datetime the request is received</td>
<td style="text-align: left;">%t</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">按照默认设置打印时间戳,格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT</td>
</tr>
<tr>
<td style="text-align: left;">Configurable datetime the request is received</td>
<td style="text-align: left;">%{PATTERN}t</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">按照指定的格式打印时间戳,语言为英文,时区为GMT</td>
</tr>
<tr>
<td style="text-align: left;">Configurable datetime the request is received</td>
<td style="text-align: left;">%{PATTERN&#124;TIMEZONE&#124;LOCALE}t</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。</td>
</tr>
<tr>
<td style="text-align: left;">Request header</td>
<td style="text-align: left;">%{VARNAME}i</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">如果没有找到指定的header,则打印"-"</td>
</tr>
<tr>
<td style="text-align: left;">Response header</td>
<td style="text-align: left;">%{VARNAME}o</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">如果没有找到指定的header,则打印"-"</td>
</tr>
<tr>
<td style="text-align: left;">Cookie</td>
<td style="text-align: left;">%{VARNAME}C</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">如果没有找到指定的cookie,则打印"-"</td>
</tr>
</tbody>
</table>
<p><em><strong>日志元素说明表(ServiceComb)</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Element</th>
<th style="text-align: left;">Placeholder</th>
<th style="text-align: left;">Comment</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">TraceId</td>
<td style="text-align: left;">%SCB-traceId</td>
<td style="text-align: left;">打印ServiceComb生成的trace id,找不到则打印"-"</td>
</tr>
<tr>
<td style="text-align: left;">Invocation Context</td>
<td style="text-align: left;">%{VARNAME}SCB-ctx</td>
<td style="text-align: left;">打印key为<code>VARNAME</code>的invocation context值,找不到则打印"-"</td>
</tr>
<tr>
<td style="text-align: left;">Transport Method</td>
<td style="text-align: left;">%SCB-transport</td>
<td style="text-align: left;">打印当前调用的 <strong>transport method</strong><code>rest</code> 或者 <code>highway</code></td>
</tr>
</tbody>
</table>
<p><em><strong>Access log 与 Request log 的日志元素对比</strong></em></p>
<table>
<thead>
<tr>
<th>元素名称</th>
<th>Apache&amp;W3C日志格式</th>
<th>access log</th>
<th>access log 说明</th>
<th>request log</th>
<th>request log说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP method</td>
<td>%m &amp; cs-method</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>HTTP status</td>
<td>%s &amp; sc-status</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Duration in second</td>
<td>%T</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Duration in millisecond</td>
<td>%D</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Remote hostname</td>
<td>%h</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Local hostname</td>
<td>%v</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Local port</td>
<td>%p</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Size of response</td>
<td>%B</td>
<td>support</td>
<td>如果消息体长度为零则打印"0"</td>
<td>unsupported</td>
<td>-</td>
</tr>
<tr>
<td>Size of response</td>
<td>%b</td>
<td>support</td>
<td>如果消息体长度为零则打印"-"</td>
<td>unsupported</td>
<td>-</td>
</tr>
<tr>
<td>First line of request</td>
<td>%r</td>
<td>support</td>
<td>包含HTTP Method、Uri、Http版本三部分内容</td>
<td>support</td>
<td>包含HTTP Method、Uri、Http版本三部分内容</td>
</tr>
<tr>
<td>URI path</td>
<td>%U &amp; cs-uri-stem</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Query string</td>
<td>%q &amp; cs-uri-query</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>URI path and query string</td>
<td>cs-uri</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Request protocol</td>
<td>%H</td>
<td>support</td>
<td>-</td>
<td>support</td>
<td>-</td>
</tr>
<tr>
<td>Datetime of the request</td>
<td>%t</td>
<td>support</td>
<td>收到请求的时间。默认格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT</td>
<td>support</td>
<td>发送请求的时间。默认格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT</td>
</tr>
<tr>
<td>Configurable datetime the request of the request</td>
<td>%{PATTERN}t</td>
<td>support</td>
<td>收到请求的时间。按照指定的格式打印时间戳,语言为英文,时区为GMT</td>
<td>support</td>
<td>发送请求的时间。按照指定的格式打印时间戳,语言为英文,时区为GMT</td>
</tr>
<tr>
<td>Configurable datetime the request of the request</td>
<td>%{PATTERN&#124;TIMEZONE&#124;LOCALE}t</td>
<td>support</td>
<td>收到请求的时间。按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。</td>
<td>support</td>
<td>发送请求的时间。按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。</td>
</tr>
<tr>
<td>Request header</td>
<td>%{VARNAME}i</td>
<td>support</td>
<td>如果没有找到指定的header,则打印"-"</td>
<td>support</td>
<td>如果没有找到指定的header,则打印"-"</td>
</tr>
<tr>
<td>Response header</td>
<td>%{VARNAME}o</td>
<td>support</td>
<td>如果没有找到指定的header,则打印"-"</td>
<td>support</td>
<td>如果没有找到指定的header,则打印"-"</td>
</tr>
<tr>
<td>Cookie</td>
<td>%{VARNAME}C</td>
<td>support</td>
<td>如果没有找到指定的cookie,则打印"-"</td>
<td>support</td>
<td>如果没有找到指定的cookie,则打印"-"</td>
</tr>
<tr>
<td>TraceId</td>
<td>%SCB-traceId</td>
<td>support</td>
<td>打印ServiceComb生成的trace id,找不到则打印"-"</td>
<td>support</td>
<td>打印ServiceComb生成的trace id,找不到则打印"-"</td>
</tr>
<tr>
<td>Invocation Context</td>
<td>%{VARNAME}SCB-ctx</td>
<td>support</td>
<td>打印key为<code>VARNAME</code>的invocation context值,找不到则打印"-"</td>
<td>support</td>
<td>打印key为<code>VARNAME</code>的invocation context值,找不到则打印"-"</td>
</tr>
<tr>
<td>transport method</td>
<td>%SCB-transport</td>
<td>unsupported</td>
<td>只支持 rest 形式调用</td>
<td>support</td>
<td>调用使用的transport method</td>
</tr>
</tbody>
</table>
<h3 id="_5">日志输出文件配置</h3>
<p>Access log &amp; Request log 的日志打印实现框架默认采用 Slf4j ,其中 logger 名称分别为 <code>accesslog</code><code>requestlog</code>, 可以结合应用使用的日志框架将日志输出到不同的文件中。</p>
<h3 id="access-log-request-log_1">自定义扩展 Access Log &amp; Request Log</h3>
<p>用户可以利用 ServiceComb 提供的 AccessLogItem 扩展机制,定制自己的 AccessLogItem, 我们把 Request Log 也当做一种 Access Log。</p>
<h4 id="_6">相关类说明</h4>
<ol>
<li><strong>AccessLogItem</strong></li>
</ol>
<pre><code class="language-java">public interface AccessLogItem&lt;T&gt; {
// 从Server端获取信息,打印 Access Log 日志
default void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
}
// 从Client 端获取信息, 打印 Request Log
default void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
}
}
</code></pre>
<blockquote>
<p><strong>AccessLogItem</strong> 的定义如上所示</p>
<ul>
<li>
<p><strong>Server 端</strong> 每收到一个请求,会触发一次 Access Log 日志打印。<strong>Client 端</strong> 每次对外远程调用结束,会触发一次 Request Log 日志打印。 </p>
</li>
<li>
<p>每次日志打印,SDK 都会遍历有效的 <code>AccessLogItem</code> ,调用对应的方法获取此 Item 生成的 Log片 段,并将全部片段拼接成一条 Log 打印到日志文件中。 </p>
</li>
</ul>
</blockquote>
<ol>
<li><strong>VertxRestAccessLogItemMeta</strong></li>
</ol>
<pre><code class="language-java"> // pattern占位符前缀
protected String prefix;
// pattern占位符后缀
protected String suffix;
// 优先级序号
protected int order;
// AccessLogItem构造器
protected AccessLogItemCreator&lt;RoutingContext&gt; accessLogItemCreator;
</code></pre>
<p><code>VertxRestAccessLogItemMeta</code> 包含如上属性,它定义了 ServiceComb 如何解析 pattern 字符串以获得特定的 AccessLogItem。</p>
<ul>
<li>
<p>如果用户想要定义一个占位符为 <code>%user-defined</code><code>AccessLogItem</code> ,则需要声明一个 <code>VertxRestAccessLogItemMeta</code> 的子类,设置 prefix="%user-defined",suffix=null,当 <code>AccessLogPatternParser</code> 解析到 "%user-defined" 时,从此 meta 类中取得 <code>AccessLogItemCreator</code> 创建对应的 <code>AccessLogItem</code><strong>注意</strong>:由于 "%user-defined" 占位符中没有变量部分,因此调用 <code>AccessLogItemCreator</code> 传入的配置参数为null。</p>
</li>
<li>
<p>如果用户想要定义一个占位符为 <code>%{VARNAME}user-defined</code><code>AccessLogItem</code>,则声明的 <code>VertxRestAccessLogItemMeta</code> 子类中,设置prefix="%{",suffix="}user-defined",当 <code>AccessLogPatternParser</code> 解析到 "%{VARNAME}user-defined"时,会截取出"VARNAME"作为配置参数传入<code>AccessLogItemCreator</code>,创建一个<code>AccessLogItem</code></p>
</li>
</ul>
<p><code>VertxRestAccessLogItemMeta</code> 有一个子类 <code>CompositeVertxRestAccessLogItemMeta</code>,当用户需要定义多个 AccessLogItem 时,可以将多个 <code>VertxRestAccessLogItemMeta</code> 聚合到 <code>CompositeVertxRestAccessLogItemMeta</code> 中。Parser 加载到类型为 <code>CompositeVertxRestAccessLogItemMeta</code> 的AccessLogItemMeta时,会调用其 <code>getAccessLogItemMetas()</code> 方法获得一组 AccessLogItemMeta。<code>VertxRestAccessLogItemMeta</code> 使用SPI机制加载,而<code>CompositeVertxRestAccessLogItemMeta</code>可以让用户只在SPI配置文件中配置一条记录就加载多条meta信息,给了用户更灵活的选择。</p>
<ol>
<li><strong>AccessLogItemCreator</strong></li>
</ol>
<pre><code class="language-java">public interface AccessLogItemCreator&lt;T&gt; {
// 接收配置值,返回一个AccessLogItem。如果AccessLogItem的占位符没有可变的配置值部分,则此方法会接收到null。
AccessLogItem&lt;T&gt; createItem(String config);
}
</code></pre>
<p>用户通过设置在自定义的 <code>VertxRestAccessLogItemMeta</code> 中的 <code>AccessLogItemCreator</code> 实例化自己的 <code>AccessLogItem</code>。由于这是一个函数式接口,当 <code>AccessLogItem</code> 的初始化方式较简单时,可以直接使用 Lambda表达式定义Creator,以简化开发。</p>
<h4 id="accesslogitemmeta">AccessLogItemMeta 的匹配规则</h4>
<p>AccessLogItemMeta 加载进 Parser 后,会进行一次排序。Parser 解析 pattern 串时会从前到后匹配 meta list,总的匹配规则如下:</p>
<ol>
<li>
<p>优先匹配高优先级的meta。</p>
</li>
<li>
<p>优先匹配有后缀的meta,当匹配上多个有后缀meta时,取前后缀相距最小的一个。</p>
</li>
<li>
<p>优先匹配占位符长的meta,例如有两个 meta,"%abc"和"%a",如果匹配中了"%abc"则直接返回,不再匹配"%a"。</p>
</li>
</ol>
<h4 id="_7">示例说明</h4>
<ol>
<li>扩展自定义 AccessLogItem</li>
</ol>
<p>首先用户需要 <code>AccessLogItem</code> 接口实现自己的 item:</p>
<pre><code class="language-java">public class UserDefinedAccessLogItem implements AccessLogItem&lt;RoutingContext&gt; {
private String config;
public UserDefinedAccessLogItem(String config) {
this.config = config;
}
@Override
public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
builder.append(&quot;user-defined--server-&quot;)
.append(accessLogEvent.getRoutingContext().response().getStatusCode())
.append(&quot;-&quot;)
.append(config);
}
@Override
public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
builder.append(&quot;user-server-defined-&quot;)
.append(clientLogEvent.getResponse().getStatus())
.append(&quot;-&quot;)
.append(config);
}
}
</code></pre>
<ol>
<li>定义 <strong>AccessLogItem</strong> 的 meta 类</li>
</ol>
<p>继承 <code>VertxRestAccessLogItemMeta</code><code>CompositeVertxRestAccessLogItemMeta</code> 类,定义AccessLogItem的前后缀等信息:</p>
<pre><code class="language-java">public class UserDefinedCompositeExtendedAccessLogItemMeta extends CompositeVertxRestAccessLogItemMeta {
private static final List&lt;VertxRestAccessLogItemMeta&gt; META_LIST = new ArrayList&lt;&gt;();
static {
META_LIST.add(new VertxRestAccessLogItemMeta(&quot;%{&quot;, &quot;}user-defined&quot;, UserDefinedAccessLogItem::new));
}
@Override
public List&lt;VertxRestAccessLogItemMeta&gt; getAccessLogItemMetas() {
return META_LIST;
}
}
</code></pre>
<ol>
<li>配置SPI加载文件</li>
</ol>
<p><code>resources/META-INF/services/</code> 目录下定义一个名为 "org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta" 的文件,将上一步中定义的meta类完整类名填写到该文件中,供Parser加载meta类。</p>
<ol>
<li>配置 Access Log 的 pattern</li>
</ol>
<pre><code class="language-yaml"># 服务端配置
servicecomb:
accesslog:
enabled: true ## 应用作为服务端,开启 Access log
pattern: &quot;%{param}user-defined&quot; ## Access log 日志格式
request:
enabled: true ## 应用作为客户端,开启 Request log
pattern: &quot;%{param}user-defined&quot; ## Request log 日志格式
</code></pre>
<p>以服务端为例, 运行服务触发Access Log打印,假设请求返回状态码是 200,则可以看到Access Log打印内容为 "<code>user-defined--server-200-param</code>"。</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": [], "search": "../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../assets/javascripts/bundle.dd8806f2.min.js"></script>
</body>
</html>