or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

core-logging.mdenable-disable-control.mdindex.mdlog-writer-system.mdnamespace-management.mdutility-functions.md

namespace-management.mddocs/

0

# Namespace Management

1

2

Debug-lib style namespacing system for organizing logs by module, component, or feature area. Supports nested namespaces with colon separation and provides methods for namespace inspection and management.

3

4

## Capabilities

5

6

### Creating Namespaced Loggers

7

8

Create or retrieve loggers for specific namespaces to organize log output by logical boundaries.

9

10

```javascript { .api }

11

/**

12

* Creates or retrieves a namespaced logger

13

* @param {string} namespace - Namespace string using colon separation (e.g., "module:component")

14

* @returns {Logger} Logger instance for the specified namespace

15

* @throws {TypeError} If namespace contains invalid characters

16

*/

17

log.get(namespace);

18

```

19

20

**Usage Examples:**

21

22

```javascript

23

const log = require("log");

24

25

// Create single-level namespace

26

const dbLogger = log.get("database");

27

dbLogger.info("Connection established");

28

29

// Create nested namespace

30

const userServiceLogger = log.get("service:user");

31

userServiceLogger.error("User not found: %d", userId);

32

33

// Further nesting

34

const authLogger = userServiceLogger.get("auth");

35

authLogger.debug("Token validated for user %s", username);

36

37

// Equivalent to:

38

const authLogger2 = log.get("service:user:auth");

39

console.log(authLogger === authLogger2); // true - same instance returned

40

```

41

42

### Namespace Properties

43

44

Each logger exposes properties describing its namespace configuration.

45

46

```javascript { .api }

47

/**

48

* Full namespace string or null for root logger

49

* @type {string|null}

50

*/

51

log.namespace;

52

53

/**

54

* Array of namespace components

55

* @type {string[]}

56

*/

57

log.namespaceTokens;

58

```

59

60

**Usage Examples:**

61

62

```javascript

63

const log = require("log");

64

65

// Root logger properties

66

console.log(log.namespace); // null

67

console.log(log.namespaceTokens); // []

68

69

// Namespaced logger properties

70

const nsLogger = log.get("service:user:auth");

71

console.log(nsLogger.namespace); // "service:user:auth"

72

console.log(nsLogger.namespaceTokens); // ["service", "user", "auth"]

73

74

// Single namespace

75

const dbLogger = log.get("database");

76

console.log(dbLogger.namespace); // "database"

77

console.log(dbLogger.namespaceTokens); // ["database"]

78

```

79

80

### Namespace Validation

81

82

Namespace strings must follow specific rules for valid tokens.

83

84

```javascript { .api }

85

/**

86

* Valid namespace tokens contain only: a-z, 0-9, hyphen (-)

87

* Multiple tokens separated by colon (:)

88

* Examples of valid namespaces:

89

* - "app"

90

* - "user-service"

91

* - "api:v1:users"

92

* - "db:connection:pool"

93

*

94

* Invalid examples:

95

* - "User" (uppercase not allowed)

96

* - "api_v1" (underscore not allowed)

97

* - "test::double" (empty token not allowed)

98

*/

99

```

100

101

**Validation Examples:**

102

103

```javascript

104

const log = require("log");

105

106

// Valid namespaces

107

log.get("app"); // ✓ Valid

108

log.get("user-service"); // ✓ Valid

109

log.get("api:v1:users"); // ✓ Valid

110

log.get("db:connection:pool"); // ✓ Valid

111

112

// Invalid namespaces (throw TypeError)

113

try {

114

log.get("User"); // ✗ Uppercase not allowed

115

} catch (e) {

116

console.log(e.message); // TypeError with validation details

117

}

118

119

try {

120

log.get("api_v1"); // ✗ Underscore not allowed

121

} catch (e) {

122

console.log(e.message);

123

}

124

```

125

126

### Namespace Inspection

127

128

Methods for checking namespace initialization and retrieving namespace loggers.

129

130

```javascript { .api }

131

/**

132

* Check if a namespace has been initialized (logger created)

133

* @param {string} namespace - Namespace string to check

134

* @returns {boolean} True if namespace logger exists

135

*/

136

log.isNamespaceInitialized(namespace);

137

138

/**

139

* Get all initialized namespace loggers for the current level

140

* @returns {Logger[]} Array of initialized namespace logger instances

141

*/

142

log.getAllInitializedNamespaces();

143

```

