Capture logs
This commit is contained in:
parent
09dabcab66
commit
e800d681ae
50
aocsync.py
50
aocsync.py
@ -477,7 +477,8 @@ class CargoAOCRunner:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def run_benchmarks(repo_path: Path, year: int, user: str = "unknown",
|
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
|
"""Run cargo aoc benchmarks and parse results
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -486,6 +487,7 @@ class CargoAOCRunner:
|
|||||||
user: User name for the results
|
user: User name for the results
|
||||||
repo_url: Repository URL for linking
|
repo_url: Repository URL for linking
|
||||||
is_multi_year: True if this is a multi-year repo (repo_path is already the year directory)
|
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 = []
|
results = []
|
||||||
repo_path = Path(repo_path)
|
repo_path = Path(repo_path)
|
||||||
@ -528,6 +530,26 @@ class CargoAOCRunner:
|
|||||||
timeout=300 # 5 minute timeout per day
|
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:
|
if result.returncode != 0:
|
||||||
logger.warning(f"cargo aoc failed for day {day} in {work_dir}: {result.stderr}")
|
logger.warning(f"cargo aoc failed for day {day} in {work_dir}: {result.stderr}")
|
||||||
continue
|
continue
|
||||||
@ -549,9 +571,19 @@ class CargoAOCRunner:
|
|||||||
results.extend(day_results)
|
results.extend(day_results)
|
||||||
|
|
||||||
except subprocess.TimeoutExpired:
|
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:
|
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
|
return results
|
||||||
|
|
||||||
@ -1043,6 +1075,10 @@ class HTMLGenerator:
|
|||||||
for part in day.values():
|
for part in day.values():
|
||||||
users_with_data.update(part.keys())
|
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"""<!DOCTYPE html>
|
html = f"""<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -1445,6 +1481,7 @@ class HTMLGenerator:
|
|||||||
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<p><strong>Users:</strong> """ + ', '.join(sorted(users)) + """</p>
|
<p><strong>Users:</strong> """ + ', '.join(sorted(users)) + """</p>
|
||||||
|
""" + (f'<p><a href="cargo-aoc.log" target="_blank">📋 View Cargo AOC Logs</a></p>' if log_file_exists else '') + """
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -1798,8 +1835,12 @@ class AOCSync:
|
|||||||
repo_url: str = "", is_multi_year: bool = False):
|
repo_url: str = "", is_multi_year: bool = False):
|
||||||
"""Run benchmarks and store results"""
|
"""Run benchmarks and store results"""
|
||||||
logger.info(f"Running benchmarks for {user} year {year} in {repo_path}")
|
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,
|
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
|
# Store results
|
||||||
for result in results:
|
for result in results:
|
||||||
@ -1846,6 +1887,7 @@ class AOCSync:
|
|||||||
try:
|
try:
|
||||||
# Build rsync command
|
# Build rsync command
|
||||||
# Use trailing slash on source to sync contents, not the directory itself
|
# 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) + "/"
|
source = str(output_dir) + "/"
|
||||||
cmd = ['rsync', '-avz', '--delete', source, destination]
|
cmd = ['rsync', '-avz', '--delete', source, destination]
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user