or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

fluent-logging.mdindex.mdmarker-logging.mdmarker-management.mdmdc-support.mdstandard-logging.md

marker-management.mddocs/

0

# Marker Management

1

2

Comprehensive marker creation, hierarchy management, and lifecycle operations for organizing and categorizing log events. Markers provide metadata for advanced log filtering, routing, and contextual organization.

3

4

## Capabilities

5

6

### Marker Factory Operations

7

8

Core marker creation and management through the MarkerFactory.

9

10

```java { .api }

11

/**

12

* Get or create a marker with the specified name

13

* @param name The marker name (must not be null)

14

* @return Marker instance (cached for reuse)

15

* @throws IllegalArgumentException if name is null

16

*/

17

Marker getMarker(String name);

18

19

/**

20

* Check if a marker with the given name exists

21

* @param name The marker name to check

22

* @return true if marker exists in cache

23

*/

24

boolean exists(String name);

25

26

/**

27

* Attempt to detach a marker (not supported in Log4j)

28

* @param name The marker name

29

* @return false (Log4j does not support marker detachment)

30

*/

31

boolean detachMarker(String name);

32

33

/**

34

* Get a detached marker (returns attached marker with warning)

35

* @param name The marker name

36

* @return Marker instance (attached, detachment not supported)

37

*/

38

Marker getDetachedMarker(String name);

39

```

40

41

**Usage Examples:**

42

43

```java

44

import org.slf4j.Marker;

45

import org.slf4j.MarkerFactory;

46

47

// Create/retrieve markers

48

Marker webMarker = MarkerFactory.getMarker("WEB");

49

Marker securityMarker = MarkerFactory.getMarker("SECURITY");

50

Marker performanceMarker = MarkerFactory.getMarker("PERFORMANCE");

51

52

// Check existence

53

if (!MarkerFactory.exists("CUSTOM_MARKER")) {

54

Marker customMarker = MarkerFactory.getMarker("CUSTOM_MARKER");

55

}

56

57

// Marker instances are cached and reused

58

Marker web1 = MarkerFactory.getMarker("WEB");

59

Marker web2 = MarkerFactory.getMarker("WEB");

60

// web1 == web2 (same instance)

61

```

62

63

### Marker Properties

64

65

Access and manage marker properties and metadata.

66

67

```java { .api }

68

/**

69

* Get the marker name

70

* @return The marker name

71

*/

72

String getName();

73

74

/**

75

* Get hash code for the marker

76

* @return Hash code based on underlying Log4j marker

77

*/

78

int hashCode();

79

80

/**

81

* Check equality with another marker

82

* @param obj Object to compare with

83

* @return true if markers are equal

84

*/

85

boolean equals(Object obj);

86

```

87

88

**Usage Examples:**

89

90

```java

91

Marker marker = MarkerFactory.getMarker("DATABASE");

92

93

// Get marker properties

94

String name = marker.getName(); // "DATABASE"

95

int hash = marker.hashCode();

96

97

// Equality check

98

Marker other = MarkerFactory.getMarker("DATABASE");

99

boolean same = marker.equals(other); // true

100

101

// Use in collections

102

Set<Marker> markerSet = new HashSet<>();

103

markerSet.add(marker);

104

```

105

106

### Marker Hierarchy Management

107

108

Build and manage hierarchical marker relationships for complex categorization.

109

110

```java { .api }

111

/**

112

* Add a child marker to create parent-child relationship

113

* @param reference The child marker to add

114

* @throws IllegalArgumentException if reference is null

115

*/

116

void add(Marker reference);

117

118

/**

119

* Remove a child marker from this marker

120

* @param reference The child marker to remove

121

* @return true if the marker was removed, false if it wasn't present

122

*/

123

boolean remove(Marker reference);

124

125

/**

126

* Check if this marker has child markers

127

* @return true if marker has children

128

*/

129

boolean hasChildren();

130

131

/**

132

* Check if this marker has parent references

133

* @return true if marker has parent references

134

*/

135

boolean hasReferences();

136

137

/**

138

* Get iterator over direct child markers

139

* @return Iterator over child markers

140

*/

141

Iterator<Marker> iterator();

142

```

143

144

**Usage Examples:**

145

146

```java

147

// Create marker hierarchy

148

Marker rootMarker = MarkerFactory.getMarker("APPLICATION");

149

Marker webMarker = MarkerFactory.getMarker("WEB");

150

Marker apiMarker = MarkerFactory.getMarker("API");

151

Marker authMarker = MarkerFactory.getMarker("AUTH");

152

153

// Build hierarchy: APPLICATION -> WEB -> API -> AUTH

154

rootMarker.add(webMarker);

155

webMarker.add(apiMarker);

156

apiMarker.add(authMarker);

157

158

// Check hierarchy properties

159

boolean hasChildren = webMarker.hasChildren(); // true

160

boolean hasReferences = apiMarker.hasReferences(); // true

161

162

// Iterate over children

163

for (Iterator<Marker> it = webMarker.iterator(); it.hasNext(); ) {

164

Marker child = it.next();

165

logger.debug("Child marker: {}", child.getName());

166

}

167

168

// Remove from hierarchy

169

boolean removed = webMarker.remove(apiMarker); // true

170

```

171

172

### Marker Containment Checks

173

174

Check if markers contain other markers in their hierarchy.

175

176

```java { .api }

177

/**

178

* Check if this marker contains another marker (direct or hierarchical)

179

* @param other The marker to check for

180

* @return true if this marker contains the other marker

181

* @throws IllegalArgumentException if other is null

182

*/

183

boolean contains(Marker other);

184

185

/**

186

* Check if this marker contains a marker with the given name

187

* @param name The marker name to check for

188

* @return true if this marker contains a marker with the given name, false if name is null

189

*/

190

boolean contains(String name);

191

```

192

193

**Usage Examples:**

194

195

```java

196

// Create nested marker structure

197

Marker security = MarkerFactory.getMarker("SECURITY");

198

Marker auth = MarkerFactory.getMarker("AUTH");

199

Marker login = MarkerFactory.getMarker("LOGIN");

200

Marker logout = MarkerFactory.getMarker("LOGOUT");

201

202

// Build hierarchy

203

security.add(auth);

204

auth.add(login);

205

auth.add(logout);

206

207

// Containment checks

208

boolean containsAuth = security.contains(auth); // true (direct child)

209

boolean containsLogin = security.contains(login); // true (hierarchical)

210

boolean containsLogout = security.contains("LOGOUT"); // true (by name)

211

212

// Use for conditional logging

213

if (security.contains("LOGIN")) {

214

logger.info("Login-related security event detected");

215

}

216

```

217

218

## Advanced Marker Patterns

219

220

### Domain-Specific Marker Hierarchies

221

222

```java

223

// E-commerce application marker hierarchy

224

public class MarkerConstants {

225

// Root domain markers

226

public static final Marker ECOMMERCE = MarkerFactory.getMarker("ECOMMERCE");

227

public static final Marker SECURITY = MarkerFactory.getMarker("SECURITY");

228

public static final Marker PERFORMANCE = MarkerFactory.getMarker("PERFORMANCE");

229

230

// Business domain markers

231

public static final Marker ORDER = MarkerFactory.getMarker("ORDER");

232

public static final Marker PAYMENT = MarkerFactory.getMarker("PAYMENT");

233

public static final Marker INVENTORY = MarkerFactory.getMarker("INVENTORY");

234

public static final Marker USER = MarkerFactory.getMarker("USER");

235

236

// Operation markers

237

public static final Marker CREATE = MarkerFactory.getMarker("CREATE");

238

public static final Marker UPDATE = MarkerFactory.getMarker("UPDATE");

239

public static final Marker DELETE = MarkerFactory.getMarker("DELETE");

240

public static final Marker QUERY = MarkerFactory.getMarker("QUERY");

241

242

static {

243

// Build domain hierarchy

244

ECOMMERCE.add(ORDER);

245

ECOMMERCE.add(PAYMENT);

246

ECOMMERCE.add(INVENTORY);

247

ECOMMERCE.add(USER);

248

249

// Add operation markers to domains

250

ORDER.add(CREATE);

251

ORDER.add(UPDATE);

252

PAYMENT.add(CREATE);

253

USER.add(CREATE);

254

USER.add(UPDATE);

255

USER.add(DELETE);

256

257

// Cross-cutting concerns

258

SECURITY.add(USER);

259

PERFORMANCE.add(ORDER);

260

PERFORMANCE.add(PAYMENT);

261

}

262

}

263

```

