Skip to content

Commit d3c176f

Browse files
committed
Improve logs
1 parent e01f09c commit d3c176f

File tree

5 files changed

+62
-30
lines changed

5 files changed

+62
-30
lines changed

next.config.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ const nextConfig: NextConfig = {
4545
destination: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
4646
permanent: true,
4747
},
48+
{
49+
source: "/(.*)",
50+
has: [
51+
{
52+
type: "header",
53+
key: "next-action",
54+
value: "x",
55+
},
56+
],
57+
destination: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
58+
permanent: true,
59+
},
4860
];
4961
},
5062
turbopack: {

src/app/auth/error/route.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ import type { NextRequest } from "next/server";
33

44
import { msg } from "@lingui/core/macro";
55

6-
import { authErrors } from "~/lib/auth/errors";
6+
import { authErrors, commonErrors } from "~/lib/auth/errors";
77
import { logger } from "~/lib/logger";
88

99
export const dynamic = "force-dynamic";
1010

1111
export function GET(request: NextRequest): Promise<Response> {
12-
logger.error("Auth error", { request });
13-
1412
let messageId = msg`Errore sconosciuto`;
1513

1614
const code = request.nextUrl.searchParams.get("error")?.toUpperCase();
1715
if (!code) {
18-
logger.error("Missing auth error code", { request });
16+
logger.error("Missing auth error code");
1917
} else if (code in authErrors) {
2018
messageId = authErrors[code];
2119
} else {
2220
logger.error("Missing auth code", { code });
2321
}
2422

25-
logger.error("Auth error", { code });
23+
if (code && !commonErrors.includes(code)) {
24+
logger.error("Auth error", { code });
25+
}
2626
redirect(`/?error=${encodeURIComponent(messageId.id)}`);
2727
}

src/instrumentation.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ import type { Instrumentation } from "next";
22

33
import { outLogger } from "~/lib/logger";
44

5-
export const onRequestError: Instrumentation.onRequestError = (_err, request, context) => {
5+
export const onRequestError: Instrumentation.onRequestError = (error, request, context) => {
66
const headers = Object.entries(request.headers).flatMap(([key, values]): [string, string][] => {
77
if (!values) return [];
88
return Array.isArray(values) ? values.map((value) => [key, value]) : [[key, values]];
99
});
1010

11-
outLogger.error("Error while processing request", { request, context }, new Headers(headers));
11+
outLogger.error(
12+
"Error while processing request",
13+
{ error, request, context },
14+
new Headers(headers),
15+
);
1216
};

src/lib/auth/errors.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,17 @@ export const authErrors: Record<keyof typeof auth.$ERROR_CODES | string, Message
5757
VALIDATION_ERROR: msg`Dati non validi`,
5858
};
5959

60+
export const commonErrors: (keyof typeof authErrors)[] = [
61+
"INVALID_EMAIL_OR_PASSWORD",
62+
"INVALID_USERNAME_OR_PASSWORD",
63+
"INVALID_PASSWORD",
64+
"USER_NOT_FOUND",
65+
"PLEASE_RESTART_THE_PROCESS",
66+
"ACCESS_DENIED",
67+
];
68+
6069
export function getAuthError(err: unknown): MessageDescriptor {
61-
const isCommonError =
62-
err instanceof APIError &&
63-
[
64-
"INVALID_EMAIL_OR_PASSWORD",
65-
"INVALID_USERNAME_OR_PASSWORD",
66-
"INVALID_PASSWORD",
67-
"USER_NOT_FOUND",
68-
"PLEASE_RESTART_THE_PROCESS",
69-
"ACCESS_DENIED",
70-
].includes(err.body?.code ?? "");
70+
const isCommonError = err instanceof APIError && commonErrors.includes(err.body?.code ?? "");
7171

7272
if (!isCommonError) {
7373
logger.error("Auth error", err);

src/lib/logger.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,19 @@ export async function logRequest(req: NextRequest, userId: string | undefined, t
5252
referer,
5353
};
5454

55-
const labels: Record<string, string> = {};
56-
if (userId) {
57-
labels.userId = userId;
58-
}
59-
6055
const metadata = buildEntry({
6156
severity: "INFO",
6257
httpRequest,
63-
labels,
6458
trace,
6559
});
60+
if (userId) {
61+
metadata.labels!.userId = userId;
62+
}
63+
req.headers.forEach((value, key) => {
64+
if (key.startsWith("sec-ch-")) {
65+
metadata.labels![key] = value;
66+
}
67+
});
6668

6769
const log = logging.log("training-requests");
6870
const entry = log.entry(metadata);
@@ -73,18 +75,22 @@ async function writeLog(
7375
logName: string,
7476
severity: "DEBUG" | "INFO" | "WARNING" | "ERROR",
7577
headerList: Headers | null | undefined,
78+
stack: string | undefined,
7679
message: string,
7780
data?: any,
7881
) {
7982
if (!logging) return;
8083

8184
const trace = headerList?.get("x-trace");
8285

86+
const metadata = buildEntry({ severity, trace });
87+
8388
const log = logging.log(`training-${logName}`);
84-
const entry = log.entry(
85-
buildEntry({ severity, trace }),
86-
isErrorLike(data) ? { error: serializeError(data), message } : { ...data, message },
87-
);
89+
const entry = log.entry(metadata, {
90+
...serializeError(isErrorLike(data) ? { error: data } : data),
91+
message,
92+
stack,
93+
});
8894
await log.write(entry);
8995
}
9096

@@ -94,7 +100,9 @@ function logInsideRequest(
94100
message: string,
95101
data?: any,
96102
) {
97-
after(async () => writeLog(logName, severity, await headers(), message, data));
103+
const trace: { stack?: string } = {};
104+
Error.captureStackTrace(trace, logInsideRequest);
105+
after(async () => writeLog(logName, severity, await headers(), trace.stack, message, data));
98106
}
99107

100108
function logOutsideRequest(
@@ -104,7 +112,9 @@ function logOutsideRequest(
104112
data?: any,
105113
headerList?: Headers | null,
106114
) {
107-
void writeLog(logName, severity, headerList, message, data);
115+
const trace: { stack?: string } = {};
116+
Error.captureStackTrace(trace, logOutsideRequest);
117+
void writeLog(logName, severity, headerList, trace.stack, message, data);
108118
}
109119

110120
export const logger = {
@@ -125,7 +135,13 @@ function logAuth(
125135
message: string,
126136
...params: any[]
127137
) {
128-
logOutsideRequest("auth", severity, message, merge({}, ...params), headerList);
138+
logOutsideRequest(
139+
"auth",
140+
severity === "ERROR" ? "WARNING" : severity,
141+
message,
142+
merge({}, ...params),
143+
headerList,
144+
);
129145
}
130146

131147
export const authLogger: AuthLogger = {

0 commit comments

Comments
 (0)