Add Serilog console logging across the API

Information at endpoint and service-method boundaries, Debug in deeper
helpers, Warning before expected/recoverable failures (not-found,
validation, agent tool errors), Error on caught exceptions. Serilog
wraps the exception handler so request-completion logs report the
resolved status code rather than the raw exception. Never logs prose
bodies or the Anthropic API key.
This commit is contained in:
James Wampler
2026-08-06 12:11:20 -07:00
parent 4f396bb5f9
commit 04917fa09e
34 changed files with 790 additions and 147 deletions
+9 -1
View File
@@ -33,7 +33,8 @@ public class NovelAgentToolset(
BeatService beats,
SceneService scenes,
TagService tags,
OpenQuestionService questions)
OpenQuestionService questions,
ILogger<NovelAgentToolset> logger)
{
private static readonly JsonSerializerOptions SerializerOptions = new()
{
@@ -57,24 +58,31 @@ public class NovelAgentToolset(
{
if (!ByName.TryGetValue(name, out var tool))
{
logger.LogWarning("Agent requested unknown tool {Tool}", name);
return new AgentToolResult($"No such tool: '{name}'.", true);
}
logger.LogDebug("Running tool {Tool} for project {ProjectId}", name, projectId);
try
{
var result = await tool.Handler(projectId, input, ct);
logger.LogDebug("Tool {Tool} for project {ProjectId} succeeded", name, projectId);
return new AgentToolResult(JsonSerializer.Serialize(result, SerializerOptions), false);
}
catch (NotFoundException ex)
{
logger.LogWarning(ex, "Tool {Tool} for project {ProjectId} failed: not found", name, projectId);
return new AgentToolResult(ex.Message, true);
}
catch (ArgumentException ex)
{
logger.LogWarning(ex, "Tool {Tool} for project {ProjectId} failed: invalid argument", name, projectId);
return new AgentToolResult(ex.Message, true);
}
catch (InvalidOperationException ex)
{
logger.LogWarning(ex, "Tool {Tool} for project {ProjectId} failed: invalid operation", name, projectId);
return new AgentToolResult(ex.Message, true);
}
}