feat(web-info): в секции ошибок только error и выше + путь к журналу

Печатались последние 5 строк журнала как есть, поэтому секция «Последние
ошибки» показывала notice старта, а на Windows ещё и штатный шум
winnt_accept — содержательные записи вытеснялись. Теперь фильтр по уровню
error/crit/alert/emerg; AH02538 отсеивается отдельно как след нашего же
рестарта Apache при публикации.

Путь к журналу печатается всегда — за отсеянными уровнями и полным
контекстом читается файл.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-08 15:37:24 +03:00
co-authored by Claude Opus 5
parent 88535a759b
commit b8cbb0111a
3 changed files with 26 additions and 13 deletions
+5 -3
View File
@@ -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.
+9 -4
View File
@@ -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
+12 -6
View File
@@ -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: