@spinajs/log 2.0.481 → 2.0.482

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 (304) hide show
  1. package/README.md +744 -0
  2. package/lib/cjs/archive/LogArchiveService.d.ts +75 -0
  3. package/lib/cjs/archive/LogArchiveService.d.ts.map +1 -0
  4. package/lib/cjs/archive/LogArchiveService.js +189 -0
  5. package/lib/cjs/archive/LogArchiveService.js.map +1 -0
  6. package/lib/cjs/archive/archive-strategy.d.ts +32 -0
  7. package/lib/cjs/archive/archive-strategy.d.ts.map +1 -0
  8. package/lib/cjs/archive/archive-strategy.js +43 -0
  9. package/lib/cjs/archive/archive-strategy.js.map +1 -0
  10. package/lib/cjs/archive/context.d.ts +50 -0
  11. package/lib/cjs/archive/context.d.ts.map +1 -0
  12. package/lib/cjs/archive/context.js +3 -0
  13. package/lib/cjs/archive/context.js.map +1 -0
  14. package/lib/cjs/archive/index.d.ts +10 -0
  15. package/lib/cjs/archive/index.d.ts.map +1 -0
  16. package/lib/cjs/archive/index.js +26 -0
  17. package/lib/cjs/archive/index.js.map +1 -0
  18. package/lib/cjs/archive/retention-strategy.d.ts +26 -0
  19. package/lib/cjs/archive/retention-strategy.d.ts.map +1 -0
  20. package/lib/cjs/archive/retention-strategy.js +42 -0
  21. package/lib/cjs/archive/retention-strategy.js.map +1 -0
  22. package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.d.ts +10 -0
  23. package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.d.ts.map +1 -0
  24. package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.js +46 -0
  25. package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.js.map +1 -0
  26. package/lib/cjs/archive/strategies/CountLogRetentionStrategy.d.ts +10 -0
  27. package/lib/cjs/archive/strategies/CountLogRetentionStrategy.d.ts.map +1 -0
  28. package/lib/cjs/archive/strategies/CountLogRetentionStrategy.js +42 -0
  29. package/lib/cjs/archive/strategies/CountLogRetentionStrategy.js.map +1 -0
  30. package/lib/cjs/archive/strategies/CronLogArchiveStrategy.d.ts +15 -0
  31. package/lib/cjs/archive/strategies/CronLogArchiveStrategy.d.ts.map +1 -0
  32. package/lib/cjs/archive/strategies/CronLogArchiveStrategy.js +52 -0
  33. package/lib/cjs/archive/strategies/CronLogArchiveStrategy.js.map +1 -0
  34. package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.d.ts +18 -0
  35. package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.d.ts.map +1 -0
  36. package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.js +63 -0
  37. package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.js.map +1 -0
  38. package/lib/cjs/archive/strategies/util.d.ts +28 -0
  39. package/lib/cjs/archive/strategies/util.d.ts.map +1 -0
  40. package/lib/cjs/archive/strategies/util.js +59 -0
  41. package/lib/cjs/archive/strategies/util.js.map +1 -0
  42. package/lib/cjs/bootstrap.d.ts.map +1 -1
  43. package/lib/cjs/bootstrap.js +24 -1
  44. package/lib/cjs/bootstrap.js.map +1 -1
  45. package/lib/cjs/callsite.d.ts +26 -0
  46. package/lib/cjs/callsite.d.ts.map +1 -0
  47. package/lib/cjs/callsite.js +60 -0
  48. package/lib/cjs/callsite.js.map +1 -0
  49. package/lib/cjs/config/log.d.ts +96 -0
  50. package/lib/cjs/config/log.d.ts.map +1 -0
  51. package/lib/cjs/config/log.js +75 -0
  52. package/lib/cjs/config/log.js.map +1 -0
  53. package/lib/cjs/context.browser.d.ts +46 -0
  54. package/lib/cjs/context.browser.d.ts.map +1 -0
  55. package/lib/cjs/context.browser.js +85 -0
  56. package/lib/cjs/context.browser.js.map +1 -0
  57. package/lib/cjs/context.d.ts +61 -0
  58. package/lib/cjs/context.d.ts.map +1 -0
  59. package/lib/cjs/context.js +92 -0
  60. package/lib/cjs/context.js.map +1 -0
  61. package/lib/cjs/filters/LevelFilter.d.ts +24 -0
  62. package/lib/cjs/filters/LevelFilter.d.ts.map +1 -0
  63. package/lib/cjs/filters/LevelFilter.js +39 -0
  64. package/lib/cjs/filters/LevelFilter.js.map +1 -0
  65. package/lib/cjs/filters/MatchFilter.d.ts +30 -0
  66. package/lib/cjs/filters/MatchFilter.d.ts.map +1 -0
  67. package/lib/cjs/filters/MatchFilter.js +65 -0
  68. package/lib/cjs/filters/MatchFilter.js.map +1 -0
  69. package/lib/cjs/filters/RateLimitFilter.d.ts +37 -0
  70. package/lib/cjs/filters/RateLimitFilter.d.ts.map +1 -0
  71. package/lib/cjs/filters/RateLimitFilter.js +70 -0
  72. package/lib/cjs/filters/RateLimitFilter.js.map +1 -0
  73. package/lib/cjs/filters/index.d.ts +4 -0
  74. package/lib/cjs/filters/index.d.ts.map +1 -0
  75. package/lib/cjs/filters/index.js +20 -0
  76. package/lib/cjs/filters/index.js.map +1 -0
  77. package/lib/cjs/index.browser.d.ts +14 -0
  78. package/lib/cjs/index.browser.d.ts.map +1 -0
  79. package/lib/cjs/index.browser.js +46 -0
  80. package/lib/cjs/index.browser.js.map +1 -0
  81. package/lib/cjs/index.d.ts +8 -0
  82. package/lib/cjs/index.d.ts.map +1 -1
  83. package/lib/cjs/index.js +8 -0
  84. package/lib/cjs/index.js.map +1 -1
  85. package/lib/cjs/log.d.ts +60 -1
  86. package/lib/cjs/log.d.ts.map +1 -1
  87. package/lib/cjs/log.js +294 -32
  88. package/lib/cjs/log.js.map +1 -1
  89. package/lib/cjs/perf/LogMetricSink.d.ts +28 -0
  90. package/lib/cjs/perf/LogMetricSink.d.ts.map +1 -0
  91. package/lib/cjs/perf/LogMetricSink.js +120 -0
  92. package/lib/cjs/perf/LogMetricSink.js.map +1 -0
  93. package/lib/cjs/perf/measure.d.ts +9 -0
  94. package/lib/cjs/perf/measure.d.ts.map +1 -0
  95. package/lib/cjs/perf/measure.js +21 -0
  96. package/lib/cjs/perf/measure.js.map +1 -0
  97. package/lib/cjs/perf.d.ts +9 -0
  98. package/lib/cjs/perf.d.ts.map +1 -0
  99. package/lib/cjs/perf.js +18 -0
  100. package/lib/cjs/perf.js.map +1 -0
  101. package/lib/cjs/schemas/log.configuration.d.ts +151 -18
  102. package/lib/cjs/schemas/log.configuration.d.ts.map +1 -1
  103. package/lib/cjs/schemas/log.configuration.js +154 -21
  104. package/lib/cjs/schemas/log.configuration.js.map +1 -1
  105. package/lib/cjs/targets/BrowserConsoleTarget.d.ts +48 -0
  106. package/lib/cjs/targets/BrowserConsoleTarget.d.ts.map +1 -0
  107. package/lib/cjs/targets/BrowserConsoleTarget.js +48 -0
  108. package/lib/cjs/targets/BrowserConsoleTarget.js.map +1 -0
  109. package/lib/cjs/targets/ColoredConsoleTarget.d.ts.map +1 -1
  110. package/lib/cjs/targets/ColoredConsoleTarget.js +21 -12
  111. package/lib/cjs/targets/ColoredConsoleTarget.js.map +1 -1
  112. package/lib/cjs/targets/FileTarget.d.ts +96 -20
  113. package/lib/cjs/targets/FileTarget.d.ts.map +1 -1
  114. package/lib/cjs/targets/FileTarget.js +188 -225
  115. package/lib/cjs/targets/FileTarget.js.map +1 -1
  116. package/lib/cjs/targets/JsonFileTarget.d.ts +19 -0
  117. package/lib/cjs/targets/JsonFileTarget.d.ts.map +1 -0
  118. package/lib/cjs/targets/JsonFileTarget.js +44 -0
  119. package/lib/cjs/targets/JsonFileTarget.js.map +1 -0
  120. package/lib/cjs/targets/JsonTarget.d.ts +27 -0
  121. package/lib/cjs/targets/JsonTarget.d.ts.map +1 -0
  122. package/lib/cjs/targets/JsonTarget.js +46 -0
  123. package/lib/cjs/targets/JsonTarget.js.map +1 -0
  124. package/lib/cjs/targets/MemoryTarget.d.ts +33 -0
  125. package/lib/cjs/targets/MemoryTarget.d.ts.map +1 -0
  126. package/lib/cjs/targets/MemoryTarget.js +63 -0
  127. package/lib/cjs/targets/MemoryTarget.js.map +1 -0
  128. package/lib/cjs/targets/index.d.ts +7 -0
  129. package/lib/cjs/targets/index.d.ts.map +1 -1
  130. package/lib/cjs/targets/index.js +7 -0
  131. package/lib/cjs/targets/index.js.map +1 -1
  132. package/lib/cjs/targets/wrappers/AutoFlushTarget.d.ts +37 -0
  133. package/lib/cjs/targets/wrappers/AutoFlushTarget.d.ts.map +1 -0
  134. package/lib/cjs/targets/wrappers/AutoFlushTarget.js +48 -0
  135. package/lib/cjs/targets/wrappers/AutoFlushTarget.js.map +1 -0
  136. package/lib/cjs/targets/wrappers/FallbackGroupTarget.d.ts +45 -0
  137. package/lib/cjs/targets/wrappers/FallbackGroupTarget.d.ts.map +1 -0
  138. package/lib/cjs/targets/wrappers/FallbackGroupTarget.js +94 -0
  139. package/lib/cjs/targets/wrappers/FallbackGroupTarget.js.map +1 -0
  140. package/lib/cjs/targets/wrappers/RetryingTarget.d.ts +44 -0
  141. package/lib/cjs/targets/wrappers/RetryingTarget.d.ts.map +1 -0
  142. package/lib/cjs/targets/wrappers/RetryingTarget.js +61 -0
  143. package/lib/cjs/targets/wrappers/RetryingTarget.js.map +1 -0
  144. package/lib/cjs/targets/wrappers/SplitGroupTarget.d.ts +30 -0
  145. package/lib/cjs/targets/wrappers/SplitGroupTarget.d.ts.map +1 -0
  146. package/lib/cjs/targets/wrappers/SplitGroupTarget.js +52 -0
  147. package/lib/cjs/targets/wrappers/SplitGroupTarget.js.map +1 -0
  148. package/lib/cjs/traceparent.d.ts +63 -0
  149. package/lib/cjs/traceparent.d.ts.map +1 -0
  150. package/lib/cjs/traceparent.js +107 -0
  151. package/lib/cjs/traceparent.js.map +1 -0
  152. package/lib/mjs/archive/LogArchiveService.d.ts +75 -0
  153. package/lib/mjs/archive/LogArchiveService.d.ts.map +1 -0
  154. package/lib/mjs/archive/LogArchiveService.js +186 -0
  155. package/lib/mjs/archive/LogArchiveService.js.map +1 -0
  156. package/lib/mjs/archive/archive-strategy.d.ts +32 -0
  157. package/lib/mjs/archive/archive-strategy.d.ts.map +1 -0
  158. package/lib/mjs/archive/archive-strategy.js +39 -0
  159. package/lib/mjs/archive/archive-strategy.js.map +1 -0
  160. package/lib/mjs/archive/context.d.ts +50 -0
  161. package/lib/mjs/archive/context.d.ts.map +1 -0
  162. package/lib/mjs/archive/context.js +2 -0
  163. package/lib/mjs/archive/context.js.map +1 -0
  164. package/lib/mjs/archive/index.d.ts +10 -0
  165. package/lib/mjs/archive/index.d.ts.map +1 -0
  166. package/lib/mjs/archive/index.js +10 -0
  167. package/lib/mjs/archive/index.js.map +1 -0
  168. package/lib/mjs/archive/retention-strategy.d.ts +26 -0
  169. package/lib/mjs/archive/retention-strategy.d.ts.map +1 -0
  170. package/lib/mjs/archive/retention-strategy.js +38 -0
  171. package/lib/mjs/archive/retention-strategy.js.map +1 -0
  172. package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.d.ts +10 -0
  173. package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.d.ts.map +1 -0
  174. package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.js +43 -0
  175. package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.js.map +1 -0
  176. package/lib/mjs/archive/strategies/CountLogRetentionStrategy.d.ts +10 -0
  177. package/lib/mjs/archive/strategies/CountLogRetentionStrategy.d.ts.map +1 -0
  178. package/lib/mjs/archive/strategies/CountLogRetentionStrategy.js +39 -0
  179. package/lib/mjs/archive/strategies/CountLogRetentionStrategy.js.map +1 -0
  180. package/lib/mjs/archive/strategies/CronLogArchiveStrategy.d.ts +15 -0
  181. package/lib/mjs/archive/strategies/CronLogArchiveStrategy.d.ts.map +1 -0
  182. package/lib/mjs/archive/strategies/CronLogArchiveStrategy.js +49 -0
  183. package/lib/mjs/archive/strategies/CronLogArchiveStrategy.js.map +1 -0
  184. package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.d.ts +18 -0
  185. package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.d.ts.map +1 -0
  186. package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.js +60 -0
  187. package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.js.map +1 -0
  188. package/lib/mjs/archive/strategies/util.d.ts +28 -0
  189. package/lib/mjs/archive/strategies/util.d.ts.map +1 -0
  190. package/lib/mjs/archive/strategies/util.js +54 -0
  191. package/lib/mjs/archive/strategies/util.js.map +1 -0
  192. package/lib/mjs/bootstrap.d.ts.map +1 -1
  193. package/lib/mjs/bootstrap.js +25 -2
  194. package/lib/mjs/bootstrap.js.map +1 -1
  195. package/lib/mjs/callsite.d.ts +26 -0
  196. package/lib/mjs/callsite.d.ts.map +1 -0
  197. package/lib/mjs/callsite.js +57 -0
  198. package/lib/mjs/callsite.js.map +1 -0
  199. package/lib/mjs/config/log.d.ts +96 -0
  200. package/lib/mjs/config/log.d.ts.map +1 -0
  201. package/lib/mjs/config/log.js +72 -0
  202. package/lib/mjs/config/log.js.map +1 -0
  203. package/lib/mjs/context.browser.d.ts +46 -0
  204. package/lib/mjs/context.browser.d.ts.map +1 -0
  205. package/lib/mjs/context.browser.js +81 -0
  206. package/lib/mjs/context.browser.js.map +1 -0
  207. package/lib/mjs/context.d.ts +61 -0
  208. package/lib/mjs/context.d.ts.map +1 -0
  209. package/lib/mjs/context.js +88 -0
  210. package/lib/mjs/context.js.map +1 -0
  211. package/lib/mjs/filters/LevelFilter.d.ts +24 -0
  212. package/lib/mjs/filters/LevelFilter.d.ts.map +1 -0
  213. package/lib/mjs/filters/LevelFilter.js +36 -0
  214. package/lib/mjs/filters/LevelFilter.js.map +1 -0
  215. package/lib/mjs/filters/MatchFilter.d.ts +30 -0
  216. package/lib/mjs/filters/MatchFilter.d.ts.map +1 -0
  217. package/lib/mjs/filters/MatchFilter.js +62 -0
  218. package/lib/mjs/filters/MatchFilter.js.map +1 -0
  219. package/lib/mjs/filters/RateLimitFilter.d.ts +37 -0
  220. package/lib/mjs/filters/RateLimitFilter.d.ts.map +1 -0
  221. package/lib/mjs/filters/RateLimitFilter.js +67 -0
  222. package/lib/mjs/filters/RateLimitFilter.js.map +1 -0
  223. package/lib/mjs/filters/index.d.ts +4 -0
  224. package/lib/mjs/filters/index.d.ts.map +1 -0
  225. package/lib/mjs/filters/index.js +4 -0
  226. package/lib/mjs/filters/index.js.map +1 -0
  227. package/lib/mjs/index.browser.d.ts +14 -0
  228. package/lib/mjs/index.browser.d.ts.map +1 -0
  229. package/lib/mjs/index.browser.js +30 -0
  230. package/lib/mjs/index.browser.js.map +1 -0
  231. package/lib/mjs/index.d.ts +8 -0
  232. package/lib/mjs/index.d.ts.map +1 -1
  233. package/lib/mjs/index.js +8 -0
  234. package/lib/mjs/index.js.map +1 -1
  235. package/lib/mjs/log.d.ts +60 -1
  236. package/lib/mjs/log.d.ts.map +1 -1
  237. package/lib/mjs/log.js +295 -33
  238. package/lib/mjs/log.js.map +1 -1
  239. package/lib/mjs/perf/LogMetricSink.d.ts +28 -0
  240. package/lib/mjs/perf/LogMetricSink.d.ts.map +1 -0
  241. package/lib/mjs/perf/LogMetricSink.js +117 -0
  242. package/lib/mjs/perf/LogMetricSink.js.map +1 -0
  243. package/lib/mjs/perf/measure.d.ts +9 -0
  244. package/lib/mjs/perf/measure.d.ts.map +1 -0
  245. package/lib/mjs/perf/measure.js +18 -0
  246. package/lib/mjs/perf/measure.js.map +1 -0
  247. package/lib/mjs/perf.d.ts +9 -0
  248. package/lib/mjs/perf.d.ts.map +1 -0
  249. package/lib/mjs/perf.js +15 -0
  250. package/lib/mjs/perf.js.map +1 -0
  251. package/lib/mjs/schemas/log.configuration.d.ts +151 -18
  252. package/lib/mjs/schemas/log.configuration.d.ts.map +1 -1
  253. package/lib/mjs/schemas/log.configuration.js +154 -21
  254. package/lib/mjs/schemas/log.configuration.js.map +1 -1
  255. package/lib/mjs/targets/BrowserConsoleTarget.d.ts +48 -0
  256. package/lib/mjs/targets/BrowserConsoleTarget.d.ts.map +1 -0
  257. package/lib/mjs/targets/BrowserConsoleTarget.js +45 -0
  258. package/lib/mjs/targets/BrowserConsoleTarget.js.map +1 -0
  259. package/lib/mjs/targets/ColoredConsoleTarget.d.ts.map +1 -1
  260. package/lib/mjs/targets/ColoredConsoleTarget.js +21 -9
  261. package/lib/mjs/targets/ColoredConsoleTarget.js.map +1 -1
  262. package/lib/mjs/targets/FileTarget.d.ts +96 -20
  263. package/lib/mjs/targets/FileTarget.d.ts.map +1 -1
  264. package/lib/mjs/targets/FileTarget.js +191 -192
  265. package/lib/mjs/targets/FileTarget.js.map +1 -1
  266. package/lib/mjs/targets/JsonFileTarget.d.ts +19 -0
  267. package/lib/mjs/targets/JsonFileTarget.d.ts.map +1 -0
  268. package/lib/mjs/targets/JsonFileTarget.js +41 -0
  269. package/lib/mjs/targets/JsonFileTarget.js.map +1 -0
  270. package/lib/mjs/targets/JsonTarget.d.ts +27 -0
  271. package/lib/mjs/targets/JsonTarget.d.ts.map +1 -0
  272. package/lib/mjs/targets/JsonTarget.js +43 -0
  273. package/lib/mjs/targets/JsonTarget.js.map +1 -0
  274. package/lib/mjs/targets/MemoryTarget.d.ts +33 -0
  275. package/lib/mjs/targets/MemoryTarget.d.ts.map +1 -0
  276. package/lib/mjs/targets/MemoryTarget.js +60 -0
  277. package/lib/mjs/targets/MemoryTarget.js.map +1 -0
  278. package/lib/mjs/targets/index.d.ts +7 -0
  279. package/lib/mjs/targets/index.d.ts.map +1 -1
  280. package/lib/mjs/targets/index.js +7 -0
  281. package/lib/mjs/targets/index.js.map +1 -1
  282. package/lib/mjs/targets/wrappers/AutoFlushTarget.d.ts +37 -0
  283. package/lib/mjs/targets/wrappers/AutoFlushTarget.d.ts.map +1 -0
  284. package/lib/mjs/targets/wrappers/AutoFlushTarget.js +45 -0
  285. package/lib/mjs/targets/wrappers/AutoFlushTarget.js.map +1 -0
  286. package/lib/mjs/targets/wrappers/FallbackGroupTarget.d.ts +45 -0
  287. package/lib/mjs/targets/wrappers/FallbackGroupTarget.d.ts.map +1 -0
  288. package/lib/mjs/targets/wrappers/FallbackGroupTarget.js +91 -0
  289. package/lib/mjs/targets/wrappers/FallbackGroupTarget.js.map +1 -0
  290. package/lib/mjs/targets/wrappers/RetryingTarget.d.ts +44 -0
  291. package/lib/mjs/targets/wrappers/RetryingTarget.d.ts.map +1 -0
  292. package/lib/mjs/targets/wrappers/RetryingTarget.js +58 -0
  293. package/lib/mjs/targets/wrappers/RetryingTarget.js.map +1 -0
  294. package/lib/mjs/targets/wrappers/SplitGroupTarget.d.ts +30 -0
  295. package/lib/mjs/targets/wrappers/SplitGroupTarget.d.ts.map +1 -0
  296. package/lib/mjs/targets/wrappers/SplitGroupTarget.js +49 -0
  297. package/lib/mjs/targets/wrappers/SplitGroupTarget.js.map +1 -0
  298. package/lib/mjs/traceparent.d.ts +63 -0
  299. package/lib/mjs/traceparent.d.ts.map +1 -0
  300. package/lib/mjs/traceparent.js +100 -0
  301. package/lib/mjs/traceparent.js.map +1 -0
  302. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  303. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  304. package/package.json +25 -15
