fix(logs): use local date for log filenames and expand export redaction (#131)

This commit is contained in:
2026-06-27 21:08:11 -07:00
committed by GitHub
parent 5326ad32f5
commit 36f94151b8
12 changed files with 946 additions and 27 deletions
+34 -17
View File
@@ -1,8 +1,9 @@
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { resolveLogBaseDir } from '../../shared/log-files';
import { localDateKey, resolveLogBaseDir } from '../../shared/log-files';
import { writeStoredZip } from '../../shared/stored-zip';
import { redactLogExportText } from './log-redaction';
type LogCandidate = {
path: string;
@@ -29,16 +30,10 @@ export type ExportLogsOptions = {
now?: Date;
};
const REDACTED_USER = '<user>';
function pad(value: number): string {
return String(value).padStart(2, '0');
}
function localDateKey(date: Date): string {
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
}
function localWeekKey(date: Date): string {
const startOfYear = new Date(date.getFullYear(), 0, 1);
const dayOfYear =
@@ -126,17 +121,41 @@ function selectMostRecentPerKind(candidates: LogCandidate[]): LogCandidate[] {
return [...byKind.values()].sort((left, right) => left.name.localeCompare(right.name));
}
function localDateEndMs(dateKey: string): number | null {
const match = dateKey.match(/^(\d{4})-(\d{2})-(\d{2})$/);
if (!match) return null;
const year = Number(match[1]);
const month = Number(match[2]);
const day = Number(match[3]);
const date = new Date(year, month - 1, day, 23, 59, 59, 999);
if (
Number.isNaN(date.getTime()) ||
date.getFullYear() !== year ||
date.getMonth() !== month - 1 ||
date.getDate() !== day
) {
return null;
}
return date.getTime();
}
function localWeekEndMs(weekKey: string): number | null {
const match = weekKey.match(/^(\d{4})-W(\d{2})$/);
if (!match) return null;
const year = Number(match[1]);
const week = Number(match[2]);
const date = new Date(year, 0, week * 7, 23, 59, 59, 999);
return Number.isNaN(date.getTime()) ? null : date.getTime();
}
function candidateFreshnessMs(candidate: LogCandidate): number {
if (candidate.fileDateKey) {
return Date.parse(`${candidate.fileDateKey}T23:59:59.999Z`);
return localDateEndMs(candidate.fileDateKey) ?? candidate.mtimeMs;
}
if (candidate.fileWeekKey) {
const match = candidate.fileWeekKey.match(/^(\d{4})-W(\d{2})$/);
if (match) {
const year = Number(match[1]);
const week = Number(match[2]);
return Date.UTC(year, 0, week * 7, 23, 59, 59, 999);
}
return localWeekEndMs(candidate.fileWeekKey) ?? candidate.mtimeMs;
}
return candidate.mtimeMs;
}
@@ -167,9 +186,7 @@ function selectLogCandidates(
}
export function maskUsernamesInLogText(text: string): string {
return text
.replace(/(\/(?:home|Users)\/)([^/\r\n]+)(?=\/|$)/g, `$1${REDACTED_USER}`)
.replace(/([A-Za-z]:[\\/]+Users[\\/]+)([^\\/:\r\n]+)(?=[\\/]|$)/g, `$1${REDACTED_USER}`);
return redactLogExportText(text);
}
export function exportLogsArchive(options: ExportLogsOptions = {}): ExportLogsResult {