or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

appenders.mdconfiguration.mdcore-logging.mdencoders-layouts.mdfilters.mdindex.mdnetwork-logging.mdservlet-integration.md

servlet-integration.mddocs/

0

# Servlet Integration

1

2

Web application integration components for servlet containers, providing lifecycle management, context initialization, and request-based logging enhancements for Java web applications.

3

4

## Capabilities

5

6

### Servlet Context Listener

7

8

Servlet container lifecycle integration for proper Logback initialization and cleanup.

9

10

```java { .api }

11

/**

12

* Servlet context listener for Logback lifecycle management

13

*/

14

public class LogbackServletContextListener implements ServletContextListener {

15

16

/**

17

* Initialize Logback when servlet context starts

18

*/

19

@Override

20

public void contextInitialized(ServletContextEvent sce);

21

22

/**

23

* Cleanup Logback when servlet context stops

24

*/

25

@Override

26

public void contextDestroyed(ServletContextEvent sce);

27

}

28

```

29

30

**Usage Examples:**

31

32

```xml

33

<!-- web.xml configuration -->

34

<web-app>

35

<listener>

36

<listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>

37

</listener>

38

</web-app>

39

```

40

41

```java

42

// Programmatic registration (Servlet 3.0+)

43

@WebListener

44

public class MyLogbackListener extends LogbackServletContextListener {

45

// Inherits all functionality

46

}

47

```

48

49

### Servlet Container Initializer

50

51

Automatic servlet container initialization using the SPI mechanism.

52

53

```java { .api }

54

/**

55

* Servlet container initializer for automatic Logback setup

56

*/

57

@HandlesTypes({})

58

public class LogbackServletContainerInitializer implements ServletContainerInitializer {

59

60

/**

61

* Automatically called by servlet container during startup

62

*/

63

@Override

64

public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;

65

}

66

```

67

68

This initializer is automatically discovered and invoked by Servlet 3.0+ containers through the `ServiceLoader` mechanism, requiring no manual configuration.

69

70

### Context Selectors for Web Applications

71

72

Specialized context selectors for multi-webapp environments.

73

74

```java { .api }

75

/**

76

* Context detaching servlet context listener for proper cleanup

77

*/

78

public class ContextDetachingSCL implements ServletContextListener {

79

80

@Override

81

public void contextInitialized(ServletContextEvent sce);

82

83

@Override

84

public void contextDestroyed(ServletContextEvent sce);

85

}

86

87

/**

88

* Logger context filter for web applications

89

*/

90

public class LoggerContextFilter implements Filter {

91

92

@Override

93

public void init(FilterConfig filterConfig) throws ServletException;

94

95

@Override

96

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

97

throws IOException, ServletException;

98

99

@Override

100

public void destroy();

101

}

102

```

103

104

### Status Servlet

105

106

Web interface for viewing Logback status and configuration information.

107

108

```java { .api }

109

/**

110

* Servlet for viewing Logback status messages via web interface

111

*/

112

public class ViewStatusMessagesServlet extends HttpServlet {

113

private static final long serialVersionUID = 443878494348593337L;

114

115

@Override

116

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

117

throws ServletException, IOException;

118

119

@Override

120

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

121

throws ServletException, IOException;

122

}

123

```

124

125

**Usage Examples:**

126

127

```xml

128

<!-- web.xml servlet configuration -->

129

<servlet>

130

<servlet-name>ViewStatusMessages</servlet-name>

131

<servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>

132

</servlet>

133

<servlet-mapping>

134

<servlet-name>ViewStatusMessages</servlet-name>

135

<url-pattern>/logback-status</url-pattern>

136

</servlet-mapping>

137

```

138

139

### MDC Servlet Filter

140

141

Servlet filter for automatically populating MDC with request information.

142

143

```java { .api }

144

/**

145

* Servlet filter that populates MDC with request information

146

*/

147

public class MDCInsertingServletFilter implements Filter {

148

149

@Override

150

public void init(FilterConfig filterConfig) throws ServletException;

151

152

@Override

153

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

154

throws IOException, ServletException;

155

156

@Override

157

public void destroy();

158

}

159

```

160

161

This filter automatically adds the following keys to the MDC:

162

- `req.remoteHost` - Remote host address

163

- `req.userAgent` - User agent string

164

- `req.requestURI` - Request URI

165

- `req.queryString` - Query string

166

- `req.requestURL` - Full request URL

167

- `req.method` - HTTP method

168

- `req.xForwardedFor` - X-Forwarded-For header

169

170

**Usage Examples:**

171

172