264

265

### Dynamic Marker Creation

266

267

```java

268

// Runtime marker creation based on configuration

269

public class DynamicMarkerManager {

270

private final Map<String, Marker> customMarkers = new ConcurrentHashMap<>();

271

272

public Marker getOrCreateMarker(String category, String operation) {

273

String markerName = category.toUpperCase() + "_" + operation.toUpperCase();

274

275

return customMarkers.computeIfAbsent(markerName, name -> {

276

Marker marker = MarkerFactory.getMarker(name);

277

278

// Add to category hierarchy if exists

279

Marker categoryMarker = MarkerFactory.getMarker(category.toUpperCase());

280

categoryMarker.add(marker);

281

282

logger.debug("Created dynamic marker: {}", name);

283

return marker;

284

});

285

}

286

287

public void createBusinessMarkers(List<String> businessDomains) {

288

businessDomains.forEach(domain -> {

289

Marker domainMarker = MarkerFactory.getMarker(domain.toUpperCase());

290

291

// Add common operations to each domain

292

Arrays.asList("CREATE", "READ", "UPDATE", "DELETE").forEach(op -> {

293

Marker opMarker = MarkerFactory.getMarker(op);

294

domainMarker.add(opMarker);

295

});

296

});

297

}

298

}

299

```

300

301

### Marker-Based Filtering Strategies

302

303

```java

304

// Service with marker-based logging strategy

305

public class OrderService {

306

private static final Marker ORDER_PROCESSING = MarkerFactory.getMarker("ORDER_PROCESSING");

307

private static final Marker BUSINESS_CRITICAL = MarkerFactory.getMarker("BUSINESS_CRITICAL");

308

private static final Marker AUDIT_TRAIL = MarkerFactory.getMarker("AUDIT_TRAIL");

309

310

static {

311

// Create filtering hierarchy

312

BUSINESS_CRITICAL.add(ORDER_PROCESSING);

313

AUDIT_TRAIL.add(ORDER_PROCESSING);

314

}

315

316

public void processOrder(Order order) {

317

// Business critical event

318

logger.info(BUSINESS_CRITICAL, "Processing order {}", order.getId());

319

320

try {

321

validateOrder(order);

322

calculatePricing(order);

323

reserveInventory(order);

324

processPayment(order);

325

326

// Audit trail

327

logger.info(AUDIT_TRAIL, "Order {} completed successfully", order.getId());

328

329

} catch (ValidationException e) {

330

logger.warn(ORDER_PROCESSING, "Order validation failed: {}", order.getId(), e);

331

} catch (PaymentException e) {

332

logger.error(BUSINESS_CRITICAL, "Payment processing failed for order {}", order.getId(), e);

333

}

334

}

335

}

336

```

337

338

### Contextual Marker Usage

339

340