144

145

**Usage Examples:**

146

147

```javascript

148

const log = require("log");

149

150

// Check before creation

151

console.log(log.isNamespaceInitialized("myapp")); // false

152

153

// Create namespace logger

154

const appLogger = log.get("myapp");

155

156

// Check after creation

157

console.log(log.isNamespaceInitialized("myapp")); // true

158

159

// Nested namespace checking

160

console.log(log.isNamespaceInitialized("myapp:auth")); // false

161

const authLogger = log.get("myapp:auth");

162

console.log(log.isNamespaceInitialized("myapp:auth")); // true

163

164

// Get all initialized namespaces for current level

165

const namespaces = log.getAllInitializedNamespaces();

166

console.log(namespaces.map(logger => logger.namespace)); // ["myapp", "myapp:auth"]

167

168

// Different levels have separate namespace tracking

169

const errorLogger = log.error.get("service");

170

console.log(log.error.getAllInitializedNamespaces().length); // 1

171

console.log(log.info.getAllInitializedNamespaces().length); // Still 2

172

```

173

174

## Namespace Behavior

175

176

### Logger Instance Reuse

177

178

Namespace loggers are singletons - calling `get()` with the same namespace always returns the same instance.

179

180

```javascript

181

const log = require("log");

182

183

const logger1 = log.get("service");

184

const logger2 = log.get("service");

185

console.log(logger1 === logger2); // true - same instance

186

187

// Works across different access patterns

188

const logger3 = log.info.get("service");

189

console.log(logger1 === logger3); // true - same instance

190

```

191

192

### Level Inheritance

193

194

Namespaced loggers inherit all level methods from their parent logger.

195

196

```javascript

197

const log = require("log");

198

199

const appLogger = log.get("myapp");

200

201

// All level methods available

202

appLogger.error("Critical error in myapp");

203

appLogger.warning("Warning in myapp");

204

appLogger.info("Info from myapp");

205

appLogger.debug("Debug info from myapp");

206

207

// Level properties maintained

208

console.log(appLogger.level); // "info" (same as parent)

209

console.log(appLogger.levelIndex); // 3 (same as parent)

210

```

211

212

### Cross-Level Namespace Access

213

214

Each log level maintains its own namespace registry, but namespaces can be accessed across levels.

215

216

```javascript

217

const log = require("log");

218

219

// Create namespace in info level

220

const infoAppLogger = log.get("myapp");

221

222

// Access same namespace in error level

223

const errorAppLogger = log.error.get("myapp");

224

225

// Different instances but same namespace

226

console.log(infoAppLogger === errorAppLogger); // false

227

console.log(infoAppLogger.namespace === errorAppLogger.namespace); // true

228

console.log(infoAppLogger.level); // "info"

229

console.log(errorAppLogger.level); // "error"

230

```

231

232

## Namespace Usage Patterns

233

234

### Module-Based Organization

235

236

```javascript

237

// lib/database.js

238

const log = require("log").get("database");

239

240

log.info("Database module loaded");

241

242

function connect() {

243

const connLogger = log.get("connection");

244

connLogger.info("Attempting connection...");

245

}

246

247

// lib/api.js

248

const log = require("log").get("api");

249

250

log.info("API module loaded");

251

252

function handleRequest() {

253

const reqLogger = log.get("request");

254

reqLogger.debug("Processing request");

255

}

256

```

257

258

### Feature-Based Organization

259

260

```javascript

261

// Features organized by capability

262

const authLog = log.get("auth");

263

const userLog = log.get("user:management");

264

const paymentLog = log.get("payment:processing");

265

266

authLog.info("User authentication successful");

267

userLog.warning("User profile incomplete");

268

paymentLog.error("Payment processing failed");

269

```

270

271

### Hierarchical Organization

272

273

```javascript

274

// Service layer

275

const serviceLog = log.get("service");

276

277

// Individual services

278

const userServiceLog = serviceLog.get("user"); // "service:user"

279

const orderServiceLog = serviceLog.get("order"); // "service:order"

280

281

// Service components

282

const userAuthLog = userServiceLog.get("auth"); // "service:user:auth"

283

const userProfileLog = userServiceLog.get("profile"); // "service:user:profile"

284

```