From e800d681ae823d1897879103226558f21c79f42d Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Thu, 4 Dec 2025 10:21:29 -0800 Subject: [PATCH] Capture logs --- aocsync.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/aocsync.py b/aocsync.py index 8100d2b..0ef7156 100755 --- a/aocsync.py +++ b/aocsync.py @@ -477,7 +477,8 @@ class CargoAOCRunner: @staticmethod def run_benchmarks(repo_path: Path, year: int, user: str = "unknown", - repo_url: str = "", is_multi_year: bool = False) -> List[PerformanceResult]: + repo_url: str = "", is_multi_year: bool = False, + log_file: Optional[Path] = None) -> List[PerformanceResult]: """Run cargo aoc benchmarks and parse results Args: @@ -486,6 +487,7 @@ class CargoAOCRunner: user: User name for the results repo_url: Repository URL for linking is_multi_year: True if this is a multi-year repo (repo_path is already the year directory) + log_file: Optional path to log file to append cargo aoc output to """ results = [] repo_path = Path(repo_path) @@ -528,6 +530,26 @@ class CargoAOCRunner: timeout=300 # 5 minute timeout per day ) + # Write to log file if provided + if log_file: + timestamp = datetime.now().isoformat() + with open(log_file, 'a', encoding='utf-8') as f: + f.write(f"\n{'='*80}\n") + f.write(f"[{timestamp}] {user} - Year {year} - Day {day}\n") + f.write(f"Command: {' '.join(cmd)}\n") + f.write(f"Working Directory: {work_dir}\n") + f.write(f"Return Code: {result.returncode}\n") + f.write(f"{'='*80}\n") + if result.stdout: + f.write("STDOUT:\n") + f.write(result.stdout) + f.write("\n") + if result.stderr: + f.write("STDERR:\n") + f.write(result.stderr) + f.write("\n") + f.write(f"{'='*80}\n\n") + if result.returncode != 0: logger.warning(f"cargo aoc failed for day {day} in {work_dir}: {result.stderr}") continue @@ -549,9 +571,19 @@ class CargoAOCRunner: results.extend(day_results) except subprocess.TimeoutExpired: - logger.error(f"Timeout running cargo aoc for day {day}") + error_msg = f"Timeout running cargo aoc for day {day}" + logger.error(error_msg) + if log_file: + timestamp = datetime.now().isoformat() + with open(log_file, 'a', encoding='utf-8') as f: + f.write(f"\n[{timestamp}] ERROR: {error_msg}\n") except Exception as e: - logger.error(f"Error running cargo aoc for day {day}: {e}") + error_msg = f"Error running cargo aoc for day {day}: {e}" + logger.error(error_msg) + if log_file: + timestamp = datetime.now().isoformat() + with open(log_file, 'a', encoding='utf-8') as f: + f.write(f"\n[{timestamp}] ERROR: {error_msg}\n") return results @@ -1043,6 +1075,10 @@ class HTMLGenerator: for part in day.values(): users_with_data.update(part.keys()) + # Check if log file exists + log_file_path = Path(config.output_dir) / 'cargo-aoc.log' + log_file_exists = log_file_path.exists() + html = f""" @@ -1445,6 +1481,7 @@ class HTMLGenerator:

Users: """ + ', '.join(sorted(users)) + """

+ """ + (f'

📋 View Cargo AOC Logs

' if log_file_exists else '') + """
""" @@ -1798,8 +1835,12 @@ class AOCSync: repo_url: str = "", is_multi_year: bool = False): """Run benchmarks and store results""" logger.info(f"Running benchmarks for {user} year {year} in {repo_path}") + # Create log file path in output directory + log_file = Path(self.config.output_dir) / 'cargo-aoc.log' + log_file.parent.mkdir(parents=True, exist_ok=True) results = CargoAOCRunner.run_benchmarks(repo_path, year=year, user=user, - repo_url=repo_url, is_multi_year=is_multi_year) + repo_url=repo_url, is_multi_year=is_multi_year, + log_file=log_file) # Store results for result in results: @@ -1846,6 +1887,7 @@ class AOCSync: try: # Build rsync command # Use trailing slash on source to sync contents, not the directory itself + # This will include all files including cargo-aoc.log source = str(output_dir) + "/" cmd = ['rsync', '-avz', '--delete', source, destination]