@@ -1,28 +1,104 @@
1
- import fs from "fs";
2
1
  import { IInstanceCheck } from "@spinajs/di";
3
- import { IFileTargetOptions, Log, ILogEntry, LogTarget } from "@spinajs/log-common";
4
- declare enum FileTargetStatus {
5
- WRITTING = 0,
6
- PENDING = 1,
7
- IDLE = 2
8
- }
2
+ import { fs } from "@spinajs/fs";
3
+ import { IFileTargetOptions, Log, ILogEntry, LogTarget, BatchQueue } from "@spinajs/log-common";
4
+ import { LogArchiveService } from "../archive/LogArchiveService.js";
5
+ import { ILogArchiveContext } from "../archive/context.js";
6
+ /**
7
+ * Writes log messages to a file through the @spinajs/fs abstraction.
8
+ *
9
+ * Messages are buffered in memory and flushed as a single batched append,
10
+ * either when the buffer reaches `maxBufferSize` or on a periodic flush tick.
11
+ * Rotation / archiving / retention is delegated to {@link LogArchiveService}.
12
+ *
13
+ * A single async write-lock ( a promise-chain mutex ) serializes every flush
14
+ * and every rotation, so a rename can never race an in-flight append.
15
+ *
16
+ * PerInstanceCheck: multiple file targets can point at different files, but two
17
+ * targets with the same name share one writer.
18
+ */
9
19
  export declare class FileTarget extends LogTarget<IFileTargetOptions> implements IInstanceCheck {
10
20
  protected Log: Log;
11
- LogDirPath: string;
12
- ArchiveDirPath: string;
13
- protected WriteStream: fs.WriteStream;
14
- protected Buffer: string[];
15
- protected WriteBuffer: string[];
16
- protected ArchiveTimer: NodeJS.Timeout;
17
- protected FlushTimer: NodeJS.Timeout;
18
- protected Status: FileTargetStatus;
19
- protected ArchiveStatus: FileTargetStatus;
21
+ /**
22
+ * fs provider holding the active log file.
23
+ */
24
+ protected Fs: fs;
25
+ /**
26
+ * fs provider archives are moved to ( defaults to `Fs` ).
27
+ */
28
+ protected ArchiveFs: fs;
29
+ /**
30
+ * Directory ( relative to ArchiveFs ) archives are stored in.
31
+ */
32
+ protected ArchiveDir: string;
33
+ protected ArchiveService: LogArchiveService;
34
+ protected Context: ILogArchiveContext;
35
+ /**
36
+ * Buffered-batch queue owning accumulation, the flush tick and the hard queue
37
+ * cap. It delegates the actual batched append to {@link append} via onFlush.
38
+ */
39
+ protected Queue: BatchQueue<string>;
40
+ /**
41
+ * Set true when the queue drops overflow, so the drop warning is emitted ONCE
42
+ * per overflow episode and reset when a batch appends successfully.
43
+ */
44
+ protected Overflowed: boolean;
45
+ /**
46
+ * Async initialization ( fs resolution + mkdir + archive start ). write()
47
+ * and flush() await this so nothing touches the fs before it is ready.
48
+ */
49
+ protected Ready: Promise<void>;
50
+ /**
51
+ * Promise-chain mutex tail. Every critical section ( flush, rotation ) chains
52
+ * onto this so they run strictly one at a time.
53
+ */
54
+ protected WriteLock: Promise<unknown>;
55
+ protected Disposed: boolean;
20
56
  __checkInstance__(creationOptions: IFileTargetOptions[]): boolean;
21
57
  resolve(): void;
22
- protected flush(): void;
23
- dispose(): Promise<void>;
58
+ /**
59
+ * Resolves fs providers, ensures directories exist, builds the archive
60
+ * context and starts the archive service.
61
+ */
62
+ protected init(): Promise<void>;
24
63
  write(data: ILogEntry): Promise<void>;
25
- protected archive(): void;
64
+ /**
65
+ * Builds the single line appended for one entry. Overridable so subclasses can
66
+ * change ONLY the per-entry serialization while reusing the whole FileTarget
67
+ * pipeline ( batched append, write-lock, rotation, retention, zip ). The base
68
+ * renders the configured string `layout`.
69
+ */
70
+ protected formatEntry(data: ILogEntry): string;
71
+ /**
72
+ * Flushes any buffered messages. Delegates to the queue's forceFlush so a
73
+ * caller ( eg. dispose or a test ) can await the drain.
74
+ */
75
+ protected flush(): Promise<void>;
76
+ forceFlush(): Promise<void>;
77
+ /**
78
+ * Appends one batch as a single write, guarded by the write-lock ( the SAME
79
+ * lock rotation uses, so a rename can never race an append ). On failure the
80
+ * batch is requeued at the FRONT so nothing is lost ( never-drop, bounded by
81
+ * maxQueue ). This ALWAYS resolves ( never rejects ) so queue.shutdown() -
82
+ * driven by dispose() - never rejects.
83
+ */
84
+ protected append(batch: string[]): Promise<void>;
85
+ dispose(): Promise<void>;
86
+ /**
87
+ * Runs `fn` under the shared write-lock. Flush and rotation both go through
88
+ * here, so a rename can never overlap an append.
89
+ */
90
+ protected withWriteLock<T>(fn: () => Promise<T>): Promise<T>;
91
+ /**
92
+ * Active log path relative to the fs provider base path. Recomputed each call
93
+ * so dynamic ( eg. date-based ) paths work.
94
+ */
95
+ protected activePath(): string;
96
+ /**
97
+ * Normalizes a configured path to forward slashes and strips a leading
98
+ * separator. Paths are interpreted relative to the fs provider base path -
99
+ * the provider itself sandboxes and resolves them, so we only canonicalize
100
+ * separators here.
101
+ */
102
+ protected normalize(p: string): string;
26
103
  }
