@logship/logger 0.1.0 → 0.1.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.
- package/README.md +84 -17
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +6 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/transports/http.d.ts +11 -0
- package/dist/src/transports/http.d.ts.map +1 -0
- package/dist/src/transports/http.js +59 -0
- package/dist/src/transports/http.js.map +1 -0
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +17 -3
package/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
# @logship/logger
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Send logs to the Logger ingestion API with buffer, batch, and retry.
|
|
4
|
+
|
|
5
|
+
**[Website](https://logship-logger.vercel.app)** · **[Docs](https://logship-logger.vercel.app/docs/getting-started)** · **[Buy me a coffee](https://www.buymeacoffee.com/anytechie)** ☕
|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- Node.js **>= 18**
|
|
4
10
|
|
|
5
11
|
## Install
|
|
6
12
|
|
|
@@ -8,35 +14,96 @@ Logger SDK: send logs to the ingestion API with buffer, batch, and retry.
|
|
|
8
14
|
npm install @logship/logger
|
|
9
15
|
```
|
|
10
16
|
|
|
11
|
-
##
|
|
17
|
+
## Quick start
|
|
12
18
|
|
|
13
19
|
```ts
|
|
14
20
|
import { init } from '@logship/logger';
|
|
15
21
|
|
|
16
22
|
const logger = init({
|
|
17
|
-
apiKey: process.env.LOGGER_API_KEY
|
|
23
|
+
apiKey: process.env.LOGGER_API_KEY!,
|
|
18
24
|
minLevel: 'info',
|
|
19
|
-
defaultMetadata: { service: 'api'
|
|
25
|
+
defaultMetadata: { service: 'api' },
|
|
20
26
|
});
|
|
21
27
|
|
|
22
|
-
logger.info('
|
|
23
|
-
logger.error('Payment failed', { orderId: '
|
|
28
|
+
logger.info('Server started');
|
|
29
|
+
logger.error('Payment failed', { orderId: 'ord_123' });
|
|
24
30
|
```
|
|
25
31
|
|
|
26
|
-
##
|
|
32
|
+
## Configuration
|
|
33
|
+
|
|
34
|
+
| Option | Type | Default | Description |
|
|
35
|
+
|--------|------|---------|-------------|
|
|
36
|
+
| **apiKey** | string | — | **Required** for default HTTP transport. From dashboard API Keys. |
|
|
37
|
+
| **endpoint** | string | `process.env.LOGGER_API_URL` or `http://localhost:3000` | Ingestion API base URL. |
|
|
38
|
+
| **minLevel** | `'debug' \| 'info' \| 'warn' \| 'error'` | `'debug'` | Events below this level are dropped. |
|
|
39
|
+
| **minLevelByEnv** | `Record<string, LogLevel>` | — | Override minLevel by environment name. |
|
|
40
|
+
| **sampleRate** | number (0–1) | 1 | Global sampling; 1 = keep all. |
|
|
41
|
+
| **sampleRateByLevel** | `Partial<Record<LogLevel, number>>` | — | Per-level sampling; error/warn default to 1. |
|
|
42
|
+
| **defaultMetadata** | `Record<string, unknown>` | — | Merged into every event. |
|
|
43
|
+
| **env** | string | — | Environment name (e.g. `'production'`) for minLevelByEnv. |
|
|
44
|
+
| **batchSize** | number | 50 | Max events per batch. |
|
|
45
|
+
| **flushIntervalMs** | number | 5000 | Auto-flush interval in ms; 0 = disabled. |
|
|
46
|
+
| **transports** | `Transport[]` | HTTP when apiKey set | Custom transports; default is HTTP to ingestion API. |
|
|
47
|
+
|
|
48
|
+
**API reference:** For full API reference see the [docs site](https://logship-logger.vercel.app/docs/getting-started) (Getting started, SDK).
|
|
49
|
+
|
|
50
|
+
## Support
|
|
51
|
+
|
|
52
|
+
If this package helps you, consider **[buying me a coffee](https://www.buymeacoffee.com/anytechie)** ☕ — it helps keep the project going.
|
|
53
|
+
|
|
54
|
+
## Step-by-step usage
|
|
55
|
+
|
|
56
|
+
1. **Get an API key** – Dashboard → API Keys → Create API key. Select project, choose Live or Sandbox, copy the key (shown only once).
|
|
57
|
+
2. **Set environment variables** – `LOGGER_API_KEY` (required). Optionally `LOGGER_API_URL` for the ingestion API base URL.
|
|
58
|
+
3. **Init and log** – Call `init({ apiKey })` and use `logger.info()`, `logger.error()`, etc. Events are buffered and sent in batches.
|
|
59
|
+
4. **View logs** – Dashboard → Logs; select project and environment. Logs appear after flush (buffer or interval).
|
|
60
|
+
5. **Optional** – Configure `minLevel`, `defaultMetadata`, `env`, etc. Call `logger.flush()` before process exit to drain the buffer.
|
|
61
|
+
|
|
62
|
+
## Examples
|
|
63
|
+
|
|
64
|
+
### Minimal (Node)
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { init } from '@logship/logger';
|
|
68
|
+
|
|
69
|
+
const logger = init({
|
|
70
|
+
apiKey: process.env.LOGGER_API_KEY!,
|
|
71
|
+
minLevel: 'info',
|
|
72
|
+
defaultMetadata: { service: 'api' },
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
logger.info('Server started');
|
|
76
|
+
logger.error('Something failed', { code: 500 });
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Flush on exit
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
const logger = init({ apiKey: process.env.LOGGER_API_KEY! });
|
|
83
|
+
|
|
84
|
+
process.on('beforeExit', async () => {
|
|
85
|
+
await logger.flush();
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Runnable example
|
|
90
|
+
|
|
91
|
+
See [examples/test-backend](../../examples/test-backend) in the repo for a full runnable Node app using `@logship/logger`.
|
|
92
|
+
|
|
93
|
+
## Error handling
|
|
94
|
+
|
|
95
|
+
- **Missing apiKey:** `init()` throws. Provide a valid API key or use custom `transports` only.
|
|
96
|
+
- **Network/API errors on send:** Transports send in batches; one transport failure does not block others. Failed events may be dropped after send; for critical logs use a fallback (e.g. console or file) or handle errors in your app.
|
|
97
|
+
- **Invalid config:** `apiKey` is required when using the default HTTP transport. Invalid `minLevel` or options may throw or be ignored depending on validation.
|
|
98
|
+
|
|
99
|
+
**What if the API is down?** The SDK buffers and flushes on an interval; failed sends are best-effort. Call `logger.flush()` before process exit to drain the buffer. For critical logs, consider a custom transport (e.g. write to file) or handle errors in your application.
|
|
27
100
|
|
|
28
|
-
|
|
29
|
-
- **minLevel**: `'debug' | 'info' | 'warn' | 'error'` – events below are dropped. Default `'debug'`.
|
|
30
|
-
- **minLevelByEnv**: e.g. `{ production: 'info' }` – overrides minLevel when `env` matches.
|
|
31
|
-
- **sampleRate**: 0–1; 1 = keep all. Error/warn are always kept unless overridden by sampleRateByLevel.
|
|
32
|
-
- **sampleRateByLevel**: e.g. `{ info: 0.1 }` – per-level sampling.
|
|
33
|
-
- **defaultMetadata**: Merged into every log's metadata.
|
|
34
|
-
- **env**: Environment name (e.g. `'production'`) for minLevelByEnv.
|
|
101
|
+
**Missing logs?** Check `minLevel`, `sampleRate`, and `env`; ensure dashboard project and environment match; verify API key (Live vs Sandbox) and network/API status.
|
|
35
102
|
|
|
36
103
|
## Other languages
|
|
37
104
|
|
|
38
|
-
- **Go:** Use the same ingestion API (`POST /v1/logs` with `Authorization: Bearer <api_key>`). Request body: `{"events":[
|
|
105
|
+
- **Go:** Use the same ingestion API (`POST /v1/logs` with `Authorization: Bearer <api_key>`). Request body: `{"events":[...]}`. See [LOGGER_GO_CLIENT.md](../../documentation/LOGGER_GO_CLIENT.md) and [examples/go](../../examples/go) in the repo.
|
|
39
106
|
|
|
40
|
-
##
|
|
107
|
+
## License
|
|
41
108
|
|
|
42
|
-
|
|
109
|
+
MIT
|
package/dist/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvF,QAAA,MAAM,MAAM,EAAE,QAAQ,EAAuC,CAAC;AAgC9D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,mEAAmE;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAwCD,wBAAgB,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAqCzD;AA4BD,iDAAiD;AACjD,wBAAgB,SAAS,IAAI,SAAS,QAAQ,EAAE,CAE/C;AAED,+DAA+D;AAC/D,wBAAgB,KAAK,IAAI,IAAI,CAO5B;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/src/client.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.reset = reset;
|
|
|
7
7
|
const types_1 = require("./types");
|
|
8
8
|
Object.defineProperty(exports, "LEVEL_ORDER", { enumerable: true, get: function () { return types_1.LEVEL_ORDER; } });
|
|
9
9
|
const noop_1 = require("./transports/noop");
|
|
10
|
+
const http_1 = require("./transports/http");
|
|
10
11
|
const LEVELS = ['debug', 'info', 'warn', 'error'];
|
|
11
12
|
exports.LEVELS = LEVELS;
|
|
12
13
|
const DEFAULT_BATCH_SIZE = 50;
|
|
@@ -41,6 +42,11 @@ function getEffectiveTransports(config) {
|
|
|
41
42
|
const t = config.transports;
|
|
42
43
|
if (t && t.length > 0)
|
|
43
44
|
return t;
|
|
45
|
+
const apiKey = config.apiKey?.trim();
|
|
46
|
+
if (apiKey) {
|
|
47
|
+
const endpoint = config.endpoint ?? (typeof process !== 'undefined' ? process.env?.LOGGER_API_URL?.replace(/\/$/, '') : undefined) ?? 'http://localhost:3000';
|
|
48
|
+
return [(0, http_1.createHttpTransport)({ apiKey, endpoint })];
|
|
49
|
+
}
|
|
44
50
|
return [noop_1.noopTransport];
|
|
45
51
|
}
|
|
46
52
|
function getBatchSize(config) {
|
package/dist/src/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { init, getBuffer, reset, LEVEL_ORDER, LEVELS, type LoggerInstance } from './client';
|
|
2
2
|
export type { LogEvent, LogLevel, LoggerConfig, Transport } from './types';
|
|
3
3
|
export { noopTransport } from './transports/noop';
|
|
4
|
+
export { createHttpTransport } from './transports/http';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC5F,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC5F,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noopTransport = exports.LEVELS = exports.LEVEL_ORDER = exports.reset = exports.getBuffer = exports.init = void 0;
|
|
3
|
+
exports.createHttpTransport = exports.noopTransport = exports.LEVELS = exports.LEVEL_ORDER = exports.reset = exports.getBuffer = exports.init = void 0;
|
|
4
4
|
var client_1 = require("./client");
|
|
5
5
|
Object.defineProperty(exports, "init", { enumerable: true, get: function () { return client_1.init; } });
|
|
6
6
|
Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return client_1.getBuffer; } });
|
|
@@ -9,4 +9,6 @@ Object.defineProperty(exports, "LEVEL_ORDER", { enumerable: true, get: function
|
|
|
9
9
|
Object.defineProperty(exports, "LEVELS", { enumerable: true, get: function () { return client_1.LEVELS; } });
|
|
10
10
|
var noop_1 = require("./transports/noop");
|
|
11
11
|
Object.defineProperty(exports, "noopTransport", { enumerable: true, get: function () { return noop_1.noopTransport; } });
|
|
12
|
+
var http_1 = require("./transports/http");
|
|
13
|
+
Object.defineProperty(exports, "createHttpTransport", { enumerable: true, get: function () { return http_1.createHttpTransport; } });
|
|
12
14
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA4F;AAAnF,8FAAA,IAAI,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,gGAAA,MAAM,OAAA;AAEpD,0CAAkD;AAAzC,qGAAA,aAAa,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA4F;AAAnF,8FAAA,IAAI,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,gGAAA,MAAM,OAAA;AAEpD,0CAAkD;AAAzC,qGAAA,aAAa,OAAA;AACtB,0CAAwD;AAA/C,2GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Transport } from '../types';
|
|
2
|
+
export interface HttpTransportOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
endpoint?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Transport that POSTs batches to the Logger ingestion API (POST /v1/logs).
|
|
8
|
+
* Retries on 5xx and 429; does not retry 4xx.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createHttpTransport(options: HttpTransportOptions): Transport;
|
|
11
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,UAAU,CAAC;AAiBpD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAoC5E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHttpTransport = createHttpTransport;
|
|
4
|
+
const DEFAULT_ENDPOINT = typeof process !== 'undefined' && process.env?.LOGGER_API_URL
|
|
5
|
+
? process.env.LOGGER_API_URL.replace(/\/$/, '')
|
|
6
|
+
: 'http://localhost:3000';
|
|
7
|
+
function toApiEvent(evt) {
|
|
8
|
+
return {
|
|
9
|
+
message: evt.message,
|
|
10
|
+
level: evt.level,
|
|
11
|
+
timestamp: evt.timestamp,
|
|
12
|
+
...(evt.metadata && Object.keys(evt.metadata).length > 0 && { metadata: evt.metadata }),
|
|
13
|
+
...(evt.env && { env: evt.env }),
|
|
14
|
+
...(evt.source && { source: evt.source }),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Transport that POSTs batches to the Logger ingestion API (POST /v1/logs).
|
|
19
|
+
* Retries on 5xx and 429; does not retry 4xx.
|
|
20
|
+
*/
|
|
21
|
+
function createHttpTransport(options) {
|
|
22
|
+
const { apiKey, endpoint = DEFAULT_ENDPOINT } = options;
|
|
23
|
+
const baseUrl = endpoint.replace(/\/$/, '');
|
|
24
|
+
const url = `${baseUrl}/v1/logs`;
|
|
25
|
+
return {
|
|
26
|
+
name: 'http',
|
|
27
|
+
async send(events) {
|
|
28
|
+
if (events.length === 0)
|
|
29
|
+
return;
|
|
30
|
+
const body = { events: events.map(toApiEvent) };
|
|
31
|
+
const res = await fetch(url, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
Authorization: `Bearer ${apiKey}`,
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify(body),
|
|
38
|
+
});
|
|
39
|
+
if (res.ok)
|
|
40
|
+
return; // 202 Accepted
|
|
41
|
+
if (res.status === 429) {
|
|
42
|
+
const retryAfterHeader = res.headers.get('Retry-After');
|
|
43
|
+
const retryAfterSec = retryAfterHeader ? parseInt(retryAfterHeader, 10) : NaN;
|
|
44
|
+
const sec = Number.isFinite(retryAfterSec) && retryAfterSec > 0 ? retryAfterSec : 0;
|
|
45
|
+
if (sec > 0) {
|
|
46
|
+
await new Promise((r) => setTimeout(r, sec * 1000));
|
|
47
|
+
}
|
|
48
|
+
const message = sec > 0 ? `Too many requests; retry after ${sec} seconds.` : 'Too many requests; retry after backoff.';
|
|
49
|
+
throw new Error(message);
|
|
50
|
+
}
|
|
51
|
+
if (res.status >= 500) {
|
|
52
|
+
throw new Error(`Logger HTTP transport: server error ${res.status}. Retry later.`);
|
|
53
|
+
}
|
|
54
|
+
const text = await res.text();
|
|
55
|
+
throw new Error(`Logger HTTP transport: ${res.status} ${text || res.statusText}`);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface Transport {
|
|
|
19
19
|
}
|
|
20
20
|
export interface LoggerConfig {
|
|
21
21
|
apiKey: string;
|
|
22
|
+
/** Ingestion API base URL (e.g. https://api.example.com). Default: process.env.LOGGER_API_URL or http://localhost:3000 */
|
|
23
|
+
endpoint?: string;
|
|
22
24
|
/** Minimum level to send; events below are dropped. Default 'debug' */
|
|
23
25
|
minLevel?: LogLevel;
|
|
24
26
|
/** Per-environment min level, e.g. { production: 'info' } */
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKhD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKhD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,0HAA0H;IAC1H,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logship/logger",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Logger SDK: send logs to ingestion API with buffer, batch, retry",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Logger SDK: send logs to ingestion API with buffer, batch, retry. One SDK, one API—ship logs without the ops.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
@@ -20,10 +20,24 @@
|
|
|
20
20
|
"keywords": [
|
|
21
21
|
"logger",
|
|
22
22
|
"logging",
|
|
23
|
-
"sdk"
|
|
23
|
+
"sdk",
|
|
24
|
+
"logship",
|
|
25
|
+
"ingestion"
|
|
24
26
|
],
|
|
25
27
|
"author": "",
|
|
26
28
|
"license": "MIT",
|
|
29
|
+
"homepage": "https://logship-logger.vercel.app",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/AnyTechieMaster/logger.git"
|
|
33
|
+
},
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/AnyTechieMaster/logger/issues"
|
|
36
|
+
},
|
|
37
|
+
"funding": {
|
|
38
|
+
"type": "buymeacoffee",
|
|
39
|
+
"url": "https://www.buymeacoffee.com/anytechie"
|
|
40
|
+
},
|
|
27
41
|
"publishConfig": {
|
|
28
42
|
"access": "public"
|
|
29
43
|
},
|