diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/ClientLogs.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/ClientLogs.razor
index 21e30d1..610d676 100644
--- a/src/TaxBaik.Web.Client/Components/Admin/Pages/ClientLogs.razor
+++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/ClientLogs.razor
@@ -23,24 +23,6 @@
Info @_summary.InfoCount
}
- @if (_groups.Count > 0)
- {
-
- @foreach (var group in _groups)
- {
-
-
- @group.Message
- @group.LastSeen
-
- }
-
- }
+
+
@if (_loading)
@@ -76,6 +60,27 @@
}
}
+ @if (_groups.Count > 0)
+ {
+
+ 반복 오류 그룹 보기
+
+ @foreach (var group in _groups)
+ {
+
+
+ @group.Message
+ @group.LastSeen
+
+ }
+
+
+ }
@@ -85,6 +90,8 @@
private bool _loading = true;
private string _query = "";
private string _level = "";
+ private string _start = "";
+ private string _end = "";
private ClientLogSummaryDto? _summary;
protected override async Task OnInitializedAsync()
@@ -101,7 +108,7 @@
try
{
_summary = await Http.GetFromJsonAsync("/taxbaik/api/client-logs/summary");
- var url = $"/taxbaik/api/client-logs/recent?q={Uri.EscapeDataString(_query ?? string.Empty)}&level={Uri.EscapeDataString(_level ?? string.Empty)}";
+ var url = $"/taxbaik/api/client-logs/recent?q={Uri.EscapeDataString(_query ?? string.Empty)}&level={Uri.EscapeDataString(_level ?? string.Empty)}&start={Uri.EscapeDataString(_start ?? string.Empty)}&end={Uri.EscapeDataString(_end ?? string.Empty)}";
var result = await Http.GetFromJsonAsync>(url);
var grouped = await Http.GetFromJsonAsync>("/taxbaik/api/client-logs/groups");
if (result is not null)
diff --git a/src/TaxBaik.Web/Endpoints/ClientLogs/GetRecentLogsEndpoint.cs b/src/TaxBaik.Web/Endpoints/ClientLogs/GetRecentLogsEndpoint.cs
index 52a0937..a333b0f 100644
--- a/src/TaxBaik.Web/Endpoints/ClientLogs/GetRecentLogsEndpoint.cs
+++ b/src/TaxBaik.Web/Endpoints/ClientLogs/GetRecentLogsEndpoint.cs
@@ -5,6 +5,7 @@ namespace TaxBaik.Web.Endpoints.ClientLogs;
public sealed class RecentClientLogEntry
{
public string? Timestamp { get; set; }
+ public DateTimeOffset? OccurredAt { get; set; }
public string? Level { get; set; }
public string? Source { get; set; }
public string? Message { get; set; }
@@ -37,6 +38,8 @@ public sealed class GetRecentLogsEndpoint : EndpointWithoutRequest("source");
var route = Query("route");
var term = Query("q");
+ var start = ParseDate(Query("start"));
+ var end = ParseDate(Query("end"));
var logDir = Path.Combine(_environment.ContentRootPath, "logs");
if (!Directory.Exists(logDir))
@@ -60,7 +63,7 @@ public sealed class GetRecentLogsEndpoint : EndpointWithoutRequest= 0 ? line[(clientIndex + "ClientLog ".Length)..] : line;
}
- private static bool Matches(RecentClientLogEntry entry, string? level, string? source, string? route, string? term)
+ private static bool Matches(RecentClientLogEntry entry, string? level, string? source, string? route, string? term, DateTimeOffset? start, DateTimeOffset? end)
{
if (!string.IsNullOrWhiteSpace(level) &&
!string.Equals(entry.Level, level, StringComparison.OrdinalIgnoreCase))
@@ -147,9 +153,29 @@ public sealed class GetRecentLogsEndpoint : EndpointWithoutRequest end))
+ {
+ return false;
+ }
+
return true;
}
+ private static DateTimeOffset? ParseDate(string? value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return null;
+ }
+
+ return DateTimeOffset.TryParse(value, out var parsed) ? parsed : null;
+ }
+
private static string? ExtractNamedValue(string text, string prefix)
{
var index = text.IndexOf(prefix, StringComparison.OrdinalIgnoreCase);