@mihari/logger-winston 0.1.0
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/LICENSE +21 -0
- package/README.md +43 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
- package/src/index.ts +97 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mihari Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @mihari/logger-winston
|
|
2
|
+
|
|
3
|
+
Winston transport for the mihari log collection library.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @mihari/logger-winston winston
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import winston from "winston";
|
|
15
|
+
import { MihariWinstonTransport } from "@mihari/logger-winston";
|
|
16
|
+
|
|
17
|
+
const logger = winston.createLogger({
|
|
18
|
+
transports: [
|
|
19
|
+
new MihariWinstonTransport({
|
|
20
|
+
mihariConfig: {
|
|
21
|
+
token: "your-api-token",
|
|
22
|
+
endpoint: "https://logs.example.com",
|
|
23
|
+
},
|
|
24
|
+
}),
|
|
25
|
+
],
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
logger.info("Hello from winston");
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Level Mapping
|
|
32
|
+
|
|
33
|
+
| Winston Level | Mihari Level |
|
|
34
|
+
|--------------|-------------|
|
|
35
|
+
| silly, debug | debug |
|
|
36
|
+
| verbose, info | info |
|
|
37
|
+
| warn, warning | warn |
|
|
38
|
+
| error | error |
|
|
39
|
+
| crit, emerg, alert | fatal |
|
|
40
|
+
|
|
41
|
+
## License
|
|
42
|
+
|
|
43
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import Transport from "winston-transport";
|
|
2
|
+
import { MihariConfig } from "@mihari/logger-types";
|
|
3
|
+
interface WinstonLogInfo {
|
|
4
|
+
level: string;
|
|
5
|
+
message: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface MihariWinstonOptions extends Transport.TransportStreamOptions {
|
|
9
|
+
readonly mihariConfig: MihariConfig;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Winston transport that forwards logs to mihari.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import winston from "winston";
|
|
17
|
+
* import { MihariWinstonTransport } from "@mihari/logger-winston";
|
|
18
|
+
*
|
|
19
|
+
* const logger = winston.createLogger({
|
|
20
|
+
* transports: [
|
|
21
|
+
* new MihariWinstonTransport({
|
|
22
|
+
* mihariConfig: {
|
|
23
|
+
* token: "your-token",
|
|
24
|
+
* endpoint: "https://logs.example.com",
|
|
25
|
+
* },
|
|
26
|
+
* }),
|
|
27
|
+
* ],
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* logger.info("Hello from winston");
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class MihariWinstonTransport extends Transport {
|
|
34
|
+
private readonly client;
|
|
35
|
+
constructor(options: MihariWinstonOptions);
|
|
36
|
+
log(info: WinstonLogInfo, callback: () => void): void;
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export default MihariWinstonTransport;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA4B9D,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAqB,SAAQ,SAAS,CAAC,sBAAsB;IAC5E,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,OAAO,EAAE,oBAAoB;IAKzC,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAqB/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,eAAe,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MihariWinstonTransport = void 0;
|
|
7
|
+
const winston_transport_1 = __importDefault(require("winston-transport"));
|
|
8
|
+
const logger_core_1 = require("@mihari/logger-core");
|
|
9
|
+
const logger_types_1 = require("@mihari/logger-types");
|
|
10
|
+
/**
|
|
11
|
+
* Maps winston level strings to mihari LogLevel values.
|
|
12
|
+
*/
|
|
13
|
+
function mapWinstonLevel(level) {
|
|
14
|
+
switch (level) {
|
|
15
|
+
case "silly":
|
|
16
|
+
case "debug":
|
|
17
|
+
return logger_types_1.LogLevel.Debug;
|
|
18
|
+
case "verbose":
|
|
19
|
+
case "info":
|
|
20
|
+
return logger_types_1.LogLevel.Info;
|
|
21
|
+
case "warn":
|
|
22
|
+
case "warning":
|
|
23
|
+
return logger_types_1.LogLevel.Warn;
|
|
24
|
+
case "error":
|
|
25
|
+
return logger_types_1.LogLevel.Error;
|
|
26
|
+
case "crit":
|
|
27
|
+
case "critical":
|
|
28
|
+
case "emerg":
|
|
29
|
+
case "alert":
|
|
30
|
+
return logger_types_1.LogLevel.Fatal;
|
|
31
|
+
default:
|
|
32
|
+
return logger_types_1.LogLevel.Info;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Winston transport that forwards logs to mihari.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import winston from "winston";
|
|
41
|
+
* import { MihariWinstonTransport } from "@mihari/logger-winston";
|
|
42
|
+
*
|
|
43
|
+
* const logger = winston.createLogger({
|
|
44
|
+
* transports: [
|
|
45
|
+
* new MihariWinstonTransport({
|
|
46
|
+
* mihariConfig: {
|
|
47
|
+
* token: "your-token",
|
|
48
|
+
* endpoint: "https://logs.example.com",
|
|
49
|
+
* },
|
|
50
|
+
* }),
|
|
51
|
+
* ],
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* logger.info("Hello from winston");
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
class MihariWinstonTransport extends winston_transport_1.default {
|
|
58
|
+
constructor(options) {
|
|
59
|
+
super(options);
|
|
60
|
+
this.client = new logger_core_1.MihariClient(options.mihariConfig);
|
|
61
|
+
}
|
|
62
|
+
log(info, callback) {
|
|
63
|
+
setImmediate(() => {
|
|
64
|
+
this.emit("logged", info);
|
|
65
|
+
});
|
|
66
|
+
const { level, message, ...metadata } = info;
|
|
67
|
+
const mihariLevel = mapWinstonLevel(level);
|
|
68
|
+
// Remove winston internal Symbol properties by extracting
|
|
69
|
+
// only string-keyed properties
|
|
70
|
+
const cleanMeta = {};
|
|
71
|
+
for (const key of Object.keys(metadata)) {
|
|
72
|
+
if (key !== "splat") {
|
|
73
|
+
cleanMeta[key] = metadata[key];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.client.log(mihariLevel, message, cleanMeta);
|
|
77
|
+
callback();
|
|
78
|
+
}
|
|
79
|
+
async close() {
|
|
80
|
+
await this.client.shutdown();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.MihariWinstonTransport = MihariWinstonTransport;
|
|
84
|
+
exports.default = MihariWinstonTransport;
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,0EAA0C;AAC1C,qDAAmD;AACnD,uDAA8D;AAE9D;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,uBAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,SAAS,CAAC;QACf,KAAK,MAAM;YACT,OAAO,uBAAQ,CAAC,IAAI,CAAC;QACvB,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,uBAAQ,CAAC,IAAI,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,uBAAQ,CAAC,KAAK,CAAC;QACxB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,uBAAQ,CAAC,KAAK,CAAC;QACxB;YACE,OAAO,uBAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAYD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,sBAAuB,SAAQ,2BAAS;IAGnD,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,0BAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,IAAoB,EAAE,QAAoB;QAC5C,YAAY,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC7C,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAE3C,0DAA0D;QAC1D,+BAA+B;QAC/B,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACpB,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF;AAhCD,wDAgCC;AAED,kBAAe,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mihari/logger-winston",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Winston transport for mihari log collection",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"types": "src/index.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"clean": "rm -rf dist",
|
|
13
|
+
"test": "cd ../.. && npx vitest run --config vitest.config.ts packages/winston"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"vitest": "^3.0.0"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@mihari/logger-core": "^0.1.0",
|
|
20
|
+
"@mihari/logger-types": "^0.1.0",
|
|
21
|
+
"winston-transport": "^4.7.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"winston": ">=3.0.0"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/mihari/mihari-js",
|
|
33
|
+
"directory": "packages/winston"
|
|
34
|
+
},
|
|
35
|
+
"gitHead": "dc10a3217caa819965eb3a1e2ff3901a16e510aa"
|
|
36
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import Transport from "winston-transport";
|
|
2
|
+
import { MihariClient } from "@mihari/logger-core";
|
|
3
|
+
import { LogLevel, MihariConfig } from "@mihari/logger-types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Maps winston level strings to mihari LogLevel values.
|
|
7
|
+
*/
|
|
8
|
+
function mapWinstonLevel(level: string): LogLevel {
|
|
9
|
+
switch (level) {
|
|
10
|
+
case "silly":
|
|
11
|
+
case "debug":
|
|
12
|
+
return LogLevel.Debug;
|
|
13
|
+
case "verbose":
|
|
14
|
+
case "info":
|
|
15
|
+
return LogLevel.Info;
|
|
16
|
+
case "warn":
|
|
17
|
+
case "warning":
|
|
18
|
+
return LogLevel.Warn;
|
|
19
|
+
case "error":
|
|
20
|
+
return LogLevel.Error;
|
|
21
|
+
case "crit":
|
|
22
|
+
case "critical":
|
|
23
|
+
case "emerg":
|
|
24
|
+
case "alert":
|
|
25
|
+
return LogLevel.Fatal;
|
|
26
|
+
default:
|
|
27
|
+
return LogLevel.Info;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface WinstonLogInfo {
|
|
32
|
+
level: string;
|
|
33
|
+
message: string;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MihariWinstonOptions extends Transport.TransportStreamOptions {
|
|
38
|
+
readonly mihariConfig: MihariConfig;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Winston transport that forwards logs to mihari.
|
|
43
|
+
*
|
|
44
|
+
* Usage:
|
|
45
|
+
* ```typescript
|
|
46
|
+
* import winston from "winston";
|
|
47
|
+
* import { MihariWinstonTransport } from "@mihari/logger-winston";
|
|
48
|
+
*
|
|
49
|
+
* const logger = winston.createLogger({
|
|
50
|
+
* transports: [
|
|
51
|
+
* new MihariWinstonTransport({
|
|
52
|
+
* mihariConfig: {
|
|
53
|
+
* token: "your-token",
|
|
54
|
+
* endpoint: "https://logs.example.com",
|
|
55
|
+
* },
|
|
56
|
+
* }),
|
|
57
|
+
* ],
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* logger.info("Hello from winston");
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export class MihariWinstonTransport extends Transport {
|
|
64
|
+
private readonly client: MihariClient;
|
|
65
|
+
|
|
66
|
+
constructor(options: MihariWinstonOptions) {
|
|
67
|
+
super(options);
|
|
68
|
+
this.client = new MihariClient(options.mihariConfig);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
log(info: WinstonLogInfo, callback: () => void): void {
|
|
72
|
+
setImmediate(() => {
|
|
73
|
+
this.emit("logged", info);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const { level, message, ...metadata } = info;
|
|
77
|
+
const mihariLevel = mapWinstonLevel(level);
|
|
78
|
+
|
|
79
|
+
// Remove winston internal Symbol properties by extracting
|
|
80
|
+
// only string-keyed properties
|
|
81
|
+
const cleanMeta: Record<string, unknown> = {};
|
|
82
|
+
for (const key of Object.keys(metadata)) {
|
|
83
|
+
if (key !== "splat") {
|
|
84
|
+
cleanMeta[key] = metadata[key];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
this.client.log(mihariLevel, message, cleanMeta);
|
|
89
|
+
callback();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async close(): Promise<void> {
|
|
93
|
+
await this.client.shutdown();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export default MihariWinstonTransport;
|