blob: 00adca87cf2bad682a556b62845b8ab1cfbe791c [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="../bootup/">
<link rel="next" href="../../build-consumer/common-configuration/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.19">
<title>Access Log Configuration - ServiceComb Java Chassis Developers Guide</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="#concepts" 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="../.." title="ServiceComb Java Chassis Developers Guide" class="md-header__button md-logo" aria-label="ServiceComb Java Chassis Developers Guide" 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">
ServiceComb Java Chassis Developers Guide
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Access Log Configuration
</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="../.." title="ServiceComb Java Chassis Developers Guide" class="md-nav__button md-logo" aria-label="ServiceComb Java Chassis Developers Guide" 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>
ServiceComb Java Chassis Developers Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../start/terminology/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../start/architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../start/development-environment/" class="md-nav__link">
<span class="md-ellipsis">
Development environment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../start/first-sample/" class="md-nav__link">
<span class="md-ellipsis">
Develop the first microservice
</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_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Development Service Provider
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Development Service Provider
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../definition/service-definition/" class="md-nav__link">
<span class="md-ellipsis">
Service definition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../define-contract/" class="md-nav__link">
<span class="md-ellipsis">
Service contract definition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../code-first/" class="md-nav__link">
<span class="md-ellipsis">
Implicit API definition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../swagger-annotation/" class="md-nav__link">
<span class="md-ellipsis">
Use Swagger annotations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../springmvc/" class="md-nav__link">
<span class="md-ellipsis">
Develop with SpringMVC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../jaxrs/" class="md-nav__link">
<span class="md-ellipsis">
Develop with JAX-RS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transparent-rpc/" class="md-nav__link">
<span class="md-ellipsis">
Develop with Transparent RPC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../interface-constraints/" class="md-nav__link">
<span class="md-ellipsis">
Interface definition and data type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../listen-address-and-publish-address/" class="md-nav__link">
<span class="md-ellipsis">
Service listening address and publishing address
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../thread-pool/" class="md-nav__link">
<span class="md-ellipsis">
Thread pool
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_11" >
<label class="md-nav__link" for="__nav_3_11" id="__nav_3_11_label" tabindex="0">
<span class="md-ellipsis">
Service Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_11">
<span class="md-nav__icon md-icon"></span>
Service Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../configuration/ratelimite-strategy/" class="md-nav__link">
<span class="md-ellipsis">
Rate Limiting Policy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../configuration/parameter-validator/" class="md-nav__link">
<span class="md-ellipsis">
Parameter Validator
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../bootup/" class="md-nav__link">
<span class="md-ellipsis">
Boot-up Process
</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 Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Access Log Configuration
</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="#concepts" class="md-nav__link">
<span class="md-ellipsis">
Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scenario" class="md-nav__link">
<span class="md-ellipsis">
Scenario
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
<nav class="md-nav" aria-label="Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enable-access-log" class="md-nav__link">
<span class="md-ellipsis">
Enable Access Log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#log-format-configuration" class="md-nav__link">
<span class="md-ellipsis">
Log format configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#output-file-configuration" class="md-nav__link">
<span class="md-ellipsis">
Output file configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switch-to-logback" class="md-nav__link">
<span class="md-ellipsis">
Switch to logback
</span>
</a>
<nav class="md-nav" aria-label="Switch to logback">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-remove-log4j-dependencies" class="md-nav__link">
<span class="md-ellipsis">
1. Remove Log4j dependencies
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-add-a-logback-dependency" class="md-nav__link">
<span class="md-ellipsis">
2. Add a logback dependency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-configure-the-logger-for-the-access-log-component" class="md-nav__link">
<span class="md-ellipsis">
3. Configure the logger for the access log component
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#extending-access-log" class="md-nav__link">
<span class="md-ellipsis">
Extending Access Log
</span>
</a>
<nav class="md-nav" aria-label="Extending Access Log">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#related-classes" class="md-nav__link">
<span class="md-ellipsis">
Related classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#matching-rules-of-accesslogitemmeta" class="md-nav__link">
<span class="md-ellipsis">
Matching rules of AccessLogItemMeta
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sample" class="md-nav__link">
<span class="md-ellipsis">
Sample
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#sample-code" class="md-nav__link">
<span class="md-ellipsis">
Sample code
</span>
</a>
<nav class="md-nav" aria-label="Sample code">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#configurations-in-microserviceyaml" class="md-nav__link">
<span class="md-ellipsis">
Configurations in microservice.yaml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configurations-in-log4jproperties" class="md-nav__link">
<span class="md-ellipsis">
Configurations in log4j.properties
</span>
</a>
</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_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Writing Service Consumer
</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>
Writing Service Consumer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../build-consumer/common-configuration/" class="md-nav__link">
<span class="md-ellipsis">
Consumer common configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/using-resttemplate/" class="md-nav__link">
<span class="md-ellipsis">
Using Rest Template
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/using-AsyncRestTemplate/" class="md-nav__link">
<span class="md-ellipsis">
Using AsyncRestTemplate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/develop-consumer-using-rpc/" class="md-nav__link">
<span class="md-ellipsis">
Using with RPC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/with-contract/" class="md-nav__link">
<span class="md-ellipsis">
Contract
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_6" >
<label class="md-nav__link" for="__nav_4_6" id="__nav_4_6_label" tabindex="0">
<span class="md-ellipsis">
Invoke control
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_6">
<span class="md-nav__icon md-icon"></span>
Invoke control
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../build-consumer/flow-control/" class="md-nav__link">
<span class="md-ellipsis">
Flow Control
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/fault-injection/" class="md-nav__link">
<span class="md-ellipsis">
Fault Injection
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../build-consumer/3rd-party-service-invoke/" class="md-nav__link">
<span class="md-ellipsis">
Invoke 3rd-party REST services
</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_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Transports
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Transports
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../transports/rest-over-servlet/" class="md-nav__link">
<span class="md-ellipsis">
REST over Servlet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../transports/rest-over-vertx/" class="md-nav__link">
<span class="md-ellipsis">
REST over Vertx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../transports/highway-rpc/" class="md-nav__link">
<span class="md-ellipsis">
Highway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../transports/http2/" class="md-nav__link">
<span class="md-ellipsis">
HTTP2
</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_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
General Development
</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>
General Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../general-development/visit-sc/" class="md-nav__link">
<span class="md-ellipsis">
Access Service Center
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/metrics/" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/microservice-invocation-chain/" class="md-nav__link">
<span class="md-ellipsis">
Microservice invocation chain
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/customized-tracing/" class="md-nav__link">
<span class="md-ellipsis">
Customized-Tracing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/local-develop-test/" class="md-nav__link">
<span class="md-ellipsis">
Local development and testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/http-filter/" class="md-nav__link">
<span class="md-ellipsis">
Http Filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/file-upload/" class="md-nav__link">
<span class="md-ellipsis">
File Uploading
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/file-download/" class="md-nav__link">
<span class="md-ellipsis">
File Downloading
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/reactive/" class="md-nav__link">
<span class="md-ellipsis">
Reactive Programing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/dnsconfig/" class="md-nav__link">
<span class="md-ellipsis">
DNS Custom Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/dai-li-she-zhi/" class="md-nav__link">
<span class="md-ellipsis">
Proxy Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/report-framework-version/" class="md-nav__link">
<span class="md-ellipsis">
Report framework version
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/cross-app-invocation/" class="md-nav__link">
<span class="md-ellipsis">
Cross-application invocation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/secret-field/" class="md-nav__link">
<span class="md-ellipsis">
Customized serialization and deserialization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/context/" class="md-nav__link">
<span class="md-ellipsis">
Using Context to pass control messages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/produceprocess/" class="md-nav__link">
<span class="md-ellipsis">
Return value serialization extension
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/CORS/" class="md-nav__link">
<span class="md-ellipsis">
CORS mechanism
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/AlarmEvent/" class="md-nav__link">
<span class="md-ellipsis">
Get fuse and instance isolation alarm event information
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/shutdown/" class="md-nav__link">
<span class="md-ellipsis">
Shutdown gracefully
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/error-handling/" class="md-nav__link">
<span class="md-ellipsis">
Handling exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/multienvironment/" class="md-nav__link">
<span class="md-ellipsis">
Multi-environment isolation between microservice instances
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../general-development/thread-model/" class="md-nav__link">
<span class="md-ellipsis">
Thread Model
</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_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Configuration
</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="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../config/general-config/" class="md-nav__link">
<span class="md-ellipsis">
General config
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../config/inject-config/" class="md-nav__link">
<span class="md-ellipsis">
Configuration injection
</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_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Service Capability Open
</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>
Service Capability Open
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../edge/open-service/" class="md-nav__link">
<span class="md-ellipsis">
Intruductions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../edge/by-servicecomb-sdk/" class="md-nav__link">
<span class="md-ellipsis">
Using Edge Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../edge/nginx/" class="md-nav__link">
<span class="md-ellipsis">
Using confd and Nginx as edge services
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../edge/zuul/" class="md-nav__link">
<span class="md-ellipsis">
Use zuul as edge services
</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">
Service Packing and Running
</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>
Service Packing and Running
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../packaging/standalone/" class="md-nav__link">
<span class="md-ellipsis">
Standalone mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../packaging/web-container/" class="md-nav__link">
<span class="md-ellipsis">
WEB container mode
</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">
Micro Service Security
</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>
Micro Service Security
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../security/tls/" class="md-nav__link">
<span class="md-ellipsis">
Using TLS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/rsa/" class="md-nav__link">
<span class="md-ellipsis">
Using RSA certification
</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">
Using java chassis in Spring Boot
</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>
Using java chassis in Spring Boot
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/using-java-chassis-in-spring-boot/" class="md-nav__link">
<span class="md-ellipsis">
Intruductions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/components-for-spring-boot/" class="md-nav__link">
<span class="md-ellipsis">
spring boot starter for java-chassis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/java-application/" class="md-nav__link">
<span class="md-ellipsis">
JAVA application development
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/web-application/" class="md-nav__link">
<span class="md-ellipsis">
Web development method development
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/diff-between-java-web/" class="md-nav__link">
<span class="md-ellipsis">
The difference between JAVA application method and Web development method
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../using-java-chassis-in-spring-boot/diff-spring-mvc/" class="md-nav__link">
<span class="md-ellipsis">
The difference in Spring MVC mode
</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">
Handlers reference
</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>
Handlers reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../references-handlers/intruduction/" class="md-nav__link">
<span class="md-ellipsis">
Intruductions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../references-handlers/loadbalance/" class="md-nav__link">
<span class="md-ellipsis">
Load Balancing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../references-handlers/publickey/" class="md-nav__link">
<span class="md-ellipsis">
Public key authentication
</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">
FAQ
</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>
FAQ
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../question-and-answer/question_answer/" class="md-nav__link">
<span class="md-ellipsis">
Q & A
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../question-and-answer/faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../question-and-answer/interface-compatibility/" class="md-nav__link">
<span class="md-ellipsis">
Micro Service Interface Compatibility FAQ
</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="#concepts" class="md-nav__link">
<span class="md-ellipsis">
Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scenario" class="md-nav__link">
<span class="md-ellipsis">
Scenario
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
<nav class="md-nav" aria-label="Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enable-access-log" class="md-nav__link">
<span class="md-ellipsis">
Enable Access Log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#log-format-configuration" class="md-nav__link">
<span class="md-ellipsis">
Log format configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#output-file-configuration" class="md-nav__link">
<span class="md-ellipsis">
Output file configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switch-to-logback" class="md-nav__link">
<span class="md-ellipsis">
Switch to logback
</span>
</a>
<nav class="md-nav" aria-label="Switch to logback">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-remove-log4j-dependencies" class="md-nav__link">
<span class="md-ellipsis">
1. Remove Log4j dependencies
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-add-a-logback-dependency" class="md-nav__link">
<span class="md-ellipsis">
2. Add a logback dependency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-configure-the-logger-for-the-access-log-component" class="md-nav__link">
<span class="md-ellipsis">
3. Configure the logger for the access log component
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#extending-access-log" class="md-nav__link">
<span class="md-ellipsis">
Extending Access Log
</span>
</a>
<nav class="md-nav" aria-label="Extending Access Log">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#related-classes" class="md-nav__link">
<span class="md-ellipsis">
Related classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#matching-rules-of-accesslogitemmeta" class="md-nav__link">
<span class="md-ellipsis">
Matching rules of AccessLogItemMeta
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sample" class="md-nav__link">
<span class="md-ellipsis">
Sample
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#sample-code" class="md-nav__link">
<span class="md-ellipsis">
Sample code
</span>
</a>
<nav class="md-nav" aria-label="Sample code">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#configurations-in-microserviceyaml" class="md-nav__link">
<span class="md-ellipsis">
Configurations in microservice.yaml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configurations-in-log4jproperties" class="md-nav__link">
<span class="md-ellipsis">
Configurations in log4j.properties
</span>
</a>
</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>Access Log Configuration</h1>
<h2 id="concepts">Concepts</h2>
<p>ServiceComb provides Vert.x based access log. When developing with REST over Vert.x , access log printing can be enabled through a simple configuration.</p>
<h2 id="scenario">Scenario</h2>
<p>The user may need the access log when debugging the application. When using REST over servlet, the web container provides the access log function; for REST over Vert.x, ServiceComb provides a set of access log functionalities.</p>
<h2 id="configuration">Configuration</h2>
<h3 id="enable-access-log">Enable Access Log</h3>
<p>Add the following configurations in the microservice.yaml file to enable access log:</p>
<pre><code class="language-yaml">servicecomb:
accesslog:
enabled: true ## Enable access log
</code></pre>
<p><em><strong>Access log Configuration Items</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Configuration Item</th>
<th style="text-align: left;">Values</th>
<th style="text-align: left;">Default Value</th>
<th style="text-align: left;">Description</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;">false</td>
<td style="text-align: left;">true to enabled access log</td>
</tr>
<tr>
<td style="text-align: left;">servicecomb.accesslog.pattern</td>
<td style="text-align: left;">the format of the log</td>
<td style="text-align: left;">"%h - - %t %r %s %B"</td>
<td style="text-align: left;">See <em><strong>log configuration items</strong></em> for more details</td>
</tr>
</tbody>
</table>
<blockquote>
<p><em><strong>Note</strong></em></p>
<ul>
<li>The 2 items are optional, if not configured, the default value will be applied.</li>
</ul>
</blockquote>
<h3 id="log-format-configuration">Log format configuration</h3>
<p>The currently available configuration items for log are describe in the following table <strong><em>Log configuration items(Apache &amp; W3C)</em></strong> and<strong><em>Log configuration items(ServiceComb)</em></strong></p>
<p><em><strong>Log configuration items (Apache &amp; W3C)</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Item</th>
<th style="text-align: left;">Apache log format</th>
<th style="text-align: left;">W3C log format</th>
<th style="text-align: left;">Description</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;">Print "0" if body size is 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;">Print "-" if body size is 0</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;">Include HTTP Method, Uri and HTTP version</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;">Print time stamp by the default configuration, the format is "EEE, dd MMM yyyy HH:mm:ss zzz", in English and GMT time zone</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;">Print time stamp by specified format, in English and GMT time zone</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;">Print time stamp by the specified format, language and time zone. The items between vertical bar can be empty(while the | should not be omitted)</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;">Print "-" if the specified request header is not found</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;">Print "-" if the specified response header is not found</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;">Print "-" if the specified cookie is not found</td>
</tr>
</tbody>
</table>
<p><em><strong>Log configuration items(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;">Print the trace id generated by ServiceComb, if the id is not found, print "-"</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;">Print the invocation context value whose key is <code>VARNAME</code>, if the key is not found, print "-"</td>
</tr>
</tbody>
</table>
<h3 id="output-file-configuration">Output file configuration</h3>
<p>The default log framework for Access log is Log4j which provides a default set of configurations for output files. Users can override these configurations in their own log4j.properties file. The configuration items for output files are as follows.</p>
<p><em><strong>Log file configuration items</strong></em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Item</th>
<th style="text-align: left;">Default Value</th>
<th style="text-align: left;">Description</th>
<th style="text-align: left;">Remarks</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">paas.logs.accesslog.dir</td>
<td style="text-align: left;">${paas.logs.dir}</td>
<td style="text-align: left;">The output path of the log file</td>
<td style="text-align: left;">The common logs will be outputted to the same path</td>
</tr>
<tr>
<td style="text-align: left;">paas.logs.accesslog.file</td>
<td style="text-align: left;">access.log</td>
<td style="text-align: left;">Name of the log file</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">log4j.appender.access.MaxBackupIndex</td>
<td style="text-align: left;">10</td>
<td style="text-align: left;">Max file numbers for log rotating</td>
<td style="text-align: left;">-</td>
</tr>
<tr>
<td style="text-align: left;">log4j.appender.access.MaxFileSize</td>
<td style="text-align: left;">20MB</td>
<td style="text-align: left;">Max size of log file</td>
<td style="text-align: left;">When log file reaches the max size, log rotating is triggered</td>
</tr>
<tr>
<td style="text-align: left;">.appender.access.logPermission</td>
<td style="text-align: left;">rw-------</td>
<td style="text-align: left;">Log file permissions</td>
<td style="text-align: left;">-</td>
</tr>
</tbody>
</table>
<blockquote>
<p><em><strong>Note</strong></em>
Since ServiceComb's log function relies only on the slf4j interface, users can select other log frameworks. For other frameworks, users need to configure the log file output options.</p>
</blockquote>
<h3 id="switch-to-logback">Switch to logback</h3>
<blockquote>
<p>For the project that uses logback, the log framework dependency should be changed from Log4j to logback with some extra configurations to make access log work.</p>
</blockquote>
<h4 id="1-remove-log4j-dependencies">1. Remove Log4j dependencies</h4>
<p>Before switching to logback, check the dependencies of the project and remove Log4j related dependencies. Run the maven command <code>dependency:tree</code> in the project, find the ServiceComb components that depend on Log4j, and add the following configuration to its <code>&lt;dependency&gt;</code>:</p>
<pre><code class="language-xml">&lt;exclusion&gt;
&lt;groupId&gt;org.slf4j&lt;/groupId&gt;
&lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
&lt;/exclusion&gt;
</code></pre>
<h4 id="2-add-a-logback-dependency">2. Add a logback dependency</h4>
<p>Add a dependency for the logback in the pom file:</p>
<pre><code class="language-xml">&lt;dependency&gt;
&lt;groupId&gt;org.slf4j&lt;/groupId&gt;
&lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
&lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
&lt;artifactId&gt;logback-core&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<h4 id="3-configure-the-logger-for-the-access-log-component">3. Configure the logger for the access log component</h4>
<p>Since the log component provided by ServiceComb obtains the logger named <code>accesslog</code> for log printing, the key to log framework switching is to provide a file called <code>accesslog</code> and configure the output file for it. The following is a sample configuration of the access log for logback. It only shows the configurations related to the access log. Other log configurations are omitted:</p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration&gt;
&lt;!-- Users can customize the appender by their requirement --&gt;
&lt;appender name=&quot;ACCESSLOG&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
&lt;file&gt;./logs/access.log&lt;/file&gt;
&lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
&lt;fileNamePattern&gt;./logs/access-%d{yyyy-MM-dd}.log&lt;/fileNamePattern&gt;
&lt;/rollingPolicy&gt;
&lt;!-- Note: the access log content is formatted in code, the pattern should only specify the message without extra format --&gt;
&lt;encoder&gt;
&lt;pattern&gt;%msg%n&lt;/pattern&gt;
&lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- Provide a logger named &quot;accesslog&quot; for log printing --&gt;
&lt;logger name=&quot;accesslog&quot; level=&quot;INFO&quot; additivity=&quot;false&quot;&gt;
&lt;appender-ref ref=&quot;ACCESSLOG&quot; /&gt;
&lt;/logger&gt;
&lt;/configuration&gt;
</code></pre>
<h3 id="extending-access-log">Extending Access Log</h3>
<p>Users can customize their AccessLogItem by ServiceComb's AccessLogItem extension mechanism.</p>
<h4 id="related-classes">Related classes</h4>
<ol>
<li><code>AccessLogItem</code></li>
</ol>
<pre><code class="language-java"> public interface AccessLogItem&lt;T&gt; {
/**
* Get specified content from accessLogParam, generate the access log and return
*/
String getFormattedItem(AccessLogParam&lt;T&gt; accessLogParam);
}
</code></pre>
<p>The definition of <code>AccessLogItem</code> is as shown above. When request triggers Access Log printing, ServiceComb's Access Log mechanism will traverse a valid <code>AccessLogItem</code>, call the <code>getFormattedItem</code> method to get the item's Access Log fragment, concatenate all the the fragments into an Access Log, and output it to the log file.</p>
<p>The parameter <code>AccessLogParam&lt;T&gt;</code> contains the request start time, the end time, and the request context of type <code>T</code>. In the REST over Vert.x communication mode, the type <code>T</code> is the <code>RoutingContext</code> of Vert.x.</p>
<ol>
<li><code>VertxRestAccessLogItemMeta</code></li>
</ol>
<pre><code class="language-java"> // pattern placeholder prefix
protected String prefix;
// pattern placeholder suffix
protected String suffix;
// order number of priority
protected int order;
// AccessLogItem constructor
protected AccessLogItemCreator&lt;RoutingContext&gt; accessLogItemCreator;
</code></pre>
<p>The <code>VertxRestAccessLogItemMeta</code> contains the properties listed above, it specifies how ServiceComb parse the pattern string to get specific AccessLogItem.</p>
<ul>
<li>
<p>To define a <code>AccessLogItem</code> with placeholder <code>%user-defined</code>, declare a subclass of <code>VertxRestAccessLogItemMeta</code>,set prefix="%user-defined", suffix=null, when <code>AccessLogPatternParser</code> parses the "%user-defined", it will fetch the <code>AccessLogItemCreator</code> from the meta class and create the corresponding <code>AccessLogItem</code>. <strong>Note:</strong> since there is not variable in placeholder "%user-defined", the call to <code>AccessLogItemCreator</code> passes the configuration parameter null。</p>
</li>
<li>
<p>To get a <code>AccessLogItem</code> with placeholder <code>%{VARNAME}user-defined</code>, declare a subclass of<code>VertxRestAccessLogItemMeta</code>, set prefix="%{", suffix="}user-defined". When <code>AccessLogPatternParser</code>parses "%{VARNAME}user-defined", it will extract the "VARNAME" as parameter to call <code>AccessLogItemCreator</code>, to create a <code>AccessLogItem</code>.</p>
</li>
</ul>
<p><code>VertxRestAccessLogItemMeta</code> has a subclass<code>CompositeVertxRestAccessLogItemMeta</code>. When user needs to define multiple AccessLogItems, multiple <code>VertxRestAccessLogItemMeta</code> can be aggregated into <code>CompositeVertxRestAccessLogItemMeta</code>. When Parser loads AccessLogItemMeta of type <code>CompositeVertxRestAccessLogItemMeta</code>, it calls the meta class's <code>getAccessLogItemMetas()</code> method to get a set of AccessLogItemMeta. <code>VertxRestAccessLogItemMeta</code> is loaded by the SPI mechanism, and <code>CompositeVertxRestAccessLogItemMeta</code> allows user to load multiple meta infos with on one record in the SPI configuration file, which provides great flexibility.</p>
<ol>
<li><code>AccessLogItemCreator</code></li>
</ol>
<pre><code class="language-java"> public interface AccessLogItemCreator&lt;T&gt; {
// Receive configuration values and return an AccessLogItem. The method receives a null if there is no variables in AccessLogItem placeholder
AccessLogItem&lt;T&gt; createItem(String config);
}
</code></pre>
<p>The user instantiates his AccessLogItem by setting the AccessLogItemCreator in the custom VertxRestAccessLogItemMeta. Since this is a functional interface, when the AccessLogItem is initialized in a simple way, you can directly define the Creator using a Lambda expression to simplify development.</p>
<h4 id="matching-rules-of-accesslogitemmeta">Matching rules of AccessLogItemMeta</h4>
<p>Once AccessLogItemMeta is loaded into the Parser, it will be sorted once. Parser will match the meta list from front to back when parsing the pattern string. The general matching rules are as follows:
1. Match metas with higher priority.
2. Match the meta with suffix first. When metas with multiple suffixes are matched, ~~take the one with the smallest suffix.~~
3. Match the meta with a longer placeholder, for example, there are two metas, "%abc" and "%a". If "%abc" is matched, it will return directly.</p>
<h4 id="sample">Sample</h4>
<ol>
<li>Extend AccessLogItem</li>
</ol>
<p>First, the user needs the AccessLogItem interface to implement their own 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 String getFormattedItem(AccessLogParam&lt;RoutingContext&gt; accessLogParam) {
// Here is the user's custom logic, user needs to take relevant data from AccessLogParam or other places, generate and return access log fragments
return &quot;user-defined-[&quot; + config + &quot;]-[&quot; + accessLogParam.getStartMillisecond() + &quot;]&quot;;
}
}
</code></pre>
<ol>
<li>Define AccessLogItem meta class</li>
</ol>
<p>Inherit the class <code>VertxRestAccessLogItemMeta</code> or <code>CompositeVertxRestAccessLogItemMeta</code>, define the prefix and suffix of the 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>Configure the SPI load file</li>
</ol>
<p>In the <code>resources/META-INF/services/</code> directory, create a file named "org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemMeta" and fill in the full class path of the meta class defined in the previous step. Parser will use this file to load the meta class.</p>
<ol>
<li>Configure Access Log pattern</li>
</ol>
<p>The configuration pattern in the microservice.yaml file is assumed to be "%{test-config}user-defined". The running service triggers the Access Log to print. If the request start time is 1, Access Log will print "user- Defined-[test-config]-[1]".</p>
<h2 id="sample-code">Sample code</h2>
<h3 id="configurations-in-microserviceyaml">Configurations in microservice.yaml</h3>
<pre><code class="language-yaml">## other configurations omitted
servicecomb:
accesslog:
enabled: true ## Enable access log
pattern: &quot;%h - - %t %r %s %B&quot; ## Custom log format
</code></pre>
<h3 id="configurations-in-log4jproperties">Configurations in log4j.properties</h3>
<pre><code class="language-properties"># access log configuration item
paas.logs.accesslog.dir=../logs/
paas.logs.accesslog.file=access.log
# access log File appender
log4j.appender.access.MaxBackupIndex=10
log4j.appender.access.MaxFileSize=20MB
log4j.appender.access.logPermission=rw-------
</code></pre>
</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>