lograil 0.1.1 → 0.1.4

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.
Files changed (122) hide show
  1. package/CHANGELOG.md +105 -1
  2. package/dist/cjs/context/async-context.browser.d.ts +1 -7
  3. package/dist/cjs/context/async-context.browser.d.ts.map +1 -1
  4. package/dist/cjs/context/async-context.browser.js +4 -1
  5. package/dist/cjs/context/async-context.browser.js.map +1 -1
  6. package/dist/cjs/context/context.js +1 -1
  7. package/dist/cjs/context/context.js.map +1 -1
  8. package/dist/cjs/core/logger.d.ts +2 -0
  9. package/dist/cjs/core/logger.d.ts.map +1 -1
  10. package/dist/cjs/core/logger.js +11 -1
  11. package/dist/cjs/core/logger.js.map +1 -1
  12. package/dist/cjs/pipeline/formatter.d.ts.map +1 -1
  13. package/dist/cjs/pipeline/formatter.js +37 -21
  14. package/dist/cjs/pipeline/formatter.js.map +1 -1
  15. package/dist/cjs/pipeline/pipeline.d.ts.map +1 -1
  16. package/dist/cjs/pipeline/pipeline.js +2 -1
  17. package/dist/cjs/pipeline/pipeline.js.map +1 -1
  18. package/dist/cjs/pipeline/sampler.d.ts.map +1 -1
  19. package/dist/cjs/pipeline/sampler.js +5 -0
  20. package/dist/cjs/pipeline/sampler.js.map +1 -1
  21. package/dist/cjs/plugin/otel-trace.d.ts.map +1 -1
  22. package/dist/cjs/plugin/otel-trace.js +4 -7
  23. package/dist/cjs/plugin/otel-trace.js.map +1 -1
  24. package/dist/cjs/runtime/electron-binding.d.ts +4 -0
  25. package/dist/cjs/runtime/electron-binding.d.ts.map +1 -1
  26. package/dist/cjs/runtime/electron-binding.js +24 -2
  27. package/dist/cjs/runtime/electron-binding.js.map +1 -1
  28. package/dist/cjs/runtime/electron.d.ts.map +1 -1
  29. package/dist/cjs/runtime/electron.js +7 -1
  30. package/dist/cjs/runtime/electron.js.map +1 -1
  31. package/dist/cjs/runtime/process-lifecycle.d.ts.map +1 -1
  32. package/dist/cjs/runtime/process-lifecycle.js +11 -0
  33. package/dist/cjs/runtime/process-lifecycle.js.map +1 -1
  34. package/dist/cjs/transport/cluster-ipc.d.ts +2 -0
  35. package/dist/cjs/transport/cluster-ipc.d.ts.map +1 -1
  36. package/dist/cjs/transport/cluster-ipc.js +53 -5
  37. package/dist/cjs/transport/cluster-ipc.js.map +1 -1
  38. package/dist/cjs/transport/console.d.ts.map +1 -1
  39. package/dist/cjs/transport/console.js +10 -9
  40. package/dist/cjs/transport/console.js.map +1 -1
  41. package/dist/cjs/transport/electron-ipc.d.ts +4 -17
  42. package/dist/cjs/transport/electron-ipc.d.ts.map +1 -1
  43. package/dist/cjs/transport/electron-ipc.js +42 -73
  44. package/dist/cjs/transport/electron-ipc.js.map +1 -1
  45. package/dist/cjs/transport/file.d.ts +3 -1
  46. package/dist/cjs/transport/file.d.ts.map +1 -1
  47. package/dist/cjs/transport/file.js +10 -4
  48. package/dist/cjs/transport/file.js.map +1 -1
  49. package/dist/cjs/transport/live.js +1 -1
  50. package/dist/cjs/transport/live.js.map +1 -1
  51. package/dist/cjs/transport/worker-ipc.d.ts +2 -0
  52. package/dist/cjs/transport/worker-ipc.d.ts.map +1 -1
  53. package/dist/cjs/transport/worker-ipc.js +69 -9
  54. package/dist/cjs/transport/worker-ipc.js.map +1 -1
  55. package/dist/cjs/types.d.ts +2 -0
  56. package/dist/cjs/types.d.ts.map +1 -1
  57. package/dist/cjs/types.js.map +1 -1
  58. package/dist/esm/context/async-context.browser.d.ts +1 -7
  59. package/dist/esm/context/async-context.browser.d.ts.map +1 -1
  60. package/dist/esm/context/async-context.browser.js +4 -1
  61. package/dist/esm/context/async-context.browser.js.map +1 -1
  62. package/dist/esm/context/context.js +1 -1
  63. package/dist/esm/context/context.js.map +1 -1
  64. package/dist/esm/core/logger.d.ts +2 -0
  65. package/dist/esm/core/logger.d.ts.map +1 -1
  66. package/dist/esm/core/logger.js +11 -1
  67. package/dist/esm/core/logger.js.map +1 -1
  68. package/dist/esm/pipeline/formatter.d.ts.map +1 -1
  69. package/dist/esm/pipeline/formatter.js +37 -21
  70. package/dist/esm/pipeline/formatter.js.map +1 -1
  71. package/dist/esm/pipeline/pipeline.d.ts.map +1 -1
  72. package/dist/esm/pipeline/pipeline.js +2 -1
  73. package/dist/esm/pipeline/pipeline.js.map +1 -1
  74. package/dist/esm/pipeline/sampler.d.ts.map +1 -1
  75. package/dist/esm/pipeline/sampler.js +5 -0
  76. package/dist/esm/pipeline/sampler.js.map +1 -1
  77. package/dist/esm/plugin/otel-trace.d.ts.map +1 -1
  78. package/dist/esm/plugin/otel-trace.js +4 -7
  79. package/dist/esm/plugin/otel-trace.js.map +1 -1
  80. package/dist/esm/runtime/electron-binding.d.ts +4 -0
  81. package/dist/esm/runtime/electron-binding.d.ts.map +1 -1
  82. package/dist/esm/runtime/electron-binding.js +24 -2
  83. package/dist/esm/runtime/electron-binding.js.map +1 -1
  84. package/dist/esm/runtime/electron.d.ts.map +1 -1
  85. package/dist/esm/runtime/electron.js +7 -1
  86. package/dist/esm/runtime/electron.js.map +1 -1
  87. package/dist/esm/runtime/process-lifecycle.d.ts.map +1 -1
  88. package/dist/esm/runtime/process-lifecycle.js +11 -0
  89. package/dist/esm/runtime/process-lifecycle.js.map +1 -1
  90. package/dist/esm/transport/cluster-ipc.d.ts +2 -0
  91. package/dist/esm/transport/cluster-ipc.d.ts.map +1 -1
  92. package/dist/esm/transport/cluster-ipc.js +52 -5
  93. package/dist/esm/transport/cluster-ipc.js.map +1 -1
  94. package/dist/esm/transport/console.d.ts.map +1 -1
  95. package/dist/esm/transport/console.js +10 -9
  96. package/dist/esm/transport/console.js.map +1 -1
  97. package/dist/esm/transport/electron-ipc.d.ts +4 -17
  98. package/dist/esm/transport/electron-ipc.d.ts.map +1 -1
  99. package/dist/esm/transport/electron-ipc.js +42 -71
  100. package/dist/esm/transport/electron-ipc.js.map +1 -1
  101. package/dist/esm/transport/file.d.ts +3 -1
  102. package/dist/esm/transport/file.d.ts.map +1 -1
  103. package/dist/esm/transport/file.js +10 -4
  104. package/dist/esm/transport/file.js.map +1 -1
  105. package/dist/esm/transport/live.js +1 -1
  106. package/dist/esm/transport/live.js.map +1 -1
  107. package/dist/esm/transport/worker-ipc.d.ts +2 -0
  108. package/dist/esm/transport/worker-ipc.d.ts.map +1 -1
  109. package/dist/esm/transport/worker-ipc.js +68 -9
  110. package/dist/esm/transport/worker-ipc.js.map +1 -1
  111. package/dist/esm/types.d.ts +2 -0
  112. package/dist/esm/types.d.ts.map +1 -1
  113. package/dist/esm/types.js.map +1 -1
  114. package/package.json +12 -3
  115. package/dist/cjs/transport/rotating-file.d.ts +0 -67
  116. package/dist/cjs/transport/rotating-file.d.ts.map +0 -1
  117. package/dist/cjs/transport/rotating-file.js +0 -179
  118. package/dist/cjs/transport/rotating-file.js.map +0 -1
  119. package/dist/esm/transport/rotating-file.d.ts +0 -67
  120. package/dist/esm/transport/rotating-file.d.ts.map +0 -1
  121. package/dist/esm/transport/rotating-file.js +0 -175
  122. package/dist/esm/transport/rotating-file.js.map +0 -1