```xml

173

<!-- web.xml filter configuration -->

174

<filter>

175

<filter-name>MDCInsertingFilter</filter-name>

176

<filter-class>ch.qos.logback.classic.helpers.MDCInsertingServletFilter</filter-class>

177

</filter>

178

<filter-mapping>

179

<filter-name>MDCInsertingFilter</filter-name>

180

<url-pattern>/*</url-pattern>

181

</filter-mapping>

182

```

183

184

```java

185

// Programmatic registration (Servlet 3.0+)

186

@WebFilter("/*")

187

public class CustomMDCFilter extends MDCInsertingServletFilter {

188

// Can override methods to customize behavior

189

}

190

```

191

192

### Context Configuration

193

194

Web application specific context configuration and initialization.

195

196

```java { .api }

197

/**

198

* Utility methods for web application context configuration

199

*/

200

public class WebLoggerContextUtils {

201

202

/**

203

* Get the logger context for a web application

204

*/

205

public static LoggerContext getLoggerContext(ServletContext servletContext);

206

207

/**

208

* Initialize logger context for a web application

209

*/

210

public static void initializeLoggerContext(ServletContext servletContext);

211

212

/**

213

* Destroy logger context for a web application

214

*/

215

public static void destroyLoggerContext(ServletContext servletContext);

216

}

217

```

218

219

## Configuration Examples

220

221

### Complete Web Application Setup

222

223

```xml

224

<!-- web.xml - Complete Logback servlet integration -->

225

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">

226

227

<!-- Context parameters for Logback configuration -->

228

<context-param>

229

<param-name>logbackConfigLocation</param-name>

230

<param-value>classpath:logback-web.xml</param-value>

231

</context-param>

232

233

<!-- Logback servlet context listener -->

234

<listener>

235

<listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>

236

</listener>

237

238

<!-- MDC inserting filter (must be first) -->

239

<filter>

240

<filter-name>MDCInsertingFilter</filter-name>

241

<filter-class>ch.qos.logback.classic.helpers.MDCInsertingServletFilter</filter-class>

242

</filter>

243

<filter-mapping>

244

<filter-name>MDCInsertingFilter</filter-name>

245

<url-pattern>/*</url-pattern>

246

</filter-mapping>

247

248

<!-- Status viewing servlet -->

249

<servlet>

250

<servlet-name>ViewStatusMessages</servlet-name>

251

<servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>

252

</servlet>

253

<servlet-mapping>

254

<servlet-name>ViewStatusMessages</servlet-name>

255

<url-pattern>/admin/logback</url-pattern>

256

</servlet-mapping>

257

258

</web-app>

259

```

260

261

### Servlet 3.0+ Annotation-Based Configuration

262

263

```java

264

import ch.qos.logback.classic.servlet.LogbackServletContextListener;

265

import ch.qos.logback.classic.helpers.MDCInsertingServletFilter;

266

267

@WebListener

268

public class MyLogbackListener extends LogbackServletContextListener {

269

// Automatic registration and lifecycle management

270

}

271

272

@WebFilter(filterName = "mdcFilter", urlPatterns = {"/*"})

273

public class MyMDCFilter extends MDCInsertingServletFilter {

274

// Automatic MDC population for all requests

275

}

276

277

@WebServlet(name = "logbackStatus", urlPatterns = {"/admin/logback-status"})

278

public class MyStatusServlet extends ViewStatusMessagesServlet {

279

// Web interface for viewing Logback status

280

}

281

```

282

283

### Spring Boot Integration

284

285

```java

286

import org.springframework.boot.web.servlet.FilterRegistrationBean;

287

import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;

288

import org.springframework.context.annotation.Bean;

289

import org.springframework.context.annotation.Configuration;

290

291

@Configuration

292

public class LogbackWebConfig {

293

294

@Bean

295

public ServletListenerRegistrationBean<LogbackServletContextListener> logbackListener() {

296

ServletListenerRegistrationBean<LogbackServletContextListener> listener =

297

new ServletListenerRegistrationBean<>();

298

listener.setListener(new LogbackServletContextListener());

299

return listener;

300

}

301

302

@Bean

303

public FilterRegistrationBean<MDCInsertingServletFilter> mdcFilter() {

304

FilterRegistrationBean<MDCInsertingServletFilter> filter =

305

new FilterRegistrationBean<>();

306

filter.setFilter(new MDCInsertingServletFilter());

307

filter.addUrlPatterns("/*");

308

filter.setOrder(1); // Ensure it's first

309

return filter;

310

}

311

312

@Bean

313

public ServletRegistrationBean<ViewStatusMessagesServlet> statusServlet() {

314

ServletRegistrationBean<ViewStatusMessagesServlet> servlet =

315

new ServletRegistrationBean<>();

316

servlet.setServlet(new ViewStatusMessagesServlet());

317

servlet.addUrlMappings("/admin/logback-status");

318

return servlet;

319

}

320

}

321

```

