| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import { MainLogger } from "electron-log"
- import log from "electron-log/main.js"
- import { readFileSync, readdirSync, statSync, unlinkSync } from "node:fs"
- import { dirname, join } from "node:path"
- const MAX_LOG_AGE_DAYS = 7
- const TAIL_LINES = 1000
- let logger: MainLogger
- export const getLogger = () => logger
- export function initLogging() {
- log.transports.file.maxSize = 5 * 1024 * 1024
- initConsoleTransport()
- cleanup()
- return (logger = log)
- }
- export function tail(): string {
- try {
- const path = log.transports.file.getFile().path
- const contents = readFileSync(path, "utf8")
- const lines = contents.split("\n")
- return lines.slice(Math.max(0, lines.length - TAIL_LINES)).join("\n")
- } catch {
- return ""
- }
- }
- function cleanup() {
- const path = log.transports.file.getFile().path
- const dir = dirname(path)
- const cutoff = Date.now() - MAX_LOG_AGE_DAYS * 24 * 60 * 60 * 1000
- for (const entry of readdirSync(dir)) {
- const file = join(dir, entry)
- try {
- const info = statSync(file)
- if (!info.isFile()) continue
- if (info.mtimeMs < cutoff) unlinkSync(file)
- } catch {
- continue
- }
- }
- }
- function initConsoleTransport() {
- const write = log.transports.console.writeFn.bind(log.transports.console)
- log.transports.console.writeFn = (options) => {
- try {
- write(options)
- } catch (err) {
- if (!isBrokenPipe(err)) throw err
- log.transports.console.level = false
- }
- }
- }
- function isBrokenPipe(err: unknown) {
- return typeof err === "object" && err !== null && "code" in err && err.code === "EPIPE"
- }
|