(logger: EmittingLogger, file: string, header: string, maxLogLineLength: number, logCategories: LogCategory[], excludeLogCategories = false)
| 105 | } |
| 106 | |
| 107 | export function captureLogs(logger: EmittingLogger, file: string, header: string, maxLogLineLength: number, logCategories: LogCategory[], excludeLogCategories = false): IAmDisposableAsync { |
| 108 | if (!file || !path.isAbsolute(file)) |
| 109 | throw new Error("Path passed to logTo must be an absolute path"); |
| 110 | const time = (detailed = false) => detailed ? `[${(new Date()).toTimeString()}] ` : `[${(new Date()).toLocaleTimeString()}] `; |
| 111 | createFolderForFile(file); |
| 112 | let logStream: fs.WriteStream | undefined = fs.createWriteStream(file); |
| 113 | if (header) |
| 114 | logStream.write(header); |
| 115 | |
| 116 | const categoryNames = logCategories.map((c) => LogCategory[c]); |
| 117 | logStream.write(`${excludeLogCategories ? "Not " : ""}Logging Categories:${platformEol} ${categoryNames.join(", ")}${platformEol}${platformEol}`); |
| 118 | |
| 119 | logStream.write(`${(new Date()).toDateString()} ${time(true)}Log file started${platformEol}`); |
| 120 | let fileLogger: IAmDisposableAsync | undefined = logger.onLog((e) => { |
| 121 | if (!logStream) |
| 122 | return; |
| 123 | |
| 124 | // We should log this event if: |
| 125 | // - We don't have a category filter; or |
| 126 | // - The category filter includes this category; or |
| 127 | // - The log is WARN/ERROR (they get logged everywhere). |
| 128 | const shouldLog = (excludeLogCategories |
| 129 | ? !logCategories.includes(e.category) |
| 130 | : logCategories.includes(e.category)) |
| 131 | || e.severity === LogSeverity.Warn |
| 132 | || e.severity === LogSeverity.Error; |
| 133 | if (!shouldLog) |
| 134 | return; |
| 135 | |
| 136 | logStream.write(`${e.toLine(maxLogLineLength)}${os.EOL}`); |
| 137 | }); |
| 138 | return { |
| 139 | async dispose(): Promise<void> { |
| 140 | if (fileLogger) { |
| 141 | await fileLogger.dispose(); |
| 142 | fileLogger = undefined; |
| 143 | } |
| 144 | return new Promise((resolve) => { |
| 145 | if (logStream) { |
| 146 | logStream.write(`${(new Date()).toDateString()} ${time(true)}Log file ended${os.EOL}`); |
| 147 | logStream.once("finish", resolve); |
| 148 | logStream.end(); |
| 149 | logStream = undefined; |
| 150 | } |
| 151 | }); |
| 152 | }, |
| 153 | }; |
| 154 | } |
| 155 | |
| 156 | export class RingLog { |
| 157 | private readonly lines: string[]; |
no test coverage detected