322

323

### Web-specific Logback Configuration

324

325

```xml

326

<!-- logback-web.xml - Web application specific configuration -->

327

<configuration>

328

329

<!-- Use servlet context name in logs -->

330

<contextName>${CONTEXT_NAME}</contextName>

331

332

<!-- Web-specific appender with request information -->

333

<appender name="WEB_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

334

<file>${catalina.base}/logs/webapp.log</file>

335

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

336

<fileNamePattern>${catalina.base}/logs/webapp.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>

337

<maxFileSize>100MB</maxFileSize>

338

<maxHistory>30</maxHistory>

339

<totalSizeCap>1GB</totalSizeCap>

340

</rollingPolicy>

341

<encoder>

342

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{req.requestURI}] [%X{req.remoteHost}] - %msg%n</pattern>

343

</encoder>

344

</appender>

345

346

<!-- Separate appender for access logs -->

347

<appender name="ACCESS_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">

348

<file>${catalina.base}/logs/access.log</file>

349

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

350

<fileNamePattern>${catalina.base}/logs/access.%d{yyyy-MM-dd}.log.gz</fileNamePattern>

351

<maxHistory>90</maxHistory>

352

</rollingPolicy>

353

<encoder>

354

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{req.remoteHost} "%X{req.method} %X{req.requestURI} %X{req.queryString}" %X{req.userAgent}%n</pattern>

355

</encoder>

356

</appender>

357

358

<!-- Access logger -->

359

<logger name="access" level="INFO" additivity="false">

360

<appender-ref ref="ACCESS_LOG" />

361

</logger>

362

363

<!-- Root logger -->

364

<root level="INFO">

365

<appender-ref ref="WEB_FILE" />

366

</root>

367

368

</configuration>

369

```

370

371

### Usage in Web Application Code

372

373

```java

374

import org.slf4j.Logger;

375

import org.slf4j.LoggerFactory;

376

import org.slf4j.MDC;

377

378

@WebServlet("/user")

379

public class UserServlet extends HttpServlet {

380

private static final Logger logger = LoggerFactory.getLogger(UserServlet.class);

381

private static final Logger accessLogger = LoggerFactory.getLogger("access");

382

383

@Override

384

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

385

throws ServletException, IOException {

386

387

// MDC is automatically populated by MDCInsertingServletFilter

388

// Additional custom MDC values can be added

389

String userId = req.getParameter("userId");

390

if (userId != null) {

391

MDC.put("userId", userId);

392

}

393

394

try {

395

logger.info("Processing user request");

396

397

// Business logic here

398

processUserRequest(req, resp);

399

400

// Access log entry

401

accessLogger.info("Request processed successfully");

402

403

} catch (Exception e) {

404

logger.error("Error processing user request", e);

405

resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

406

} finally {

407

// Clean up custom MDC values

408

MDC.remove("userId");

409

// Note: Request-related MDC values are automatically cleaned up

410

}

411

}

412

413

private void processUserRequest(HttpServletRequest req, HttpServletResponse resp) {

414

// Implementation

415

}

416

}

417

```

418

419

### Context Separation in Multi-Webapp Environment

420

421

```java

422

// Custom context selector for webapp isolation

423

public class WebAppContextSelector extends ContextJNDISelector {

424

425

@Override

426

public LoggerContext getLoggerContext() {

427

// Return context specific to current web application

428

return getLoggerContext(getCurrentWebAppName());

429

}

430

431

private String getCurrentWebAppName() {

432

// Implementation to determine current webapp context

433

return Thread.currentThread().getContextClassLoader().toString();

434

}

435

}

436

437

// System property to enable custom selector

438

// -Dlogback.ContextSelector=com.example.WebAppContextSelector

439

```

440

441

This servlet integration provides:

442

443

1. **Automatic Lifecycle Management** - Proper initialization and cleanup of Logback contexts

444

2. **Request Context Logging** - Automatic population of request-related information in MDC

445

3. **Web Interface** - Status servlet for monitoring and debugging

446

4. **Multi-Webapp Support** - Context isolation in enterprise environments

447

5. **Container Integration** - Seamless integration with servlet containers like Tomcat, Jetty, etc.