```java

341

// Request-scoped marker management

342

public class RequestContextMarkers {

343

private static final ThreadLocal<Marker> REQUEST_MARKER = new ThreadLocal<>();

344

345

public static void setRequestMarker(String requestType, String clientId) {

346

Marker baseMarker = MarkerFactory.getMarker("REQUEST");

347

Marker typeMarker = MarkerFactory.getMarker(requestType.toUpperCase());

348

Marker clientMarker = MarkerFactory.getMarker("CLIENT_" + clientId);

349

350

baseMarker.add(typeMarker);

351

baseMarker.add(clientMarker);

352

353

REQUEST_MARKER.set(baseMarker);

354

}

355

356

public static Marker getCurrentRequestMarker() {

357

return REQUEST_MARKER.get();

358

}

359

360

public static void clearRequestMarker() {

361

REQUEST_MARKER.remove();

362

}

363

364

// Usage in request processing

365

public void handleRequest(String requestType, String clientId) {

366

try {

367

setRequestMarker(requestType, clientId);

368

369

Marker requestMarker = getCurrentRequestMarker();

370

logger.info(requestMarker, "Processing request");

371

372

// All logging in this thread context includes the request marker

373

processBusinessLogic();

374

375

} finally {

376

clearRequestMarker();

377

}

378

}

379

}

380

```

381

382

### Marker Validation and Debugging

383

384

```java

385

// Marker hierarchy validation utilities

386

public class MarkerUtils {

387

388

public static void printMarkerHierarchy(Marker root, String indent) {

389

logger.debug("{}Marker: {}", indent, root.getName());

390

391

if (root.hasChildren()) {

392

for (Iterator<Marker> it = root.iterator(); it.hasNext(); ) {

393

printMarkerHierarchy(it.next(), indent + " ");

394

}

395

}

396

}

397

398

public static boolean validateMarkerHierarchy(Marker marker, Set<Marker> visited) {

399

if (visited.contains(marker)) {

400

logger.warn("Circular reference detected in marker hierarchy: {}", marker.getName());

401

return false;

402

}

403

404

visited.add(marker);

405

406

if (marker.hasChildren()) {

407

for (Iterator<Marker> it = marker.iterator(); it.hasNext(); ) {

408

if (!validateMarkerHierarchy(it.next(), new HashSet<>(visited))) {

409

return false;

410

}

411

}

412

}

413

414

return true;

415

}

416

417

public static List<String> getMarkerPath(Marker target, Marker root) {

418

List<String> path = new ArrayList<>();

419

if (findMarkerPath(target, root, path)) {

420

return path;

421

}

422

return Collections.emptyList();

423

}

424

425

private static boolean findMarkerPath(Marker target, Marker current, List<String> path) {

426

path.add(current.getName());

427

428

if (current.equals(target)) {

429

return true;

430

}

431

432

if (current.hasChildren()) {

433

for (Iterator<Marker> it = current.iterator(); it.hasNext(); ) {

434

if (findMarkerPath(target, it.next(), path)) {

435

return true;

436

}

437

}

438

}

439

440

path.remove(path.size() - 1);

441

return false;

442

}

443

}

444

```

445

446

## Integration with External Systems

447

448

### Marker Export for Monitoring

449

450

```java

451

// Export marker statistics for monitoring

452

public class MarkerMetrics {

453

private final Map<String, Integer> markerUsageCount = new ConcurrentHashMap<>();

454

455

public void recordMarkerUsage(Marker marker) {

456

String markerName = marker.getName();

457

markerUsageCount.merge(markerName, 1, Integer::sum);

458

459

// Record hierarchical usage

460

if (marker.hasChildren()) {

461

for (Iterator<Marker> it = marker.iterator(); it.hasNext(); ) {

462

recordMarkerUsage(it.next());

463

}

464

}

465

}

466

467

public Map<String, Integer> getMarkerUsageStatistics() {

468

return new HashMap<>(markerUsageCount);

469

}

470

}

471

```

472

473

This comprehensive marker management system provides flexible categorization and filtering capabilities for complex logging scenarios in enterprise applications.