electron-loki-logger 1.0.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/README.md ADDED
@@ -0,0 +1,17 @@
1
+
2
+ # electron-loki
3
+
4
+ Production-ready Loki logger for Electron applications.
5
+
6
+ ```ts
7
+ import LokiLogger from 'electron-loki-logger';
8
+
9
+ const logger = new LokiLogger('my-electron-app', {
10
+ env: process.env.NODE_ENV,
11
+ lokiUrl: 'http://your-loki:3100/loki/api/v1/push',
12
+ extraTags: { version: '1.2.3' }
13
+ });
14
+
15
+ logger.info('App started');
16
+ logger.error('Something went wrong', { code: 500 });
17
+ logger.success('Database connected');
@@ -0,0 +1,28 @@
1
+ interface LokiLoggerOptions {
2
+ lokiUrl?: string;
3
+ env?: string;
4
+ extraTags?: Record<string, string>;
5
+ enableConsole?: boolean;
6
+ queueSize?: number;
7
+ }
8
+ export declare class LokiLogger {
9
+ private appName;
10
+ private lokiUrl;
11
+ private env;
12
+ private extraTags;
13
+ private enableConsole;
14
+ private queue;
15
+ constructor(appName: string, options?: LokiLoggerOptions);
16
+ private getCallerInfo;
17
+ private formatMessage;
18
+ private send;
19
+ info(msg: any, ...args: any[]): void;
20
+ error(msg: any, ...args: any[]): void;
21
+ warning(msg: any, ...args: any[]): void;
22
+ warn(msg: any, ...args: any[]): void;
23
+ debug(msg: any, ...args: any[]): void;
24
+ critical(msg: any, ...args: any[]): void;
25
+ success(msg: any, ...args: any[]): void;
26
+ }
27
+ export default LokiLogger;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwDD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,KAAK,CAAW;gBAEZ,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAqB5D,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,IAAI;IAYZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI7B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI9B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIhC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI7B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI9B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIjC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGjC;AAGD,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ interface LokiLoggerOptions {
2
+ lokiUrl?: string;
3
+ env?: string;
4
+ extraTags?: Record<string, string>;
5
+ enableConsole?: boolean;
6
+ queueSize?: number;
7
+ }
8
+ export declare class LokiLogger {
9
+ private appName;
10
+ private lokiUrl;
11
+ private env;
12
+ private extraTags;
13
+ private enableConsole;
14
+ private queue;
15
+ constructor(appName: string, options?: LokiLoggerOptions);
16
+ private getCallerInfo;
17
+ private formatMessage;
18
+ private send;
19
+ info(msg: any, ...args: any[]): void;
20
+ error(msg: any, ...args: any[]): void;
21
+ warning(msg: any, ...args: any[]): void;
22
+ warn(msg: any, ...args: any[]): void;
23
+ debug(msg: any, ...args: any[]): void;
24
+ critical(msg: any, ...args: any[]): void;
25
+ success(msg: any, ...args: any[]): void;
26
+ }
27
+ export default LokiLogger;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwDD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,KAAK,CAAW;gBAEZ,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAqB5D,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,IAAI;IAYZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI7B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI9B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIhC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI7B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAI9B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIjC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGjC;AAGD,eAAe,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,138 @@
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.LokiLogger = void 0;
7
+ const os_1 = __importDefault(require("os"));
8
+ const axios_1 = __importDefault(require("axios"));
9
+ class SafeLokiHandler {
10
+ constructor(url, tags) {
11
+ this.url = url;
12
+ this.tags = tags;
13
+ }
14
+ async emit(record) {
15
+ try {
16
+ const logLine = {
17
+ stream: this.tags,
18
+ values: [[(Date.now() * 1000000).toString(), record]],
19
+ };
20
+ await axios_1.default.post(this.url, { streams: [logLine] }, {
21
+ headers: { 'Content-Type': 'application/json' },
22
+ timeout: 5000,
23
+ });
24
+ }
25
+ catch {
26
+ // 完全静默,绝不影响主进程
27
+ }
28
+ }
29
+ }
30
+ class LogQueue {
31
+ constructor(handler) {
32
+ this.queue = [];
33
+ this.isProcessing = false;
34
+ this.handler = handler;
35
+ }
36
+ push(item) {
37
+ this.queue.push(item);
38
+ if (!this.isProcessing)
39
+ this.process();
40
+ }
41
+ async process() {
42
+ this.isProcessing = true;
43
+ while (this.queue.length > 0) {
44
+ const item = this.queue.shift();
45
+ await this.handler.emit(item);
46
+ }
47
+ this.isProcessing = false;
48
+ }
49
+ }
50
+ class LokiLogger {
51
+ constructor(appName, options = {}) {
52
+ this.appName = appName;
53
+ this.lokiUrl = options.lokiUrl || 'http://localhost:3100/loki/api/v1/push';
54
+ this.env = options.env || 'development';
55
+ this.extraTags = options.extraTags || {};
56
+ this.enableConsole = options.enableConsole !== false;
57
+ const tags = {
58
+ app: this.appName,
59
+ env: this.env,
60
+ host: os_1.default.hostname(),
61
+ platform: process.platform,
62
+ ...this.extraTags,
63
+ };
64
+ const handler = new SafeLokiHandler(this.lokiUrl, tags);
65
+ this.queue = new LogQueue(handler);
66
+ this.info(`🚀 LokiLogger initialized: ${appName} (${this.env})`);
67
+ }
68
+ getCallerInfo() {
69
+ const err = new Error();
70
+ const stack = err.stack?.split('\n') || [];
71
+ const callerLine = stack[3] || stack[2] || '';
72
+ const match = callerLine.match(/\((.+?):(\d+):\d+\)/) || callerLine.match(/at (.+?):(\d+):\d+/);
73
+ let filePath = 'unknown';
74
+ let lineNo = '0';
75
+ if (match) {
76
+ filePath = match[1].replace(process.cwd(), '').replace(/\\/g, '/');
77
+ lineNo = match[2];
78
+ }
79
+ return {
80
+ path: `${filePath}:${lineNo}`,
81
+ ip: os_1.default.hostname().replace(/-/g, '.'),
82
+ };
83
+ }
84
+ formatMessage(msg, ...args) {
85
+ const logObj = {};
86
+ if (msg && typeof msg === 'object' && !Array.isArray(msg)) {
87
+ Object.assign(logObj, msg);
88
+ }
89
+ else {
90
+ logObj.msg = msg;
91
+ }
92
+ if (args.length > 0)
93
+ logObj.args = args;
94
+ const caller = this.getCallerInfo();
95
+ logObj.path = caller.path;
96
+ logObj.ip = caller.ip;
97
+ try {
98
+ return JSON.stringify(logObj, null, 0);
99
+ }
100
+ catch {
101
+ return String(msg);
102
+ }
103
+ }
104
+ send(level, message) {
105
+ const timestamp = new Date().toISOString();
106
+ const record = `[${level.toUpperCase()}] ${message}`;
107
+ if (this.enableConsole) {
108
+ const method = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';
109
+ console[method](`[${timestamp}]`, record);
110
+ }
111
+ this.queue.push(record);
112
+ }
113
+ info(msg, ...args) {
114
+ this.send('info', this.formatMessage(msg, ...args));
115
+ }
116
+ error(msg, ...args) {
117
+ this.send('error', this.formatMessage(msg, ...args));
118
+ }
119
+ warning(msg, ...args) {
120
+ this.send('warn', this.formatMessage(msg, ...args));
121
+ }
122
+ warn(msg, ...args) {
123
+ this.warning(msg, ...args);
124
+ }
125
+ debug(msg, ...args) {
126
+ this.send('debug', this.formatMessage(msg, ...args));
127
+ }
128
+ critical(msg, ...args) {
129
+ this.send('critical', this.formatMessage(msg, ...args));
130
+ }
131
+ success(msg, ...args) {
132
+ this.send('info', `✅ ${this.formatMessage(msg, ...args)}`);
133
+ }
134
+ }
135
+ exports.LokiLogger = LokiLogger;
136
+ // 默认导出
137
+ exports.default = LokiLogger;
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs ADDED
@@ -0,0 +1,131 @@
1
+ import os from 'os';
2
+ import axios from 'axios';
3
+ class SafeLokiHandler {
4
+ constructor(url, tags) {
5
+ this.url = url;
6
+ this.tags = tags;
7
+ }
8
+ async emit(record) {
9
+ try {
10
+ const logLine = {
11
+ stream: this.tags,
12
+ values: [[(Date.now() * 1000000).toString(), record]],
13
+ };
14
+ await axios.post(this.url, { streams: [logLine] }, {
15
+ headers: { 'Content-Type': 'application/json' },
16
+ timeout: 5000,
17
+ });
18
+ }
19
+ catch {
20
+ // 完全静默,绝不影响主进程
21
+ }
22
+ }
23
+ }
24
+ class LogQueue {
25
+ constructor(handler) {
26
+ this.queue = [];
27
+ this.isProcessing = false;
28
+ this.handler = handler;
29
+ }
30
+ push(item) {
31
+ this.queue.push(item);
32
+ if (!this.isProcessing)
33
+ this.process();
34
+ }
35
+ async process() {
36
+ this.isProcessing = true;
37
+ while (this.queue.length > 0) {
38
+ const item = this.queue.shift();
39
+ await this.handler.emit(item);
40
+ }
41
+ this.isProcessing = false;
42
+ }
43
+ }
44
+ export class LokiLogger {
45
+ constructor(appName, options = {}) {
46
+ this.appName = appName;
47
+ this.lokiUrl = options.lokiUrl || 'http://localhost:3100/loki/api/v1/push';
48
+ this.env = options.env || 'development';
49
+ this.extraTags = options.extraTags || {};
50
+ this.enableConsole = options.enableConsole !== false;
51
+ const tags = {
52
+ app: this.appName,
53
+ env: this.env,
54
+ host: os.hostname(),
55
+ platform: process.platform,
56
+ ...this.extraTags,
57
+ };
58
+ const handler = new SafeLokiHandler(this.lokiUrl, tags);
59
+ this.queue = new LogQueue(handler);
60
+ this.info(`🚀 LokiLogger initialized: ${appName} (${this.env})`);
61
+ }
62
+ getCallerInfo() {
63
+ const err = new Error();
64
+ const stack = err.stack?.split('\n') || [];
65
+ const callerLine = stack[3] || stack[2] || '';
66
+ const match = callerLine.match(/\((.+?):(\d+):\d+\)/) || callerLine.match(/at (.+?):(\d+):\d+/);
67
+ let filePath = 'unknown';
68
+ let lineNo = '0';
69
+ if (match) {
70
+ filePath = match[1].replace(process.cwd(), '').replace(/\\/g, '/');
71
+ lineNo = match[2];
72
+ }
73
+ return {
74
+ path: `${filePath}:${lineNo}`,
75
+ ip: os.hostname().replace(/-/g, '.'),
76
+ };
77
+ }
78
+ formatMessage(msg, ...args) {
79
+ const logObj = {};
80
+ if (msg && typeof msg === 'object' && !Array.isArray(msg)) {
81
+ Object.assign(logObj, msg);
82
+ }
83
+ else {
84
+ logObj.msg = msg;
85
+ }
86
+ if (args.length > 0)
87
+ logObj.args = args;
88
+ const caller = this.getCallerInfo();
89
+ logObj.path = caller.path;
90
+ logObj.ip = caller.ip;
91
+ try {
92
+ return JSON.stringify(logObj, null, 0);
93
+ }
94
+ catch {
95
+ return String(msg);
96
+ }
97
+ }
98
+ send(level, message) {
99
+ const timestamp = new Date().toISOString();
100
+ const record = `[${level.toUpperCase()}] ${message}`;
101
+ if (this.enableConsole) {
102
+ const method = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';
103
+ console[method](`[${timestamp}]`, record);
104
+ }
105
+ this.queue.push(record);
106
+ }
107
+ info(msg, ...args) {
108
+ this.send('info', this.formatMessage(msg, ...args));
109
+ }
110
+ error(msg, ...args) {
111
+ this.send('error', this.formatMessage(msg, ...args));
112
+ }
113
+ warning(msg, ...args) {
114
+ this.send('warn', this.formatMessage(msg, ...args));
115
+ }
116
+ warn(msg, ...args) {
117
+ this.warning(msg, ...args);
118
+ }
119
+ debug(msg, ...args) {
120
+ this.send('debug', this.formatMessage(msg, ...args));
121
+ }
122
+ critical(msg, ...args) {
123
+ this.send('critical', this.formatMessage(msg, ...args));
124
+ }
125
+ success(msg, ...args) {
126
+ this.send('info', `✅ ${this.formatMessage(msg, ...args)}`);
127
+ }
128
+ }
129
+ // 默认导出
130
+ export default LokiLogger;
131
+ //# sourceMappingURL=index.js.map
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "electron-loki-logger",
3
+ "version": "1.0.0",
4
+ "description": "Production-ready Loki logger for Electron",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "rimraf dist && tsc && tsc --module esnext --outDir dist/esm && shx mv dist/esm/index.js dist/index.mjs",
17
+ "build:clean": "npm run build",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "dependencies": {
21
+ "axios": "^1.7.2"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^20.14.0",
25
+ "rimraf": "^5.0.10",
26
+ "shx": "^0.3.4",
27
+ "typescript": "^5.5.4"
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ]
32
+ }