@mihari/logger-tool 0.1.0 → 0.2.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/dist/index.d.mts +1 -0
- package/dist/index.d.ts +0 -2
- package/dist/index.js +151 -161
- package/dist/index.js.map +1 -1
- package/{src/index.ts → dist/index.mjs} +17 -43
- package/dist/index.mjs.map +1 -0
- package/package.json +31 -9
- package/dist/index.d.ts.map +0 -1
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,43 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
-
__setModuleDefault(result, mod);
|
|
33
|
-
return result;
|
|
34
|
-
};
|
|
35
|
-
})();
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
const readline = __importStar(require("readline"));
|
|
38
|
-
const logger_core_1 = require("@mihari/logger-core");
|
|
39
|
-
const logger_types_1 = require("@mihari/logger-types");
|
|
40
|
-
const USAGE = `
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
18
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
19
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
20
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
21
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
22
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
23
|
+
mod
|
|
24
|
+
));
|
|
25
|
+
|
|
26
|
+
// src/index.ts
|
|
27
|
+
var readline = __toESM(require("readline"));
|
|
28
|
+
var import_logger_core = require("@mihari/logger-core");
|
|
29
|
+
var import_logger_types = require("@mihari/logger-types");
|
|
30
|
+
var USAGE = `
|
|
41
31
|
mihari - CLI tool for mihari log collection
|
|
42
32
|
|
|
43
33
|
Usage:
|
|
@@ -58,140 +48,140 @@ Examples:
|
|
|
58
48
|
tail -f /var/log/app.log | mihari tail --level warn
|
|
59
49
|
`.trim();
|
|
60
50
|
function getConfig() {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
51
|
+
const token = process.env.MIHARI_TOKEN;
|
|
52
|
+
const endpoint = process.env.MIHARI_ENDPOINT;
|
|
53
|
+
if (!token) {
|
|
54
|
+
console.error("Error: MIHARI_TOKEN environment variable is required");
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (!endpoint) {
|
|
58
|
+
console.error("Error: MIHARI_ENDPOINT environment variable is required");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
return { token, endpoint };
|
|
72
62
|
}
|
|
73
63
|
function parseLevel(levelStr) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
64
|
+
const normalized = levelStr.toLowerCase();
|
|
65
|
+
const levelMap = {
|
|
66
|
+
debug: import_logger_types.LogLevel.Debug,
|
|
67
|
+
info: import_logger_types.LogLevel.Info,
|
|
68
|
+
warn: import_logger_types.LogLevel.Warn,
|
|
69
|
+
error: import_logger_types.LogLevel.Error,
|
|
70
|
+
fatal: import_logger_types.LogLevel.Fatal
|
|
71
|
+
};
|
|
72
|
+
const level = levelMap[normalized];
|
|
73
|
+
if (!level) {
|
|
74
|
+
console.error(
|
|
75
|
+
`Error: Invalid log level "${levelStr}". Valid levels: debug, info, warn, error, fatal`
|
|
76
|
+
);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
return level;
|
|
88
80
|
}
|
|
89
81
|
async function sendCommand(args) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
message = arg;
|
|
102
|
-
}
|
|
82
|
+
const config = getConfig();
|
|
83
|
+
const client = new import_logger_core.MihariClient(config);
|
|
84
|
+
let message = "";
|
|
85
|
+
let level = import_logger_types.LogLevel.Info;
|
|
86
|
+
const mutableArgs = [...args];
|
|
87
|
+
while (mutableArgs.length > 0) {
|
|
88
|
+
const arg = mutableArgs.shift();
|
|
89
|
+
if (arg === "--level" && mutableArgs.length > 0) {
|
|
90
|
+
level = parseLevel(mutableArgs.shift());
|
|
91
|
+
} else if (!message) {
|
|
92
|
+
message = arg;
|
|
103
93
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
94
|
+
}
|
|
95
|
+
if (!message) {
|
|
96
|
+
console.error("Error: Message is required for send command");
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
switch (level) {
|
|
100
|
+
case import_logger_types.LogLevel.Debug:
|
|
101
|
+
client.debug(message);
|
|
102
|
+
break;
|
|
103
|
+
case import_logger_types.LogLevel.Info:
|
|
104
|
+
client.info(message);
|
|
105
|
+
break;
|
|
106
|
+
case import_logger_types.LogLevel.Warn:
|
|
107
|
+
client.warn(message);
|
|
108
|
+
break;
|
|
109
|
+
case import_logger_types.LogLevel.Error:
|
|
110
|
+
client.error(message);
|
|
111
|
+
break;
|
|
112
|
+
case import_logger_types.LogLevel.Fatal:
|
|
113
|
+
client.fatal(message);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
await client.flush();
|
|
117
|
+
console.log(`Sent: [${level}] ${message}`);
|
|
127
118
|
}
|
|
128
119
|
async function tailCommand(args) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
120
|
+
const config = getConfig();
|
|
121
|
+
const client = new import_logger_core.MihariClient(config);
|
|
122
|
+
let level = import_logger_types.LogLevel.Info;
|
|
123
|
+
const mutableArgs = [...args];
|
|
124
|
+
while (mutableArgs.length > 0) {
|
|
125
|
+
const arg = mutableArgs.shift();
|
|
126
|
+
if (arg === "--level" && mutableArgs.length > 0) {
|
|
127
|
+
level = parseLevel(mutableArgs.shift());
|
|
138
128
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
129
|
+
}
|
|
130
|
+
const rl = readline.createInterface({
|
|
131
|
+
input: process.stdin,
|
|
132
|
+
terminal: false
|
|
133
|
+
});
|
|
134
|
+
let lineCount = 0;
|
|
135
|
+
rl.on("line", (line) => {
|
|
136
|
+
const trimmed = line.trim();
|
|
137
|
+
if (!trimmed) return;
|
|
138
|
+
switch (level) {
|
|
139
|
+
case import_logger_types.LogLevel.Debug:
|
|
140
|
+
client.debug(trimmed);
|
|
141
|
+
break;
|
|
142
|
+
case import_logger_types.LogLevel.Info:
|
|
143
|
+
client.info(trimmed);
|
|
144
|
+
break;
|
|
145
|
+
case import_logger_types.LogLevel.Warn:
|
|
146
|
+
client.warn(trimmed);
|
|
147
|
+
break;
|
|
148
|
+
case import_logger_types.LogLevel.Error:
|
|
149
|
+
client.error(trimmed);
|
|
150
|
+
break;
|
|
151
|
+
case import_logger_types.LogLevel.Fatal:
|
|
152
|
+
client.fatal(trimmed);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
lineCount++;
|
|
156
|
+
});
|
|
157
|
+
rl.on("close", async () => {
|
|
158
|
+
await client.shutdown();
|
|
159
|
+
console.log(`Sent ${lineCount} log entries`);
|
|
160
|
+
});
|
|
171
161
|
}
|
|
172
162
|
async function main() {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
163
|
+
const args = process.argv.slice(2);
|
|
164
|
+
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
165
|
+
console.log(USAGE);
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
168
|
+
const command = args[0];
|
|
169
|
+
const commandArgs = args.slice(1);
|
|
170
|
+
switch (command) {
|
|
171
|
+
case "send":
|
|
172
|
+
await sendCommand(commandArgs);
|
|
173
|
+
break;
|
|
174
|
+
case "tail":
|
|
175
|
+
await tailCommand(commandArgs);
|
|
176
|
+
break;
|
|
177
|
+
default:
|
|
178
|
+
console.error(`Unknown command: ${command}`);
|
|
179
|
+
console.log(USAGE);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
192
182
|
}
|
|
193
183
|
main().catch((err) => {
|
|
194
|
-
|
|
195
|
-
|
|
184
|
+
console.error("Fatal error:", err);
|
|
185
|
+
process.exit(1);
|
|
196
186
|
});
|
|
197
187
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as readline from \"readline\";\nimport { MihariClient } from \"@mihari/logger-core\";\nimport { LogLevel, MihariConfig } from \"@mihari/logger-types\";\n\nconst USAGE = `\nmihari - CLI tool for mihari log collection\n\nUsage:\n mihari send <message> [--level <level>] Send a single log message\n mihari tail Read stdin line by line and send each as a log\n\nEnvironment variables:\n MIHARI_TOKEN Authentication token (required)\n MIHARI_ENDPOINT API endpoint URL (required)\n\nOptions:\n --level <level> Log level: debug, info, warn, error, fatal (default: info)\n --help Show this help message\n\nExamples:\n mihari send \"Deployment completed\" --level info\n echo \"Error occurred\" | mihari tail\n tail -f /var/log/app.log | mihari tail --level warn\n`.trim();\n\nfunction getConfig(): MihariConfig {\n const token = process.env.MIHARI_TOKEN;\n const endpoint = process.env.MIHARI_ENDPOINT;\n\n if (!token) {\n console.error(\"Error: MIHARI_TOKEN environment variable is required\");\n process.exit(1);\n }\n\n if (!endpoint) {\n console.error(\"Error: MIHARI_ENDPOINT environment variable is required\");\n process.exit(1);\n }\n\n return { token, endpoint };\n}\n\nfunction parseLevel(levelStr: string): LogLevel {\n const normalized = levelStr.toLowerCase();\n const levelMap: Record<string, LogLevel> = {\n debug: LogLevel.Debug,\n info: LogLevel.Info,\n warn: LogLevel.Warn,\n error: LogLevel.Error,\n fatal: LogLevel.Fatal,\n };\n\n const level = levelMap[normalized];\n if (!level) {\n console.error(\n `Error: Invalid log level \"${levelStr}\". Valid levels: debug, info, warn, error, fatal`\n );\n process.exit(1);\n }\n\n return level;\n}\n\nasync function sendCommand(args: readonly string[]): Promise<void> {\n const config = getConfig();\n const client = new MihariClient(config);\n\n let message = \"\";\n let level = LogLevel.Info;\n\n const mutableArgs = [...args];\n while (mutableArgs.length > 0) {\n const arg = mutableArgs.shift()!;\n if (arg === \"--level\" && mutableArgs.length > 0) {\n level = parseLevel(mutableArgs.shift()!);\n } else if (!message) {\n message = arg;\n }\n }\n\n if (!message) {\n console.error(\"Error: Message is required for send command\");\n process.exit(1);\n }\n\n switch (level) {\n case LogLevel.Debug:\n client.debug(message);\n break;\n case LogLevel.Info:\n client.info(message);\n break;\n case LogLevel.Warn:\n client.warn(message);\n break;\n case LogLevel.Error:\n client.error(message);\n break;\n case LogLevel.Fatal:\n client.fatal(message);\n break;\n }\n\n await client.flush();\n console.log(`Sent: [${level}] ${message}`);\n}\n\nasync function tailCommand(args: readonly string[]): Promise<void> {\n const config = getConfig();\n const client = new MihariClient(config);\n\n let level = LogLevel.Info;\n\n const mutableArgs = [...args];\n while (mutableArgs.length > 0) {\n const arg = mutableArgs.shift()!;\n if (arg === \"--level\" && mutableArgs.length > 0) {\n level = parseLevel(mutableArgs.shift()!);\n }\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n\n let lineCount = 0;\n\n rl.on(\"line\", (line: string) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n switch (level) {\n case LogLevel.Debug:\n client.debug(trimmed);\n break;\n case LogLevel.Info:\n client.info(trimmed);\n break;\n case LogLevel.Warn:\n client.warn(trimmed);\n break;\n case LogLevel.Error:\n client.error(trimmed);\n break;\n case LogLevel.Fatal:\n client.fatal(trimmed);\n break;\n }\n\n lineCount++;\n });\n\n rl.on(\"close\", async () => {\n await client.shutdown();\n console.log(`Sent ${lineCount} log entries`);\n });\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(USAGE);\n process.exit(0);\n }\n\n const command = args[0];\n const commandArgs = args.slice(1);\n\n switch (command) {\n case \"send\":\n await sendCommand(commandArgs);\n break;\n case \"tail\":\n await tailCommand(commandArgs);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(USAGE);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// src/index.ts
|
|
3
4
|
import * as readline from "readline";
|
|
4
5
|
import { MihariClient } from "@mihari/logger-core";
|
|
5
|
-
import { LogLevel
|
|
6
|
-
|
|
7
|
-
const USAGE = `
|
|
6
|
+
import { LogLevel } from "@mihari/logger-types";
|
|
7
|
+
var USAGE = `
|
|
8
8
|
mihari - CLI tool for mihari log collection
|
|
9
9
|
|
|
10
10
|
Usage:
|
|
@@ -24,34 +24,28 @@ Examples:
|
|
|
24
24
|
echo "Error occurred" | mihari tail
|
|
25
25
|
tail -f /var/log/app.log | mihari tail --level warn
|
|
26
26
|
`.trim();
|
|
27
|
-
|
|
28
|
-
function getConfig(): MihariConfig {
|
|
27
|
+
function getConfig() {
|
|
29
28
|
const token = process.env.MIHARI_TOKEN;
|
|
30
29
|
const endpoint = process.env.MIHARI_ENDPOINT;
|
|
31
|
-
|
|
32
30
|
if (!token) {
|
|
33
31
|
console.error("Error: MIHARI_TOKEN environment variable is required");
|
|
34
32
|
process.exit(1);
|
|
35
33
|
}
|
|
36
|
-
|
|
37
34
|
if (!endpoint) {
|
|
38
35
|
console.error("Error: MIHARI_ENDPOINT environment variable is required");
|
|
39
36
|
process.exit(1);
|
|
40
37
|
}
|
|
41
|
-
|
|
42
38
|
return { token, endpoint };
|
|
43
39
|
}
|
|
44
|
-
|
|
45
|
-
function parseLevel(levelStr: string): LogLevel {
|
|
40
|
+
function parseLevel(levelStr) {
|
|
46
41
|
const normalized = levelStr.toLowerCase();
|
|
47
|
-
const levelMap
|
|
42
|
+
const levelMap = {
|
|
48
43
|
debug: LogLevel.Debug,
|
|
49
44
|
info: LogLevel.Info,
|
|
50
45
|
warn: LogLevel.Warn,
|
|
51
46
|
error: LogLevel.Error,
|
|
52
|
-
fatal: LogLevel.Fatal
|
|
47
|
+
fatal: LogLevel.Fatal
|
|
53
48
|
};
|
|
54
|
-
|
|
55
49
|
const level = levelMap[normalized];
|
|
56
50
|
if (!level) {
|
|
57
51
|
console.error(
|
|
@@ -59,32 +53,26 @@ function parseLevel(levelStr: string): LogLevel {
|
|
|
59
53
|
);
|
|
60
54
|
process.exit(1);
|
|
61
55
|
}
|
|
62
|
-
|
|
63
56
|
return level;
|
|
64
57
|
}
|
|
65
|
-
|
|
66
|
-
async function sendCommand(args: readonly string[]): Promise<void> {
|
|
58
|
+
async function sendCommand(args) {
|
|
67
59
|
const config = getConfig();
|
|
68
60
|
const client = new MihariClient(config);
|
|
69
|
-
|
|
70
61
|
let message = "";
|
|
71
62
|
let level = LogLevel.Info;
|
|
72
|
-
|
|
73
63
|
const mutableArgs = [...args];
|
|
74
64
|
while (mutableArgs.length > 0) {
|
|
75
|
-
const arg = mutableArgs.shift()
|
|
65
|
+
const arg = mutableArgs.shift();
|
|
76
66
|
if (arg === "--level" && mutableArgs.length > 0) {
|
|
77
|
-
level = parseLevel(mutableArgs.shift()
|
|
67
|
+
level = parseLevel(mutableArgs.shift());
|
|
78
68
|
} else if (!message) {
|
|
79
69
|
message = arg;
|
|
80
70
|
}
|
|
81
71
|
}
|
|
82
|
-
|
|
83
72
|
if (!message) {
|
|
84
73
|
console.error("Error: Message is required for send command");
|
|
85
74
|
process.exit(1);
|
|
86
75
|
}
|
|
87
|
-
|
|
88
76
|
switch (level) {
|
|
89
77
|
case LogLevel.Debug:
|
|
90
78
|
client.debug(message);
|
|
@@ -102,36 +90,28 @@ async function sendCommand(args: readonly string[]): Promise<void> {
|
|
|
102
90
|
client.fatal(message);
|
|
103
91
|
break;
|
|
104
92
|
}
|
|
105
|
-
|
|
106
93
|
await client.flush();
|
|
107
94
|
console.log(`Sent: [${level}] ${message}`);
|
|
108
95
|
}
|
|
109
|
-
|
|
110
|
-
async function tailCommand(args: readonly string[]): Promise<void> {
|
|
96
|
+
async function tailCommand(args) {
|
|
111
97
|
const config = getConfig();
|
|
112
98
|
const client = new MihariClient(config);
|
|
113
|
-
|
|
114
99
|
let level = LogLevel.Info;
|
|
115
|
-
|
|
116
100
|
const mutableArgs = [...args];
|
|
117
101
|
while (mutableArgs.length > 0) {
|
|
118
|
-
const arg = mutableArgs.shift()
|
|
102
|
+
const arg = mutableArgs.shift();
|
|
119
103
|
if (arg === "--level" && mutableArgs.length > 0) {
|
|
120
|
-
level = parseLevel(mutableArgs.shift()
|
|
104
|
+
level = parseLevel(mutableArgs.shift());
|
|
121
105
|
}
|
|
122
106
|
}
|
|
123
|
-
|
|
124
107
|
const rl = readline.createInterface({
|
|
125
108
|
input: process.stdin,
|
|
126
|
-
terminal: false
|
|
109
|
+
terminal: false
|
|
127
110
|
});
|
|
128
|
-
|
|
129
111
|
let lineCount = 0;
|
|
130
|
-
|
|
131
|
-
rl.on("line", (line: string) => {
|
|
112
|
+
rl.on("line", (line) => {
|
|
132
113
|
const trimmed = line.trim();
|
|
133
114
|
if (!trimmed) return;
|
|
134
|
-
|
|
135
115
|
switch (level) {
|
|
136
116
|
case LogLevel.Debug:
|
|
137
117
|
client.debug(trimmed);
|
|
@@ -149,27 +129,21 @@ async function tailCommand(args: readonly string[]): Promise<void> {
|
|
|
149
129
|
client.fatal(trimmed);
|
|
150
130
|
break;
|
|
151
131
|
}
|
|
152
|
-
|
|
153
132
|
lineCount++;
|
|
154
133
|
});
|
|
155
|
-
|
|
156
134
|
rl.on("close", async () => {
|
|
157
135
|
await client.shutdown();
|
|
158
136
|
console.log(`Sent ${lineCount} log entries`);
|
|
159
137
|
});
|
|
160
138
|
}
|
|
161
|
-
|
|
162
|
-
async function main(): Promise<void> {
|
|
139
|
+
async function main() {
|
|
163
140
|
const args = process.argv.slice(2);
|
|
164
|
-
|
|
165
141
|
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
166
142
|
console.log(USAGE);
|
|
167
143
|
process.exit(0);
|
|
168
144
|
}
|
|
169
|
-
|
|
170
145
|
const command = args[0];
|
|
171
146
|
const commandArgs = args.slice(1);
|
|
172
|
-
|
|
173
147
|
switch (command) {
|
|
174
148
|
case "send":
|
|
175
149
|
await sendCommand(commandArgs);
|
|
@@ -183,8 +157,8 @@ async function main(): Promise<void> {
|
|
|
183
157
|
process.exit(1);
|
|
184
158
|
}
|
|
185
159
|
}
|
|
186
|
-
|
|
187
160
|
main().catch((err) => {
|
|
188
161
|
console.error("Fatal error:", err);
|
|
189
162
|
process.exit(1);
|
|
190
163
|
});
|
|
164
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as readline from \"readline\";\nimport { MihariClient } from \"@mihari/logger-core\";\nimport { LogLevel, MihariConfig } from \"@mihari/logger-types\";\n\nconst USAGE = `\nmihari - CLI tool for mihari log collection\n\nUsage:\n mihari send <message> [--level <level>] Send a single log message\n mihari tail Read stdin line by line and send each as a log\n\nEnvironment variables:\n MIHARI_TOKEN Authentication token (required)\n MIHARI_ENDPOINT API endpoint URL (required)\n\nOptions:\n --level <level> Log level: debug, info, warn, error, fatal (default: info)\n --help Show this help message\n\nExamples:\n mihari send \"Deployment completed\" --level info\n echo \"Error occurred\" | mihari tail\n tail -f /var/log/app.log | mihari tail --level warn\n`.trim();\n\nfunction getConfig(): MihariConfig {\n const token = process.env.MIHARI_TOKEN;\n const endpoint = process.env.MIHARI_ENDPOINT;\n\n if (!token) {\n console.error(\"Error: MIHARI_TOKEN environment variable is required\");\n process.exit(1);\n }\n\n if (!endpoint) {\n console.error(\"Error: MIHARI_ENDPOINT environment variable is required\");\n process.exit(1);\n }\n\n return { token, endpoint };\n}\n\nfunction parseLevel(levelStr: string): LogLevel {\n const normalized = levelStr.toLowerCase();\n const levelMap: Record<string, LogLevel> = {\n debug: LogLevel.Debug,\n info: LogLevel.Info,\n warn: LogLevel.Warn,\n error: LogLevel.Error,\n fatal: LogLevel.Fatal,\n };\n\n const level = levelMap[normalized];\n if (!level) {\n console.error(\n `Error: Invalid log level \"${levelStr}\". Valid levels: debug, info, warn, error, fatal`\n );\n process.exit(1);\n }\n\n return level;\n}\n\nasync function sendCommand(args: readonly string[]): Promise<void> {\n const config = getConfig();\n const client = new MihariClient(config);\n\n let message = \"\";\n let level = LogLevel.Info;\n\n const mutableArgs = [...args];\n while (mutableArgs.length > 0) {\n const arg = mutableArgs.shift()!;\n if (arg === \"--level\" && mutableArgs.length > 0) {\n level = parseLevel(mutableArgs.shift()!);\n } else if (!message) {\n message = arg;\n }\n }\n\n if (!message) {\n console.error(\"Error: Message is required for send command\");\n process.exit(1);\n }\n\n switch (level) {\n case LogLevel.Debug:\n client.debug(message);\n break;\n case LogLevel.Info:\n client.info(message);\n break;\n case LogLevel.Warn:\n client.warn(message);\n break;\n case LogLevel.Error:\n client.error(message);\n break;\n case LogLevel.Fatal:\n client.fatal(message);\n break;\n }\n\n await client.flush();\n console.log(`Sent: [${level}] ${message}`);\n}\n\nasync function tailCommand(args: readonly string[]): Promise<void> {\n const config = getConfig();\n const client = new MihariClient(config);\n\n let level = LogLevel.Info;\n\n const mutableArgs = [...args];\n while (mutableArgs.length > 0) {\n const arg = mutableArgs.shift()!;\n if (arg === \"--level\" && mutableArgs.length > 0) {\n level = parseLevel(mutableArgs.shift()!);\n }\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n\n let lineCount = 0;\n\n rl.on(\"line\", (line: string) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n switch (level) {\n case LogLevel.Debug:\n client.debug(trimmed);\n break;\n case LogLevel.Info:\n client.info(trimmed);\n break;\n case LogLevel.Warn:\n client.warn(trimmed);\n break;\n case LogLevel.Error:\n client.error(trimmed);\n break;\n case LogLevel.Fatal:\n client.fatal(trimmed);\n break;\n }\n\n lineCount++;\n });\n\n rl.on(\"close\", async () => {\n await client.shutdown();\n console.log(`Sent ${lineCount} log entries`);\n });\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(USAGE);\n process.exit(0);\n }\n\n const command = args[0];\n const commandArgs = args.slice(1);\n\n switch (command) {\n case \"send\":\n await sendCommand(commandArgs);\n break;\n case \"tail\":\n await tailCommand(commandArgs);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(USAGE);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mihari/logger-tool",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI tool for mihari log collection",
|
|
5
|
-
"main": "
|
|
6
|
-
"
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
7
15
|
"bin": {
|
|
8
16
|
"mihari": "./dist/index.js"
|
|
9
17
|
},
|
|
@@ -11,16 +19,30 @@
|
|
|
11
19
|
"dist"
|
|
12
20
|
],
|
|
13
21
|
"scripts": {
|
|
14
|
-
"build": "
|
|
22
|
+
"build": "tsup",
|
|
15
23
|
"clean": "rm -rf dist",
|
|
16
24
|
"test": "cd ../.. && npx vitest run --config vitest.config.ts packages/tool"
|
|
17
25
|
},
|
|
18
|
-
"
|
|
19
|
-
"
|
|
26
|
+
"tsup": {
|
|
27
|
+
"entry": [
|
|
28
|
+
"src/index.ts"
|
|
29
|
+
],
|
|
30
|
+
"format": [
|
|
31
|
+
"cjs",
|
|
32
|
+
"esm"
|
|
33
|
+
],
|
|
34
|
+
"dts": true,
|
|
35
|
+
"splitting": false,
|
|
36
|
+
"sourcemap": true,
|
|
37
|
+
"clean": true,
|
|
38
|
+
"external": [
|
|
39
|
+
"@mihari/logger-core",
|
|
40
|
+
"@mihari/logger-types"
|
|
41
|
+
]
|
|
20
42
|
},
|
|
21
43
|
"dependencies": {
|
|
22
|
-
"@mihari/logger-core": "^0.
|
|
23
|
-
"@mihari/logger-types": "^0.
|
|
44
|
+
"@mihari/logger-core": "^0.2.0",
|
|
45
|
+
"@mihari/logger-types": "^0.2.0"
|
|
24
46
|
},
|
|
25
47
|
"publishConfig": {
|
|
26
48
|
"access": "public"
|
|
@@ -31,5 +53,5 @@
|
|
|
31
53
|
"url": "https://github.com/mihari/mihari-js",
|
|
32
54
|
"directory": "packages/tool"
|
|
33
55
|
},
|
|
34
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "a0a2dd591dafbf0923bb81bd5d8180fa6d6eecea"
|
|
35
57
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|