name: developer-delphi-horse-exception-logger description: Middleware de log de exceções para Horse. Cobre THorseExceptionLogger.New (formato padrão e com format/dir), variáveis de formato (${time}, ${request_clientip}, ${exception}, ${response_status}, etc.) e ordem no pipeline. Fonte: app/package/docs/pacotes/horse-exception-logger.md. model: sonnet thinking: minimal category: project
developer-delphi-horse-exception-logger
Versão interna (ficheiro)
| Campo | Valor |
|---|---|
| FileVersion | 1.0.0 |
| Política | .cursor/VERSION.md |
Responsabilidade única
Middleware que regista exceções do pipeline Horse em ficheiro/console com formato de linha configurável — focado em auditoria, não em log de acesso normal.
When to use
- Registar exceções em disco para auditoria de segurança
- Rastrear erros HTTP (status, método, path, mensagem de exceção)
- Complementar
handle-exceptioncom persistência de erros
When NOT to use
- Log de acesso normal (requests/responses) →
developer-delphi-horse-logger - Intercepção de erros HTTP →
developer-delphi-horse-handle-exception
Documento canônico
app/package/docs/pacotes/horse-exception-logger.md
THorseExceptionLogger — factory de middleware
| Método | Descrição |
|---|---|
THorseExceptionLogger.New | Formato padrão |
THorseExceptionLogger.New(format, dir) | Formato e pasta de log customizados |
Variáveis de formato
| Variável | Conteúdo |
|---|---|
${time} | Data/hora da exceção |
${request_clientip} | IP do cliente |
${request_method} | Verbo HTTP (GET, POST…) |
${request_path_info} | Path da rota |
${request_version} | Versão HTTP |
${response_status} | Código HTTP da resposta |
${exception} | Mensagem da exceção |
Formato padrão: ${request_clientip} [${time}] ${request_method} ${request_path_info} ${request_version} ${response_status} ${exception}
Ordem no pipeline
THorse
.Use(Jhonson) // 1.º
.Use(HandleException) // 2.º — formata erros HTTP
.Use(THorseExceptionLogger.New()) // 3.º — regista exceção (após handle)
.Use(THorseLoggerManager.HorseCallback); // 4.º — log de acesso
Exemplos
Mínimo
uses Horse, Horse.Exception.Logger;
begin
THorse.Use(THorseExceptionLogger.New());
THorse.Get('/raise',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
raise Exception.Create('Exception test');
end);
THorse.Listen(9000);
end.
Com formato e pasta customizados
THorse.Use(
THorseExceptionLogger.New(
'${time} - ${request_method} ${request_path_info} ${exception}',
ExtractFilePath(ParamStr(0)) + 'logs'
)
);
Formato para auditoria de segurança
THorse.Use(
THorseExceptionLogger.New(
'${time} | ${request_clientip} | ${request_method} ${request_path_info} | ${response_status} | ${exception}',
'C:\logs\api\exceptions'
)
);
Stack completo com todos os loggers
uses
Horse, Horse.Jhonson, Horse.HandleException,
Horse.Exception.Logger, Horse.Logger, Horse.Logger.Provider.LogFile;
begin
THorse
.Use(Jhonson)
.Use(HandleException)
.Use(THorseExceptionLogger.New())
.Use(THorseLoggerManager.HorseCallback);
THorse.Listen(9000);
end.
Notas GestorERP
- Registar DEPOIS de
HandleExceptione ANTES do logger de acesso boss.jsondo pacote temname: horse-logger(cópia upstream) — identificador Boss correcto:arvanus/horse-exception-loggerunita usar:Horse.Exception.Logger
Changelog (este arquivo)
- 1.0.0 (12/04/2026): Criação — skill middleware exception-logger.