feat(POS-FIX-6): completed feature
This commit is contained in:
@@ -7,6 +7,14 @@ interface LogEntry {
|
||||
levelName: string;
|
||||
msg: string;
|
||||
err?: Record<string, unknown>;
|
||||
method?: string;
|
||||
url?: string;
|
||||
statusCode?: number;
|
||||
durationMs?: number;
|
||||
ip?: string;
|
||||
remoteIp?: string;
|
||||
userAgent?: string;
|
||||
referer?: string | null;
|
||||
raw: string;
|
||||
}
|
||||
|
||||
@@ -39,6 +47,13 @@ function parseLine(line: string): LogEntry {
|
||||
levelName: LEVEL_NAMES[level] ?? 'INFO',
|
||||
msg: obj.msg ?? '',
|
||||
err: obj.err,
|
||||
method: obj.method,
|
||||
url: obj.url,
|
||||
statusCode: obj.statusCode,
|
||||
durationMs: obj.durationMs,
|
||||
ip: obj.ip ?? obj.remoteIp,
|
||||
userAgent: obj.userAgent,
|
||||
referer: obj.referer,
|
||||
raw: line,
|
||||
};
|
||||
} catch {
|
||||
@@ -206,6 +221,44 @@ export function ServerLogViewer({ backendUrl = 'http://192.168.18.93:3000' }: Se
|
||||
</td>
|
||||
{/* Message */}
|
||||
<td className="px-3 py-0.5 text-gray-300 select-all">
|
||||
{/* Extra fields for HTTP request logs */}
|
||||
{entry.method && entry.url && (
|
||||
<span className="mr-2">
|
||||
<span className={`font-bold ${
|
||||
entry.statusCode && entry.statusCode >= 500 ? 'text-red-400' :
|
||||
entry.statusCode && entry.statusCode >= 400 ? 'text-amber-400' :
|
||||
entry.statusCode && entry.statusCode >= 300 ? 'text-blue-400' :
|
||||
'text-green-400'
|
||||
}`}>{entry.method}</span>
|
||||
<span className="text-gray-400 ml-1">{entry.url}</span>
|
||||
{entry.statusCode && (
|
||||
<span className={`ml-2 font-bold ${
|
||||
entry.statusCode >= 500 ? 'text-red-400' :
|
||||
entry.statusCode >= 400 ? 'text-amber-400' :
|
||||
entry.statusCode >= 300 ? 'text-blue-400' :
|
||||
'text-green-400'
|
||||
}`}>{entry.statusCode}</span>
|
||||
)}
|
||||
{entry.durationMs !== undefined && (
|
||||
<span className="ml-1 text-gray-500">{entry.durationMs}ms</span>
|
||||
)}
|
||||
<span className="ml-2 text-gray-600">·</span>
|
||||
{entry.ip && (
|
||||
<span className="ml-2 text-gray-500" title="IP origen">🌐 {entry.ip}</span>
|
||||
)}
|
||||
{entry.referer && (
|
||||
<span className="ml-2 text-gray-500" title="Desde">← {entry.referer.replace(/^https?:\/\//, '').slice(0, 60)}</span>
|
||||
)}
|
||||
{entry.userAgent && (
|
||||
<span className="ml-2 text-gray-600" title="User-Agent">
|
||||
{entry.userAgent.includes('Postman') ? '📮 Postman' :
|
||||
entry.userAgent.includes('curl') ? '📡 curl' :
|
||||
entry.userAgent.includes('node') ? '⚙️ Node' :
|
||||
'🖥️ Browser'}
|
||||
</span>
|
||||
)}
|
||||
</span>
|
||||
)}
|
||||
{entry.msg}
|
||||
{entry.err && (
|
||||
<span className="ml-2 text-red-400">
|
||||
|
||||
Reference in New Issue
Block a user