27
- export {};
28
104
  //# sourceMappingURL=FileTarget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB,OAAO,EAAE,cAAc,EAAgC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAU,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAI5F,aAAK,gBAAgB;IACnB,QAAQ,IAAA;IACR,OAAO,IAAA;IACP,IAAI,IAAA;CACL;AAID,qBAEa,UAAW,SAAQ,SAAS,CAAC,kBAAkB,CAAE,YAAW,cAAc;IAErF,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IAE9B,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAChC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAM;IAErC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC;IACvC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC;IAErC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAyB;IAC3D,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAyB;IAElE,iBAAiB,CAAC,eAAe,EAAE,kBAAkB,EAAE,GAAG,OAAO;IAI1D,OAAO;IA+Dd,SAAS,CAAC,KAAK;IA0BF,OAAO;IAYP,KAAK,CAAC,IAAI,EAAE,SAAS;IA2BlC,SAAS,CAAC,OAAO;CAyGlB"}
1
+ {"version":3,"file":"FileTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"AAIA,OAAO,EAAM,cAAc,EAAgC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAU,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAExG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;;;;;;;;;;;GAYG;AACH,qBAEa,UAAW,SAAQ,SAAS,CAAC,kBAAkB,CAAE,YAAW,cAAc;IAErF,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,UAAU,SAAM;IAE1B,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAEtC;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpC;;;OAGG;IACH,SAAS,CAAC,UAAU,UAAS;IAE7B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAqB;IAE1D,SAAS,CAAC,QAAQ,UAAS;IAE3B,iBAAiB,CAAC,eAAe,EAAE,kBAAkB,EAAE,GAAG,OAAO;IAI1D,OAAO,IAAI,IAAI;IA+CtB;;;OAGG;cACa,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCxB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD;;;;;OAKG;IACH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAI9C;;;OAGG;cACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;;;;OAMG;cACa,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAO5D;;;OAGG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAK9B;;;;;OAKG;IACH,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAGvC"}
@@ -7,220 +7,219 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- /* eslint-disable security/detect-object-injection */
11
10
  import { EOL } from "os";
12
- import fs from "fs";
13
- import * as path from "path";
14
- import glob from "glob";
15
- import * as zlib from "zlib";
16
- import { pipeline } from "stream";
17
- import { format } from "@spinajs/configuration";
11
+ import { posix } from "path";
12
+ import { Configuration, format } from "@spinajs/configuration";
18
13
  import { InvalidOption } from "@spinajs/exceptions";
19
- import { Injectable, PerInstanceCheck } from "@spinajs/di";
20
- import { Logger, Log, LogTarget } from "@spinajs/log-common";
21
- import _ from "lodash";
22
- var FileTargetStatus;
23
- (function (FileTargetStatus) {
24
- FileTargetStatus[FileTargetStatus["WRITTING"] = 0] = "WRITTING";
25
- FileTargetStatus[FileTargetStatus["PENDING"] = 1] = "PENDING";
26
- FileTargetStatus[FileTargetStatus["IDLE"] = 2] = "IDLE";
27
- })(FileTargetStatus || (FileTargetStatus = {}));
28
- // we mark per instance check becouse we can have multiple file targes
29
- // for different files/paths/logs but we dont want to create every time writer for same.
14
+ import { DI, Injectable, PerInstanceCheck } from "@spinajs/di";
15
+ import { Logger, Log, LogTarget, BatchQueue } from "@spinajs/log-common";
16
+ import { LogArchiveService } from "../archive/LogArchiveService.js";
17
+ import { LOG_FILE_DEFAULTS } from "../config/log.js";
18
+ /**
19
+ * Writes log messages to a file through the @spinajs/fs abstraction.
20
+ *
21
+ * Messages are buffered in memory and flushed as a single batched append,
22
+ * either when the buffer reaches `maxBufferSize` or on a periodic flush tick.
23
+ * Rotation / archiving / retention is delegated to {@link LogArchiveService}.
24
+ *
25
+ * A single async write-lock ( a promise-chain mutex ) serializes every flush
26
+ * and every rotation, so a rename can never race an in-flight append.
27
+ *
28
+ * PerInstanceCheck: multiple file targets can point at different files, but two
29
+ * targets with the same name share one writer.
30
+ */
30
31
  let FileTarget = class FileTarget extends LogTarget {
31
32
  constructor() {
32
33
  super(...arguments);
33
- this.Buffer = [];
34
- this.WriteBuffer = [];
35
- this.Status = FileTargetStatus.IDLE;
36
- this.ArchiveStatus = FileTargetStatus.IDLE;
34
+ /**
35
+ * Directory ( relative to ArchiveFs ) archives are stored in.
36
+ */
37
+ this.ArchiveDir = "";
38
+ /**
39
+ * Set true when the queue drops overflow, so the drop warning is emitted ONCE
40
+ * per overflow episode and reset when a batch appends successfully.
41
+ */
42
+ this.Overflowed = false;
43
+ /**
44
+ * Promise-chain mutex tail. Every critical section ( flush, rotation ) chains
45
+ * onto this so they run strictly one at a time.
46
+ */
47
+ this.WriteLock = Promise.resolve();
48
+ this.Disposed = false;
37
49
  }
38
50
  __checkInstance__(creationOptions) {
39
51
  return this.Options.name === creationOptions[0].name;
40
52
  }
41
53
  resolve() {
42
- this.Options.options = Object.assign({
43
- compress: true,
44
- maxSize: 1024 * 1024,
45
- maxArchiveFiles: 5,
46
- archiveInterval: 3 * 60,
47
- }, this.Options.options);
48
- this.LogDirPath = path.dirname(path.resolve(format(null, this.Options.options.path)));
49
- this.ArchiveDirPath = this.Options.options.archivePath ? path.resolve(format(null, this.Options.options.archivePath)) : this.LogDirPath;
50
- if (!this.LogDirPath) {
51
- throw new InvalidOption("Missing LogDirPath log option");
54
+ // Defaults come from the shipped `logger.file` config ( discoverable and
55
+ // user-overridable like every other spinajs package ). LOG_FILE_DEFAULTS is
56
+ // the same object the config ships and is used as a last-resort fallback for
57
+ // environments where the config file was not discovered ( eg. some tests ).
58
+ // Merge order ( lowest to highest ): constant < config < per-target options.
59
+ const cfg = DI.get(Configuration);
60
+ const fileDefaults = cfg ? cfg.get("logger.file", {}) : {};
61
+ this.Options.options = Object.assign({}, LOG_FILE_DEFAULTS, fileDefaults, this.Options.options);
62
+ if (!this.Options.options.path) {
63
+ throw new InvalidOption(`FileTarget ${this.Options.name} requires a 'path' option`);
52
64
  }
53
- if (!fs.existsSync(this.LogDirPath)) {
54
- fs.mkdirSync(this.LogDirPath, { recursive: true });
55
- }
56
- if (this.ArchiveDirPath) {
57
- if (!fs.existsSync(this.ArchiveDirPath)) {
58
- fs.mkdirSync(this.ArchiveDirPath, { recursive: true });
59
- }
60
- }
61
- // flush all buffered messages at least once per second
62
- // we do this, becouse buffer can not be filled
63
- // and we could wait unknown amount of time before messages are written to file
64
- this.FlushTimer = setInterval(() => {
65
- // do not flush, if we already writting to file
66
- if (this.Status !== FileTargetStatus.IDLE && this.ArchiveStatus !== FileTargetStatus.IDLE) {
67
- return;
68
- }
69
- this.WriteBuffer = [...this.WriteBuffer, ...this.Buffer];
70
- this.Buffer = [];
71
- setImmediate(() => {
72
- this.flush();
73
- });
74
- }, 1000);
75
- // every 3 minutes try to archive log files
76
- this.ArchiveTimer = setInterval(() => {
77
- // do not archive if we already doing it
78
- if (this.Status !== FileTargetStatus.IDLE && this.ArchiveStatus !== FileTargetStatus.IDLE) {
79
- return;
80
- }
81
- this.ArchiveStatus = FileTargetStatus.PENDING;
82
- // at end of nodejs event loop
83
- setImmediate(() => {
84
- this.archive();
85
- });
86
- }, this.Options.options.archiveInterval * 1000);
65
+ // start async init - fs resolution and dir creation cannot run in a sync
66
+ // SyncService.resolve, so writes buffer until Ready settles
67
+ this.Ready = this.init();
68
+ this.Ready.catch((err) => {
69
+ this.HasError = true;
70
+ this.Error = err;
71
+ this.Log.error(err, `Cannot initialize file target ${this.Options.name}`);
72
+ });
73
+ // BatchQueue owns accumulation, the periodic flush tick ( unref'd, so a
74
+ // pending flush never keeps the process alive ) and the hard queue cap. The
75
+ // batched append itself runs in append() under the write-lock.
76
+ this.Queue = new BatchQueue({
77
+ maxBatch: this.Options.options.maxBufferSize,
78
+ maxQueue: this.Options.options.maxQueueSize,
79
+ flushIntervalMs: this.Options.options.flushInterval ?? LOG_FILE_DEFAULTS.flushInterval,
80
+ onFlush: (batch) => this.append(batch),
81
+ onOverflow: (droppedItems) => {
82
+ // droppedItems here are already-formatted STRINGS, so we cannot
83
+ // reconstruct the original ILogEntry to route via OnDropped. File
84
+ // overflow stays warn-only ( count from droppedItems.length ). The
85
+ // drop-hook ( D ) targets the network-primary -> file-fallback case,
86
+ // not File-as-primary drops.
87
+ if (!this.Overflowed) {
88
+ this.Overflowed = true;
89
+ this.Log.warn(`File target ${this.Options.name} buffer exceeded ${this.Options.options.maxQueueSize} messages, dropped ${droppedItems.length} oldest buffered messages.`);
90
+ }
91
+ },
92
+ });
87
93
  super.resolve();
88
94
  }
89
- flush() {
90
- if (this.WriteBuffer.length === 0) {
91
- this.Status = FileTargetStatus.IDLE;
92
- return;
95
+ /**
96
+ * Resolves fs providers, ensures directories exist, builds the archive
97
+ * context and starts the archive service.
98
+ */
99
+ async init() {
100
+ const o = this.Options.options;
101
+ // o.fs is always populated from LOG_FILE_DEFAULTS ( see resolve() )
102
+ this.Fs = DI.resolve("__file_provider__", [o.fs]);
103
+ this.ArchiveFs = o.archiveFs ? DI.resolve("__file_provider__", [o.archiveFs]) : this.Fs;
104
+ // path is relative to the fs provider base path; ensure its directory exists
105
+ const logDir = posix.dirname(this.activePath());
106
+ if (logDir && logDir !== ".") {
107
+ await this.Fs.mkdir(logDir);
93
108
  }
94
- this.Status = FileTargetStatus.WRITTING;
95
- // we calculate log path every time to allow for
96
- // dynamic path creation eg. based on timestamp
97
- const logFileName = format({ logger: this.Options.name }, path.basename(this.Options.options.path));
98
- const logPath = path.join(this.LogDirPath, logFileName);
99
- fs.appendFile(logPath, this.WriteBuffer.join(EOL) + EOL, (err) => {
100
- // log error message to others if applicable eg. console
101
- if (err) {
102
- this.Log.error(err, `Cannot write log messages to file target at path ${logPath}`);
103
- }
104
- this.Log.trace(`Wrote buffered messages to log file at path ${logPath}, buffer size: ${this.Options.options.maxBufferSize}`);
105
- this.WriteBuffer = [];
106
- this.Status = FileTargetStatus.IDLE;
107
- });
108
- }
109
- async dispose() {
110
- // stop archiving
111
- clearInterval(this.ArchiveTimer);
112
- // stop flush timer
113
- clearInterval(this.FlushTimer);
114
- // write all messages from buffer
115
- this.WriteBuffer = [...this.WriteBuffer, ...this.Buffer];
116
- this.flush();
109
+ // archivePath ( when set ) is a directory relative to the archive fs; when
110
+ // not set, archives live in the same directory as the active log
111
+ this.ArchiveDir = o.archivePath ? this.normalize(format(null, o.archivePath)) : logDir === "." ? "" : logDir;
112
+ if (this.ArchiveDir) {
113
+ await this.ArchiveFs.mkdir(this.ArchiveDir);
114
+ }
115
+ this.Context = {
116
+ fs: this.Fs,
117
+ archiveFs: this.ArchiveFs,
118
+ activePath: this.activePath(),
119
+ archiveDir: this.ArchiveDir,
120
+ options: o,
121
+ logger: this.Log,
122
+ rotate: () => this.ArchiveService.rotate(this.Context),
123
+ withWriteLock: (fn) => this.withWriteLock(fn),
124
+ };
125
+ this.ArchiveService = await DI.resolve(LogArchiveService);
126
+ await this.ArchiveService.start(this.Context);
117
127
  }
118
128
  async write(data) {
119
- if (!this.Options.enabled) {
129
+ if (!this.Options.enabled || this.Disposed) {
120
130
  return;
121
131
  }
122
- const lEntry = format(data.Variables, this.Options.layout);
123
- this.Buffer.push(lEntry);
124
- // if we already writting, skip buffer check & write to file
125
- // wait until write is finished
126
- if (this.Status !== FileTargetStatus.IDLE || this.ArchiveStatus !== FileTargetStatus.IDLE) {
132
+ const entry = this.formatEntry(data);
133
+ // enqueue awaits the batched append when maxBatch ( = maxBufferSize ) is
134
+ // reached, preserving the old "await flush when full" back-pressure
135
+ await this.Queue.enqueue(entry);
136
+ }
137
+ /**
138
+ * Builds the single line appended for one entry. Overridable so subclasses can
139
+ * change ONLY the per-entry serialization while reusing the whole FileTarget
140
+ * pipeline ( batched append, write-lock, rotation, retention, zip ). The base
141
+ * renders the configured string `layout`.
142
+ */
143
+ formatEntry(data) {
144
+ return format(data.Variables, this.Options.layout);
145
+ }
146
+ /**
147
+ * Flushes any buffered messages. Delegates to the queue's forceFlush so a
148
+ * caller ( eg. dispose or a test ) can await the drain.
149
+ */
150
+ async flush() {
151
+ await this.Queue.forceFlush();
152
+ }
153
+ forceFlush() {
154
+ return this.Queue ? this.Queue.forceFlush() : Promise.resolve();
155
+ }
156
+ /**
157
+ * Appends one batch as a single write, guarded by the write-lock ( the SAME
158
+ * lock rotation uses, so a rename can never race an append ). On failure the
159
+ * batch is requeued at the FRONT so nothing is lost ( never-drop, bounded by
160
+ * maxQueue ). This ALWAYS resolves ( never rejects ) so queue.shutdown() -
161
+ * driven by dispose() - never rejects.
162
+ */
163
+ async append(batch) {
164
+ await this.Ready.catch(() => {
165
+ /* init failed - error already recorded, skip appending */
166
+ });
167
+ if (!this.Fs) {
168
+ // init failed / fs unavailable - keep the batch for a later retry
169
+ this.Queue.requeueFront(batch);
127
170
  return;
128
171
  }
129
- if (this.Buffer.length >= this.Options.options.maxBufferSize) {
130
- this.Status = FileTargetStatus.PENDING;
131
- this.WriteBuffer = [...this.WriteBuffer, ...this.Buffer];
132
- this.Buffer = [];
133
- // write at end of nodejs event loop all buffered messages at once
134
- setImmediate(() => {
135
- this.flush();
136
- });
137
- }
138
- }
139
- archive() {
140
- const { ext } = path.parse(path.basename(this.Options.options.path));
141
- const aFiles = glob
142
- .sync(path.join(this.ArchiveDirPath, `archived_*{${ext},.gzip}`).replace(/\\/g, "/"))
143
- .map((f) => {
144
- return {
145
- name: f,
146
- stat: fs.statSync(f),
147
- };
148
- })
149
- .sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
150
- const lFiles = glob
151
- .sync(path.join(this.LogDirPath, `*${ext}`).replace(/\\/g, "/"))
152
- .map((f) => {
153
- return {
154
- name: f,
155
- stat: fs.statSync(f),
156
- };
157
- })
158
- .sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
159
- // clear archived files above limit
160
- if (aFiles.length > this.Options.options.maxArchiveFiles) {
161
- for (let i = 0; i < aFiles.length - this.Options.options.maxArchiveFiles; i++) {
162
- fs.unlink(aFiles[i].name, (err) => {
163
- if (err) {
164
- this.Log.error(err, `Cannot delete archived file at path ${aFiles[i - 1].name}`);
165
- }
166
- else {
167
- this.Log.info(`Deleted archived file at path ${aFiles[i].name}`);
168
- }
169
- });
172
+ await this.withWriteLock(async () => {
173
+ const path = this.activePath();
174
+ try {
175
+ await this.Fs.append(path, batch.join(EOL) + EOL);
176
+ this.HasError = false;
177
+ this.Error = null;
178
+ // batch appended successfully - allow the next overflow episode to warn again
179
+ this.Overflowed = false;
180
+ }
181
+ catch (err) {
182
+ this.HasError = true;
183
+ this.Error = err;
184
+ this.Log.error(err, `Cannot write log messages to file target at path ${path}`);
185
+ // restore the batch in front of anything queued meanwhile - never drop.
186
+ // the queue caps at maxQueue, dropping the oldest if the sink stays down.
187
+ this.Queue.requeueFront(batch);
170
188
  }
171
- }
172
- // now move log files that are above limited file size or old
173
- const filesToArchive = lFiles.filter((x) => {
174
- return x.stat.size > this.Options.options.maxSize || lFiles.indexOf(x) <= lFiles.length - 2;
175
189
  });
176
- if (filesToArchive.length === 0) {
177
- this.ArchiveStatus = FileTargetStatus.IDLE;
178
- }
179
- for (let i = 0; i < filesToArchive.length; i++) {
180
- const { name, ext } = path.parse(path.basename(lFiles[i].name));
181
- // get number of files with same name, eg. during a day, multiple log files can be produced
182
- const lArchiFiles = glob.sync(path.join(this.ArchiveDirPath, `archived_${name}*{${ext},.gzip}`).replace(/\\/g, "/"));
183
- const fIndex = _.max(lArchiFiles.map((f) => {
184
- const result = [...f.matchAll(/(\d+)(\.txt|\.gzip)/gm)];
185
- if (result && result.length > 0) {
186
- return parseInt(result[0][1]);
187
- }
188
- return 0;
189
- }));
190
- const archPath = path.join(this.ArchiveDirPath, `archived_${name}_${(fIndex ?? 0) + 1}${ext}`);
191
- fs.rename(lFiles[i].name, archPath, (err) => {
192
- if (err) {
193
- this.Log.error(err, `Cannot move log file ${name} to archive at path ${archPath}`);
194
- return;
195
- }
196
- if (this.Options.options.compress) {
197
- this.Log.trace(`Compressing archive log at path ${archPath}`);
198
- const zippedPath = path.join(this.ArchiveDirPath, `archived_${name}_${lArchiFiles.length + 1}${ext}.gzip`);
199
- const zip = zlib.createGzip();
200
- const read = fs.createReadStream(archPath);
201
- const write = fs.createWriteStream(zippedPath);
202
- pipeline(read, zip, write, (err) => {
203
- if (err) {
204
- this.Log.error(err, `Cannot compress archived file at path ${archPath}`);
205
- fs.unlink(zippedPath, () => {
206
- return;
207
- });
208
- return;
209
- }
210
- this.Log.info(`Succesyfully compressed archive log at path ${zippedPath}`);
211
- fs.unlink(archPath, (err) => {
212
- if (err) {
213
- this.Log.error(err, `Cannot delete archived log after compression at path ${archPath}`);
214
- }
215
- });
216
- this.ArchiveStatus = FileTargetStatus.IDLE;
217
- });
218
- }
219
- else {
220
- this.ArchiveStatus = FileTargetStatus.IDLE;
221
- }
222
- });
223
- }
190
+ }
191
+ async dispose() {
192
+ this.Disposed = true;
193
+ // stops the flush timer and performs a final flush of anything buffered
194
+ await this.Queue.shutdown();
195
+ this.ArchiveService?.stop();
196
+ }
197
+ /**
198
+ * Runs `fn` under the shared write-lock. Flush and rotation both go through
199
+ * here, so a rename can never overlap an append.
200
+ */
201
+ withWriteLock(fn) {
202
+ const run = this.WriteLock.then(() => fn());
203
+ // keep the chain alive on failure so the lock never deadlocks
204
+ this.WriteLock = run.catch(() => undefined);
205
+ return run;
206
+ }
207
+ /**
208
+ * Active log path relative to the fs provider base path. Recomputed each call
209
+ * so dynamic ( eg. date-based ) paths work.
210
+ */
211
+ activePath() {
212
+ const p = format({ logger: this.Options.name }, this.Options.options.path);
213
+ return this.normalize(p);
214
+ }
215
+ /**
216
+ * Normalizes a configured path to forward slashes and strips a leading
217
+ * separator. Paths are interpreted relative to the fs provider base path -
218
+ * the provider itself sandboxes and resolves them, so we only canonicalize
219
+ * separators here.
220
+ */
221
+ normalize(p) {
222
+ return p.replace(/\\/g, "/").replace(/^\/+/, "");
224
223
  }
225
224
  };
226
225
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"FileTarget.js","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileTarget.js","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"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"}