securenow 5.5.0 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,415 +1,411 @@
1
- # How to Use SecureNow Logging in Your App
2
-
3
- This guide is for developers who want to add the `securenow` package to their applications to enable logging to SecureNow or any OTLP-compatible backend.
4
-
5
- ---
6
-
7
- ## Installation
8
-
9
- ```bash
10
- npm install securenow
11
- ```
12
-
13
- ---
14
-
15
- ## Setup Steps
16
-
17
- ### Step 1: Configure Environment Variables
18
-
19
- Add these to your `.env` file or export them:
20
-
21
- ```bash
22
- # Required: Enable logging
23
- SECURENOW_LOGGING_ENABLED=1
24
-
25
- # Required: Your app name
26
- SECURENOW_APPID=my-app-name
27
-
28
- # Required: Your OTLP endpoint
29
- SECURENOW_INSTANCE=http://your-otlp-collector:4318
30
-
31
- # For managed OTLP / authentication (optional):
32
- # OTEL_EXPORTER_OTLP_HEADERS="x-api-key=your-key"
33
- ```
34
-
35
- ---
36
-
37
- ### Step 2: Choose Your Integration Method
38
-
39
- You have **three options** to integrate logging:
40
-
41
- #### **Option A: Automatic Console Instrumentation** (Recommended - Easiest)
42
-
43
- This automatically captures all `console.log()`, `console.info()`, `console.warn()`, and `console.error()` calls and sends them to your configured OTLP backend (for example SecureNow).
44
-
45
- **Add to your main application file:**
46
-
47
- ```javascript
48
- // At the very top of your app.js, index.js, server.js, or main.ts
49
- require('securenow/register');
50
- require('securenow/console-instrumentation');
51
-
52
- // Now use console normally - all logs go to your OTLP backend!
53
- console.log('Application started');
54
- console.error('An error occurred', { userId: 123, details: 'Something went wrong' });
55
- console.warn('Warning message');
56
- ```
57
-
58
- **Or using NODE_OPTIONS (no code changes needed):**
59
-
60
- ```bash
61
- NODE_OPTIONS="-r securenow/register -r securenow/console-instrumentation" node app.js
62
- ```
63
-
64
- ---
65
-
66
- #### **Option B: Direct Logger API**
67
-
68
- For more control over logging, use the OpenTelemetry logger API directly:
69
-
70
- ```javascript
71
- require('securenow/register');
72
- const { getLogger } = require('securenow/tracing');
73
-
74
- // Get a logger instance
75
- const logger = getLogger('my-service', '1.0.0');
76
-
77
- // Emit structured logs
78
- logger.emit({
79
- severityNumber: 9, // INFO level
80
- severityText: 'INFO',
81
- body: 'User logged in',
82
- attributes: {
83
- userId: 123,
84
- username: 'john',
85
- ip: '192.168.1.1',
86
- },
87
- });
88
- ```
89
-
90
- **Severity Levels:**
91
- - `5` = DEBUG
92
- - `9` = INFO
93
- - `13` = WARN
94
- - `17` = ERROR
95
-
96
- ---
97
-
98
- #### **Option C: Custom Logger Wrapper**
99
-
100
- Create your own logger wrapper for cleaner API:
101
-
102
- ```javascript
103
- // logger.js
104
- require('securenow/register');
105
- const { getLogger } = require('securenow/tracing');
106
-
107
- const logger = getLogger('app-logger', '1.0.0');
108
-
109
- const SeverityNumber = {
110
- DEBUG: 5,
111
- INFO: 9,
112
- WARN: 13,
113
- ERROR: 17,
114
- };
115
-
116
- function log(level, message, attributes = {}) {
117
- if (logger) {
118
- logger.emit({
119
- severityNumber: SeverityNumber[level],
120
- severityText: level,
121
- body: message,
122
- attributes,
123
- });
124
- }
125
- console.log(`[${level}] ${message}`, attributes);
126
- }
127
-
128
- module.exports = {
129
- debug: (msg, attrs) => log('DEBUG', msg, attrs),
130
- info: (msg, attrs) => log('INFO', msg, attrs),
131
- warn: (msg, attrs) => log('WARN', msg, attrs),
132
- error: (msg, attrs) => log('ERROR', msg, attrs),
133
- };
134
- ```
135
-
136
- **Usage:**
137
-
138
- ```javascript
139
- const logger = require('./logger');
140
-
141
- logger.info('User signed up', { userId: 456, email: 'user@example.com' });
142
- logger.error('Payment failed', { orderId: 789, amount: 99.99 });
143
- ```
144
-
145
- ---
146
-
147
- ## Framework-Specific Setup
148
-
149
- ### Express.js
150
-
151
- ```javascript
152
- // app.js
153
- require('securenow/register');
154
- require('securenow/console-instrumentation');
155
-
156
- const express = require('express');
157
- const app = express();
158
-
159
- app.get('/', (req, res) => {
160
- console.log('Home page accessed');
161
- res.send('Hello World');
162
- });
163
-
164
- app.listen(3000, () => {
165
- console.log('Server running on port 3000');
166
- });
167
- ```
168
-
169
- **Run:**
170
- ```bash
171
- SECURENOW_LOGGING_ENABLED=1 SECURENOW_APPID=express-app node app.js
172
- ```
173
-
174
- ---
175
-
176
- ### Next.js (App Router)
177
-
178
- **1. Create `instrumentation.ts` in project root:**
179
-
180
- ```typescript
181
- // instrumentation.ts
182
- export async function register() {
183
- if (process.env.NEXT_RUNTIME === 'nodejs') {
184
- process.env.SECURENOW_LOGGING_ENABLED = '1';
185
- await import('securenow/register');
186
- await import('securenow/console-instrumentation');
187
- }
188
- }
189
- ```
190
-
191
- **2. Enable in `next.config.js`:**
192
-
193
- ```javascript
194
- /** @type {import('next').NextConfig} */
195
- const nextConfig = {
196
- experimental: {
197
- instrumentationHook: true,
198
- },
199
- };
200
-
201
- module.exports = nextConfig;
202
- ```
203
-
204
- **3. Add to `.env.local`:**
205
-
206
- ```bash
207
- SECURENOW_LOGGING_ENABLED=1
208
- SECURENOW_APPID=my-nextjs-app
209
- SECURENOW_INSTANCE=http://localhost:4318
210
- ```
211
-
212
- **4. Use in API routes:**
213
-
214
- ```typescript
215
- // app/api/users/route.ts
216
- export async function GET() {
217
- console.log('GET /api/users called');
218
- const users = await fetchUsers();
219
- console.info('Users fetched', { count: users.length });
220
- return Response.json(users);
221
- }
222
- ```
223
-
224
- ---
225
-
226
- ### Fastify
227
-
228
- ```javascript
229
- // server.js
230
- require('securenow/register');
231
- require('securenow/console-instrumentation');
232
-
233
- const fastify = require('fastify')();
234
-
235
- fastify.get('/', async () => {
236
- console.log('Root endpoint called');
237
- return { hello: 'world' };
238
- });
239
-
240
- fastify.listen({ port: 3000 });
241
- ```
242
-
243
- ---
244
-
245
- ### NestJS
246
-
247
- ```typescript
248
- // main.ts
249
- require('securenow/register');
250
- require('securenow/console-instrumentation');
251
-
252
- import { NestFactory } from '@nestjs/core';
253
- import { AppModule } from './app.module';
254
-
255
- async function bootstrap() {
256
- const app = await NestFactory.create(AppModule);
257
- console.log('NestJS application starting');
258
- await app.listen(3000);
259
- }
260
-
261
- bootstrap();
262
- ```
263
-
264
- ---
265
-
266
- ## Verification
267
-
268
- After starting your app, you should see:
269
-
270
- ```
271
- [securenow] OTel SDK started → http://your-otlp-collector:4318/v1/traces
272
- [securenow] 📋 Logging: ENABLED → http://your-otlp-collector:4318/v1/logs
273
- [securenow] Console instrumentation installed
274
- ```
275
-
276
- ---
277
-
278
- ## View Logs in SecureNow
279
-
280
- 1. Open your SecureNow dashboard
281
- 2. Go to **Logs** section
282
- 3. Filter by `service.name = my-app-name`
283
- 4. See all your logs with:
284
- - Automatic severity levels
285
- - Structured attributes
286
- - Trace correlation
287
-
288
- ---
289
-
290
- ## Common Issues
291
-
292
- ### Logs Not Appearing
293
-
294
- **Check 1:** Verify `SECURENOW_LOGGING_ENABLED=1` is set
295
-
296
- ```bash
297
- echo $SECURENOW_LOGGING_ENABLED # Should output: 1
298
- ```
299
-
300
- **Check 2:** Verify endpoint is correct
301
-
302
- ```bash
303
- # Self-hosted OTLP collector
304
- export SECURENOW_INSTANCE=http://localhost:4318
305
-
306
- # Managed OTLP (example)
307
- export SECURENOW_INSTANCE=https://ingest.<region>.securenow.ai:443
308
- export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=<your-key>"
309
- ```
310
-
311
- **Check 3:** Enable debug logging
312
-
313
- ```bash
314
- export OTEL_LOG_LEVEL=debug
315
- node app.js
316
- ```
317
-
318
- ---
319
-
320
- ### Console Instrumentation Not Working
321
-
322
- Make sure the load order is correct:
323
-
324
- ```javascript
325
- // ✅ Correct
326
- require('securenow/register');
327
- require('securenow/console-instrumentation');
328
- const express = require('express');
329
-
330
- // ❌ Wrong
331
- const express = require('express');
332
- require('securenow/register');
333
- ```
334
-
335
- ---
336
-
337
- ### Logger Returns Null
338
-
339
- This happens when logging is disabled:
340
-
341
- ```javascript
342
- const { getLogger } = require('securenow/tracing');
343
- const logger = getLogger('test');
344
-
345
- if (!logger) {
346
- console.log('Set SECURENOW_LOGGING_ENABLED=1 to enable logging');
347
- }
348
- ```
349
-
350
- ---
351
-
352
- ## Environment Variables Reference
353
-
354
- ```bash
355
- # Logging
356
- SECURENOW_LOGGING_ENABLED=1 # Enable/disable logging (default: 1)
357
-
358
- # Connection
359
- SECURENOW_INSTANCE=http://localhost:4318 # OTLP endpoint
360
- OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=... # Override logs endpoint
361
-
362
- # Authentication
363
- OTEL_EXPORTER_OTLP_HEADERS="x-api-key=KEY"
364
-
365
- # Service Info
366
- SECURENOW_APPID=my-app # Your app name
367
- OTEL_SERVICE_NAME=my-app # Alternative
368
-
369
- # Debugging
370
- OTEL_LOG_LEVEL=debug # Enable debug output
371
- ```
372
-
373
- ---
374
-
375
- ## Best Practices
376
-
377
- 1. **Use Structured Logging** - Pass objects with meaningful attributes
378
- ```javascript
379
- console.log('User action', { userId: 123, action: 'login' });
380
- ```
381
-
382
- 2. **Choose Appropriate Severity Levels**
383
- - `console.log()` / `console.info()` - Normal operations
384
- - `console.warn()` - Warnings, deprecations
385
- - `console.error()` - Errors, exceptions
386
-
387
- 3. **Include Context** - Add userId, requestId, etc. to log attributes
388
-
389
- 4. **Don't Log Sensitive Data** - SecureNow automatically redacts passwords, tokens, etc.
390
-
391
- 5. **Use Different Loggers for Different Modules**
392
- ```javascript
393
- const authLogger = getLogger('auth-service');
394
- const dbLogger = getLogger('database');
395
- ```
396
-
397
- ---
398
-
399
- ## Complete Documentation
400
-
401
- - [Logging Quick Start](./docs/LOGGING-QUICKSTART.md)
402
- - [Logging Complete Guide](./docs/LOGGING-GUIDE.md)
403
- - [All Examples](./examples/)
404
-
405
- ---
406
-
407
- ## Support
408
-
409
- - **Documentation**: [Full Docs](./docs/INDEX.md)
410
- - **Website**: [securenow.ai](http://securenow.ai/)
411
- - **Issues**: GitHub Issues
412
-
413
- ---
414
-
415
- **That's it!** Your app is now sending logs to your OTLP backend (for example SecureNow). 🎉
1
+ # How to Use SecureNow Logging in Your App
2
+
3
+ This guide is for developers who want to add the `securenow` package to their applications to enable logging to SecureNow or any OTLP-compatible backend.
4
+
5
+ **Since v5.6.0:** When `SECURENOW_LOGGING_ENABLED=1`, `console.log`, `console.warn`, `console.error`, `console.info`, and `console.debug` are **automatically** forwarded as OTLP log records after you load `securenow/register`. A separate `require('securenow/console-instrumentation')` is no longer required (the module remains for backward compatibility).
6
+
7
+ ---
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install securenow
13
+ ```
14
+
15
+ ---
16
+
17
+ ## Setup Steps
18
+
19
+ ### Step 1: Configure Environment Variables
20
+
21
+ Add these to your `.env` file or export them:
22
+
23
+ ```bash
24
+ # Required: Enable logging
25
+ SECURENOW_LOGGING_ENABLED=1
26
+
27
+ # Required: Your app name
28
+ SECURENOW_APPID=my-app-name
29
+
30
+ # Required: Your OTLP endpoint
31
+ SECURENOW_INSTANCE=http://your-otlp-collector:4318
32
+
33
+ # For managed OTLP / authentication (optional):
34
+ # OTEL_EXPORTER_OTLP_HEADERS="x-api-key=your-key"
35
+ ```
36
+
37
+ ---
38
+
39
+ ### Step 2: Choose Your Integration Method
40
+
41
+ You have **three options** to integrate logging:
42
+
43
+ #### **Option A: Automatic Console Instrumentation** (Recommended - Easiest)
44
+
45
+ Since **v5.6.0**, when `SECURENOW_LOGGING_ENABLED=1`, all `console.log()`, `console.info()`, `console.warn()`, `console.error()`, and `console.debug()` calls are **automatically** captured and sent as OTLP log records. No extra require is needed.
46
+
47
+ **Add to your main application file:**
48
+
49
+ ```javascript
50
+ // At the very top of your app.js, index.js, server.js, or main.ts
51
+ require('securenow/register');
52
+
53
+ // That's it! With SECURENOW_LOGGING_ENABLED=1, all console calls become OTLP logs.
54
+ console.log('Application started');
55
+ console.error('An error occurred', { userId: 123, details: 'Something went wrong' });
56
+ console.warn('Warning message');
57
+ ```
58
+
59
+ **Or using NODE_OPTIONS (no code changes needed):**
60
+
61
+ ```bash
62
+ NODE_OPTIONS="-r securenow/register" node app.js
63
+ ```
64
+
65
+ ---
66
+
67
+ #### **Option B: Direct Logger API**
68
+
69
+ For more control over logging, use the OpenTelemetry logger API directly:
70
+
71
+ ```javascript
72
+ require('securenow/register');
73
+ const { getLogger } = require('securenow/tracing');
74
+
75
+ // Get a logger instance
76
+ const logger = getLogger('my-service', '1.0.0');
77
+
78
+ // Emit structured logs
79
+ logger.emit({
80
+ severityNumber: 9, // INFO level
81
+ severityText: 'INFO',
82
+ body: 'User logged in',
83
+ attributes: {
84
+ userId: 123,
85
+ username: 'john',
86
+ ip: '192.168.1.1',
87
+ },
88
+ });
89
+ ```
90
+
91
+ **Severity Levels:**
92
+ - `5` = DEBUG
93
+ - `9` = INFO
94
+ - `13` = WARN
95
+ - `17` = ERROR
96
+
97
+ ---
98
+
99
+ #### **Option C: Custom Logger Wrapper**
100
+
101
+ Create your own logger wrapper for cleaner API:
102
+
103
+ ```javascript
104
+ // logger.js
105
+ require('securenow/register');
106
+ const { getLogger } = require('securenow/tracing');
107
+
108
+ const logger = getLogger('app-logger', '1.0.0');
109
+
110
+ const SeverityNumber = {
111
+ DEBUG: 5,
112
+ INFO: 9,
113
+ WARN: 13,
114
+ ERROR: 17,
115
+ };
116
+
117
+ function log(level, message, attributes = {}) {
118
+ if (logger) {
119
+ logger.emit({
120
+ severityNumber: SeverityNumber[level],
121
+ severityText: level,
122
+ body: message,
123
+ attributes,
124
+ });
125
+ }
126
+ console.log(`[${level}] ${message}`, attributes);
127
+ }
128
+
129
+ module.exports = {
130
+ debug: (msg, attrs) => log('DEBUG', msg, attrs),
131
+ info: (msg, attrs) => log('INFO', msg, attrs),
132
+ warn: (msg, attrs) => log('WARN', msg, attrs),
133
+ error: (msg, attrs) => log('ERROR', msg, attrs),
134
+ };
135
+ ```
136
+
137
+ **Usage:**
138
+
139
+ ```javascript
140
+ const logger = require('./logger');
141
+
142
+ logger.info('User signed up', { userId: 456, email: 'user@example.com' });
143
+ logger.error('Payment failed', { orderId: 789, amount: 99.99 });
144
+ ```
145
+
146
+ ---
147
+
148
+ ## Framework-Specific Setup
149
+
150
+ ### Express.js
151
+
152
+ ```javascript
153
+ // app.js
154
+ require('securenow/register');
155
+
156
+ const express = require('express');
157
+ const app = express();
158
+
159
+ app.get('/', (req, res) => {
160
+ console.log('Home page accessed');
161
+ res.send('Hello World');
162
+ });
163
+
164
+ app.listen(3000, () => {
165
+ console.log('Server running on port 3000');
166
+ });
167
+ ```
168
+
169
+ **Run:**
170
+ ```bash
171
+ SECURENOW_LOGGING_ENABLED=1 SECURENOW_APPID=express-app node app.js
172
+ ```
173
+
174
+ ---
175
+
176
+ ### Next.js (App Router)
177
+
178
+ **1. Create `instrumentation.ts` in project root:**
179
+
180
+ ```typescript
181
+ // instrumentation.ts
182
+ export async function register() {
183
+ if (process.env.NEXT_RUNTIME === 'nodejs') {
184
+ process.env.SECURENOW_LOGGING_ENABLED = '1';
185
+ await import('securenow/register');
186
+ }
187
+ }
188
+ ```
189
+
190
+ **2. Enable in `next.config.js`:**
191
+
192
+ ```javascript
193
+ /** @type {import('next').NextConfig} */
194
+ const nextConfig = {
195
+ experimental: {
196
+ instrumentationHook: true,
197
+ },
198
+ };
199
+
200
+ module.exports = nextConfig;
201
+ ```
202
+
203
+ **3. Add to `.env.local`:**
204
+
205
+ ```bash
206
+ SECURENOW_LOGGING_ENABLED=1
207
+ SECURENOW_APPID=my-nextjs-app
208
+ SECURENOW_INSTANCE=http://localhost:4318
209
+ ```
210
+
211
+ **4. Use in API routes:**
212
+
213
+ ```typescript
214
+ // app/api/users/route.ts
215
+ export async function GET() {
216
+ console.log('GET /api/users called');
217
+ const users = await fetchUsers();
218
+ console.info('Users fetched', { count: users.length });
219
+ return Response.json(users);
220
+ }
221
+ ```
222
+
223
+ ---
224
+
225
+ ### Fastify
226
+
227
+ ```javascript
228
+ // server.js
229
+ require('securenow/register');
230
+
231
+ const fastify = require('fastify')();
232
+
233
+ fastify.get('/', async () => {
234
+ console.log('Root endpoint called');
235
+ return { hello: 'world' };
236
+ });
237
+
238
+ fastify.listen({ port: 3000 });
239
+ ```
240
+
241
+ ---
242
+
243
+ ### NestJS
244
+
245
+ ```typescript
246
+ // main.ts
247
+ require('securenow/register');
248
+
249
+ import { NestFactory } from '@nestjs/core';
250
+ import { AppModule } from './app.module';
251
+
252
+ async function bootstrap() {
253
+ const app = await NestFactory.create(AppModule);
254
+ console.log('NestJS application starting');
255
+ await app.listen(3000);
256
+ }
257
+
258
+ bootstrap();
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Verification
264
+
265
+ After starting your app, you should see:
266
+
267
+ ```
268
+ [securenow] OTel SDK started http://your-otlp-collector:4318/v1/traces
269
+ [securenow] 📋 Logging: ENABLED → http://your-otlp-collector:4318/v1/logs
270
+ [securenow] Console instrumentation installed
271
+ ```
272
+
273
+ ---
274
+
275
+ ## View Logs in SecureNow
276
+
277
+ 1. Open your SecureNow dashboard
278
+ 2. Go to **Logs** section
279
+ 3. Filter by `service.name = my-app-name`
280
+ 4. See all your logs with:
281
+ - Automatic severity levels
282
+ - Structured attributes
283
+ - Trace correlation
284
+
285
+ ---
286
+
287
+ ## Common Issues
288
+
289
+ ### Logs Not Appearing
290
+
291
+ **Check 1:** Verify `SECURENOW_LOGGING_ENABLED=1` is set
292
+
293
+ ```bash
294
+ echo $SECURENOW_LOGGING_ENABLED # Should output: 1
295
+ ```
296
+
297
+ **Check 2:** Verify endpoint is correct
298
+
299
+ ```bash
300
+ # Self-hosted OTLP collector
301
+ export SECURENOW_INSTANCE=http://localhost:4318
302
+
303
+ # Managed OTLP (example)
304
+ export SECURENOW_INSTANCE=https://ingest.<region>.securenow.ai:443
305
+ export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=<your-key>"
306
+ ```
307
+
308
+ **Check 3:** Enable debug logging
309
+
310
+ ```bash
311
+ export OTEL_LOG_LEVEL=debug
312
+ node app.js
313
+ ```
314
+
315
+ ---
316
+
317
+ ### Console Instrumentation Not Working
318
+
319
+ Make sure the load order is correct:
320
+
321
+ ```javascript
322
+ // Correct register must be first
323
+ require('securenow/register');
324
+ const express = require('express');
325
+
326
+ // ❌ Wrong
327
+ const express = require('express');
328
+ require('securenow/register');
329
+ ```
330
+
331
+ ---
332
+
333
+ ### Logger Returns Null
334
+
335
+ This happens when logging is disabled:
336
+
337
+ ```javascript
338
+ const { getLogger } = require('securenow/tracing');
339
+ const logger = getLogger('test');
340
+
341
+ if (!logger) {
342
+ console.log('Set SECURENOW_LOGGING_ENABLED=1 to enable logging');
343
+ }
344
+ ```
345
+
346
+ ---
347
+
348
+ ## Environment Variables Reference
349
+
350
+ ```bash
351
+ # Logging
352
+ SECURENOW_LOGGING_ENABLED=1 # Enable/disable logging (default: 1)
353
+
354
+ # Connection
355
+ SECURENOW_INSTANCE=http://localhost:4318 # OTLP endpoint
356
+ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=... # Override logs endpoint
357
+
358
+ # Authentication
359
+ OTEL_EXPORTER_OTLP_HEADERS="x-api-key=KEY"
360
+
361
+ # Service Info
362
+ SECURENOW_APPID=my-app # Your app name
363
+ OTEL_SERVICE_NAME=my-app # Alternative
364
+
365
+ # Debugging
366
+ OTEL_LOG_LEVEL=debug # Enable debug output
367
+ ```
368
+
369
+ ---
370
+
371
+ ## Best Practices
372
+
373
+ 1. **Use Structured Logging** - Pass objects with meaningful attributes
374
+ ```javascript
375
+ console.log('User action', { userId: 123, action: 'login' });
376
+ ```
377
+
378
+ 2. **Choose Appropriate Severity Levels**
379
+ - `console.log()` / `console.info()` - Normal operations
380
+ - `console.warn()` - Warnings, deprecations
381
+ - `console.error()` - Errors, exceptions
382
+
383
+ 3. **Include Context** - Add userId, requestId, etc. to log attributes
384
+
385
+ 4. **Don't Log Sensitive Data** - SecureNow automatically redacts passwords, tokens, etc.
386
+
387
+ 5. **Use Different Loggers for Different Modules**
388
+ ```javascript
389
+ const authLogger = getLogger('auth-service');
390
+ const dbLogger = getLogger('database');
391
+ ```
392
+
393
+ ---
394
+
395
+ ## Complete Documentation
396
+
397
+ - [Logging Quick Start](./docs/LOGGING-QUICKSTART.md)
398
+ - [Logging Complete Guide](./docs/LOGGING-GUIDE.md)
399
+ - [All Examples](./examples/)
400
+
401
+ ---
402
+
403
+ ## Support
404
+
405
+ - **Documentation**: [Full Docs](./docs/INDEX.md)
406
+ - **Website**: [securenow.ai](http://securenow.ai/)
407
+ - **Issues**: GitHub Issues
408
+
409
+ ---
410
+
411
+ **That's it!** Your app is now sending logs to your OTLP backend (for example SecureNow). 🎉