@@ -1,175 +0,0 @@
1
- import { mkdir, open, rename, stat, truncate } from 'node:fs/promises';
2
- import { dirname, extname } from 'node:path';
3
- import { createJsonFormatter } from '../pipeline/formatter.js';
4
- const DEFAULT_MAX_SIZE = 10 * 1024 * 1024;
5
- const DEFAULT_MAX_FILES = 5;
6
- const DEFAULT_MAX_FILES_DAILY = 99;
7
- function dateStamp(d) {
8
- const y = d.getFullYear();
9
- const m = String(d.getMonth() + 1).padStart(2, '0');
10
- const day = String(d.getDate()).padStart(2, '0');
11
- return `${y}-${m}-${day}`;
12
- }
13
- /**
14
- * File transport with rotation, for the Electron main process (Node.js).
15
- *
16
- * Two modes:
17
- * - **Daily** (default): the active file is
18
- * `{name}.{YYYY-MM-DD}.{index}.log`, where `index` runs `01`..`maxFiles`
19
- * (default 99). When it would pass `maxFiles` it wraps back to `01` and
20
- * that file is cleared — a `maxFiles`-file ring buffer per day. When the
21
- * local day changes, the index resets to `01` for the new day.
22
- */
23
- export class RotatingFileTransport {
24
- constructor(options) {
25
- this.handle = null;
26
- this.queue = Promise.resolve();
27
- this.size = 0;
28
- this.sizeInitialized = false;
29
- this.index = 1;
30
- if (!options.path) {
31
- throw new Error('RotatingFileTransport requires a "path"');
32
- }
33
- this.path = options.path;
34
- this.daily = options.daily ?? true;
35
- this.maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
36
- this.maxFiles = options.maxFiles ?? (this.daily ? DEFAULT_MAX_FILES_DAILY : DEFAULT_MAX_FILES);
37
- if (!this.daily) {
38
- this.maxFiles = Math.max(2, this.maxFiles);
39
- }
40
- else {
41
- this.maxFiles = Math.max(1, this.maxFiles);
42
- }
43
- this.now = options.now ?? (() => new Date());
44
- this.name = options.name ?? `rotating-file:${options.path}`;
45
- this.formatter = options.formatter ?? createJsonFormatter();
46
- }
47
- activePath() {
48
- if (!this.daily) {
49
- return this.path;
50
- }
51
- const ext = extname(this.path);
52
- const base = ext ? this.path.slice(0, -ext.length) : this.path;
53
- const idx = String(this.index).padStart(2, '0');
54
- return `${base}.${this.currentDate}.${idx}${ext}`;
55
- }
56
- async ensureHandle() {
57
- if (!this.handle) {
58
- await mkdir(dirname(this.activePath()), { recursive: true });
59
- this.handle = await open(this.activePath(), 'a');
60
- }
61
- }
62
- async ensureSize() {
63
- if (this.sizeInitialized)
64
- return;
65
- try {
66
- const st = await stat(this.activePath());
67
- this.size = st.size;
68
- }
69
- catch {
70
- this.size = 0;
71
- }
72
- this.sizeInitialized = true;
73
- }
74
- async rotateSize() {
75
- if (this.handle) {
76
- await this.handle.close();
77
- this.handle = null;
78
- }
79
- const gens = this.maxFiles - 1;
80
- for (let k = gens; k >= 2; k--) {
81
- try {
82
- await rename(`${this.path}.${k - 1}`, `${this.path}.${k}`);
83
- }
84
- catch {
85
- /* generation missing — skip */
86
- }
87
- }
88
- try {
89
- await rename(this.path, `${this.path}.1`);
90
- }
91
- catch {
92
- /* nothing to rotate yet */
93
- }
94
- this.size = 0;
95
- this.sizeInitialized = true;
96
- await this.ensureHandle();
97
- }
98
- /**
99
- * Move to a new index file. When `clear` is true the target file is
100
- * truncated first (used both for normal index advancement and for the
101
- * wrap-to-01, which must clear the stale `01` slot).
102
- */
103
- async rotateToIndex(idx, clear) {
104
- if (this.handle) {
105
- await this.handle.close();
106
- this.handle = null;
107
- }
108
- this.index = idx;
109
- if (clear) {
110
- try {
111
- await truncate(this.activePath(), 0);
112
- }
113
- catch {
114
- /* file did not exist yet — fine */
115
- }
116
- this.size = 0;
117
- this.sizeInitialized = true;
118
- }
119
- await this.ensureHandle();
120
- if (!clear) {
121
- await this.ensureSize();
122
- }
123
- }
124
- write(_entry, formatted) {
125
- const line = formatted + '\n';
126
- const bytes = Buffer.byteLength(line, 'utf8');
127
- const task = this.queue
128
- .then(async () => {
129
- if (!this.daily) {
130
- await this.ensureSize();
131
- if (this.size + bytes > this.maxSize) {
132
- await this.rotateSize();
133
- }
134
- }
135
- else {
136
- const today = dateStamp(this.now());
137
- if (this.currentDate === undefined || today !== this.currentDate) {
138
- // First open, or a new day: reset to index 01 (resume/append).
139
- this.currentDate = today;
140
- this.index = 1;
141
- await this.rotateToIndex(1, false);
142
- }
143
- else {
144
- await this.ensureSize();
145
- if (this.size + bytes > this.maxSize) {
146
- let next = this.index + 1;
147
- if (next > this.maxFiles) {
148
- next = 1; // wrap and clear the 01 slot
149
- }
150
- await this.rotateToIndex(next, true);
151
- }
152
- }
153
- }
154
- await this.ensureHandle();
155
- await this.handle.write(line);
156
- this.size += bytes;
157
- })
158
- .catch(() => {
159
- /* swallow write errors to avoid crashing the app */
160
- });
161
- this.queue = task;
162
- return task;
163
- }
164
- async flush() {
165
- await this.queue;
166
- }
167
- async close() {
168
- await this.queue;
169
- if (this.handle) {
170
- await this.handle.close();
171
- this.handle = null;
172
- }
173
- }
174
- }
175
- //# sourceMappingURL=rotating-file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rotating-file.js","sourceRoot":"","sources":["../../../src/transport/rotating-file.ts"],"names":[],"mappings":"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"}