diff --git a/.claude/skills/web-info/SKILL.md b/.claude/skills/web-info/SKILL.md index 5bb1c65f..f0be7b92 100644 --- a/.claude/skills/web-info/SKILL.md +++ b/.claude/skills/web-info/SKILL.md @@ -47,10 +47,12 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1" <па | `[WS HTTP OData]` | Что опубликовано для базы: SOAP-сервисы, HTTP-сервисы, стандартный OData | | `+ext` (`WS+ext`) | Публикуются и сервисы, поставляемые расширениями конфигурации | | `(нет публикаций)` | Apache стоит, но ни одна база не опубликована — нужен `/web-publish` | -| `(пусто)` / `(нет файла)` в ошибках | Норма, а не сбой: журнал пуст или ещё не создан | +| `(ошибок нет)` / `(нет файла)` | Норма, а не сбой: ошибок в журнале нет или он ещё не создан | -Секция ошибок — последние строки журнала Apache, в том числе информационные (`notice` при старте). -Наличие строк само по себе о проблеме не говорит — смотри уровень (`error`, `warn`). +Секция ошибок — последние 5 записей уровня `error` и выше. `notice` (строки старта), `warn` +(штатный шум `winnt_accept` на Windows) и `AH02538` (след нашего же рестарта Apache) отсеиваются, +иначе они вытесняют содержательное. Записи могут быть давними — смотри дату в строке. Путь к +журналу печатается рядом: нужен полный контекст или отсеянные уровни — читай файл напрямую. Публикация в списке не означает, что база отвечает: `/web-info` читает `httpd.conf` и дескрипторы, а не опрашивает URL-ы. Если нужно убедиться — дёрни URL. diff --git a/.claude/skills/web-info/scripts/web-info.ps1 b/.claude/skills/web-info/scripts/web-info.ps1 index fa88ea47..1cc7d084 100644 --- a/.claude/skills/web-info/scripts/web-info.ps1 +++ b/.claude/skills/web-info/scripts/web-info.ps1 @@ -1,4 +1,4 @@ -# web-info v1.1 — Apache & 1C publication status +# web-info v1.2 — Apache & 1C publication status # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills <# .SYNOPSIS @@ -162,13 +162,18 @@ if (-not $errorLog -or -not (Test-Path $errorLog)) { } if ($errorLog -and (Test-Path $errorLog)) { - $lines = Get-Content $errorLog -Tail 5 -ErrorAction SilentlyContinue - if ($lines -and $lines.Count -gt 0) { + Write-Host "Журнал: $errorLog" -ForegroundColor DarkGray + # Только error и выше: warn забит штатным шумом winnt_accept, notice — строки старта. + # AH02538 — след нашего же рестарта (родитель убит), пишется как crit при каждой публикации + $lines = Get-Content $errorLog -ErrorAction SilentlyContinue | + Where-Object { $_ -match '\[[a-z_]+:(error|crit|alert|emerg)\]' -and $_ -notmatch 'AH02538' } | + Select-Object -Last 5 + if ($lines) { foreach ($line in $lines) { Write-Host " $line" -ForegroundColor DarkGray } } else { - Write-Host "(пусто)" -ForegroundColor Green + Write-Host "(ошибок нет)" -ForegroundColor Green } } else { Write-Host "(нет файла)" -ForegroundColor Green diff --git a/.claude/skills/web-info/scripts/web-info.py b/.claude/skills/web-info/scripts/web-info.py index 503c3284..44b7b6fc 100644 --- a/.claude/skills/web-info/scripts/web-info.py +++ b/.claude/skills/web-info/scripts/web-info.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# web-info v1.1 — Apache & 1C publication status +# web-info v1.2 — Apache & 1C publication status # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """ @@ -151,22 +151,28 @@ def main(): m_log = re.search(r'(?m)^\s*ErrorLog\s+"?([^"\r\n]+)"?', conf_content) if m_log: log_path = m_log.group(1).strip() - error_log = log_path if os.path.isabs(log_path) else os.path.join(apache_path, log_path) + error_log = os.path.normpath( + log_path if os.path.isabs(log_path) else os.path.join(apache_path, log_path)) if not error_log or not os.path.exists(error_log): error_log = next((p for p in (os.path.join(apache_path, 'logs', n) for n in ('error_log', 'error.log')) if os.path.exists(p)), None) if error_log and os.path.exists(error_log): + print(f'Журнал: {error_log}') try: with open(error_log, 'r', encoding='utf-8-sig', errors='replace') as f: all_lines = f.readlines() - tail_lines = all_lines[-5:] if len(all_lines) >= 5 else all_lines - if tail_lines: - for line in tail_lines: + # Только error и выше: warn забит штатным шумом winnt_accept, notice — строки старта. + # AH02538 — след нашего же рестарта (родитель убит), пишется как crit при каждой публикации + err_lines = [ln for ln in all_lines + if re.search(r'\[[a-z_]+:(error|crit|alert|emerg)\]', ln) + and 'AH02538' not in ln] + if err_lines: + for line in err_lines[-5:]: print(f' {line.rstrip()}') else: - print('(пусто)') + print('(ошибок нет)') except Exception: print('(ошибка чтения)') else: