From efcc66d63b37c6af1f65cfa929903eea1ae9c11b Mon Sep 17 00:00:00 2001
From: Jonathan Jogenfors <jonathan@jogenfors.se>
Date: Fri, 8 Sep 2023 17:09:59 +0200
Subject: [PATCH] feat(web): only log http errors in web container (#4031)

* feat: reduce web container log verbosity on error

* fix: web test

* feat: better error logging

---------

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
---
 web/src/hooks.server.ts | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/web/src/hooks.server.ts b/web/src/hooks.server.ts
index 6abd4a2f21..809e3b0c3d 100644
--- a/web/src/hooks.server.ts
+++ b/web/src/hooks.server.ts
@@ -3,6 +3,8 @@ import type { Handle, HandleServerError } from '@sveltejs/kit';
 import type { AxiosError, AxiosResponse } from 'axios';
 import { ImmichApi } from './api/api';
 
+const LOG_PREFIX = '[hooks.server.ts]';
+
 export const handle = (async ({ event, resolve }) => {
   const basePath = env.PUBLIC_IMMICH_SERVER_URL || 'http://immich-server:3001';
   const accessToken = event.cookies.get('immich_access_token');
@@ -16,11 +18,14 @@ export const handle = (async ({ event, resolve }) => {
       const { data: user } = await api.userApi.getMyUserInfo();
       event.locals.user = user;
     } catch (err) {
-      const apiError = err as AxiosError;
+      console.log(`${LOG_PREFIX} Unable to get my user`, parseError(err));
 
+      const apiError = err as AxiosError;
       // Ignore 401 unauthorized errors and log all others.
-      if (apiError.response?.status !== 401) {
-        console.error('[ERROR] hooks.server.ts [handle]:', err);
+      if (apiError.response?.status && apiError.response?.status !== 401) {
+        console.error(`${LOG_PREFIX}:handle`, err);
+      } else if (!apiError.response?.status) {
+        console.error(`${LOG_PREFIX}:handle`, apiError?.message);
       }
     }
   }
@@ -36,8 +41,9 @@ export const handle = (async ({ event, resolve }) => {
 
 const DEFAULT_MESSAGE = 'Hmm, not sure about that. Check the logs or open a ticket?';
 
-export const handleError: HandleServerError = async ({ error }) => {
+const parseError = (error: unknown) => {
   const httpError = error as AxiosError;
+  const request = httpError?.request as Request & { path: string };
   const response = httpError?.response as AxiosResponse<{
     message: string;
     statusCode: number;
@@ -49,9 +55,23 @@ export const handleError: HandleServerError = async ({ error }) => {
     code += ` - ${response.data?.error || response.statusText}`;
   }
 
+  if (request && response) {
+    console.log({
+      status: response.status,
+      url: `${request.method} ${request.path}`,
+      response: response.data || 'No data',
+    });
+  }
+
   return {
     message: response?.data?.message || httpError?.message || DEFAULT_MESSAGE,
     code,
     stack: httpError?.stack,
   };
 };
+
+export const handleError: HandleServerError = ({ error }) => {
+  const result = parseError(error);
+  console.error(`${LOG_PREFIX}:handleError ${result.message}`);
+  return result;
+};