Files
tilbudgivern/docs/LOGGING_SYSTEM.md
alexpolo1 8773d96e94 feat: Add AI-Powered Visual Testing Suite using Selenium and OpenAI Vision API
- Implemented VisualAITester class for automated UI/UX testing
- Configured environment variables for API keys and paths
- Developed methods for browser setup, login, screenshot capture, and image encoding
- Integrated OpenAI Vision API for visual quality analysis with detailed feedback
- Created tests for various application pages including homepage, project flow, geometry form, and more
- Generated comprehensive HTML report summarizing test results and AI analysis
- Added functionality to copy AI prompts for automated issue resolution
2025-11-14 20:27:19 +00:00

8.4 KiB

📊 Logging System Dokumentation

Oversigt

Dette system leverer centraliseret logging til databasen med brugervenlige fejlbeskeder på dansk. Alle fejl, warnings og info-beskeder gemmes struktureret, så de nemt kan søges og analyseres.


🎯 Funktioner

Database logging - Alle logs gemmes i MySQL i stedet for filer
Strukturerede logs - Kontekst, kategori, fejlkoder, request info, osv.
Brugervenlige fejlbeskeder - Danske beskeder med unikke fejlkoder
Performance tracking - Logger response time for alle requests
Admin dashboard - API endpoints til at se og analysere logs
Automatisk cleanup - Gamle logs slettes automatisk (90/180 dage)


🗄️ Database Tabeller

system_logs

Hovedtabel til alle log-indgange:

- id, created_at, level (ERROR/WARNING/INFO/DEBUG)
- context, category, message, error_code
- stack_trace, sql_query, sql_state
- request_method, request_url, request_ip, user_agent
- user_id, user_email
- metadata (JSON)
- resolved, resolved_at, resolved_by, resolution_notes

request_logs

Performance tracking:

- id, created_at, method, url, status_code
- response_time_ms
- user_id, ip_address, user_agent
- metadata (JSON)

Setup: Kør SQL filen for at oprette tabellerne:

mysql -u tilbuduser -p tilbudgivern < database/schema_system_logs.sql

💻 Brug i Koden

1. Logger Funktioner

const logger = require('../src/utils/logger');

// Log en fejl med komplet kontekst
logger.logError('MyContext', error, {
  category: 'API',
  errorCode: 'MY_ERROR_001',
  req: req,  // Express request object
  userId: user.id,
  userMessage: 'Denne besked vises til brugeren',
  metadata: { additionalInfo: 'whatever' }
});

// Log en warning
logger.logWarning('MyContext', 'Dette er en advarsel', {
  category: 'BUSINESS',
  req: req,
  metadata: { someData: 'value' }
});

// Log info
logger.logInfo('MyContext', 'Dette gik godt', {
  category: 'INFO',
  req: req
});

2. Error Handler Middleware

Bruges automatisk i routes når du wrapper med asyncHandler:

const { asyncHandler, ERROR_CODES } = require('../src/middleware/errorHandler');

router.get('/my-endpoint', asyncHandler(async (req, res) => {
  // Hvis der kastes en fejl her, fanges den automatisk
  // og logges med komplet kontekst
  
  const data = await someAsyncFunction();
  
  if (!data) {
    // Kast en 404 fejl
    const error = new Error('Ressource ikke fundet');
    error.status = 404;
    throw error;
  }
  
  // Tag eksterne API fejl
  try {
    await externalAPI.call();
  } catch (error) {
    error.name = 'OrdrestyringError'; // Klassificerer fejlen
    throw error;
  }
  
  res.json({ success: true, data });
}));

3. Request Logger Middleware

Logger automatisk alle API requests (allerede aktiveret i unified-server.js):

// Dette er allerede sat op!
app.use('/api', requestLogger);

Logger:

  • Response time
  • Status codes
  • Langsomme requests (>1000ms)
  • Request/response størrelse

🔍 Fejlkoder

Alle fejl har en unik fejlkode brugere kan referere til:

Kode Beskrivelse Brugerbesked
DB_001 Database connection fejl "Kunne ikke oprette forbindelse til databasen"
DB_002 Database query fejl "Der opstod en fejl ved hentning af data"
VAL_001 Validation fejl "De indtastede data er ikke gyldige"
AUTH_001 Login fejl "Login fejlede. Tjek brugernavn og adgangskode"
API_001 Ordrestyring API fejl "Kunne ikke forbinde til Ordrestyring"
API_002 OpenAI API fejl "AI-tjenesten er midlertidigt utilgængelig"
BIZ_001 Ressource ikke fundet "Den ønskede ressource blev ikke fundet"
SYS_001 Intern fejl "Der opstod en intern fejl"

Se backend/src/middleware/errorHandler.js for alle fejlkoder


📡 Admin API Endpoints

Hent logs

GET /api/admin/logs?level=ERROR&startDate=2024-01-01&limit=100

Query params:

  • level - ERROR, WARNING, INFO, DEBUG
  • context - Kontekst filtrering
  • category - Kategori filtrering
  • errorCode - Specifik fejlkode
  • startDate / endDate - Dato range
  • resolved - true/false
  • limit / offset - Paginering

Hent specifik log

GET /api/admin/logs/:id

Log statistik

GET /api/admin/logs/stats/summary?startDate=2024-01-01

Returnerer:

  • Antal logs per niveau
  • Antal logs per kategori
  • Top 10 hyppigste fejl
  • Antal uløste fejl

Marker log som løst

PATCH /api/admin/logs/:id/resolve
Body: { "resolvedBy": "admin", "notes": "Fixed the bug" }

Langsomme requests

GET /api/admin/logs/performance/slow-requests?minResponseTime=1000

Endpoint statistik

GET /api/admin/logs/performance/endpoint-stats

🎨 Eksempel Fejl Response

Development mode:

{
  "success": false,
  "error": {
    "code": "DB_002",
    "message": "Der opstod en fejl ved hentning af data. Kontakt support hvis problemet fortsætter.",
    "timestamp": "2024-11-14T12:34:56.789Z",
    "technicalMessage": "ER_BAD_FIELD_ERROR: Unknown column 'xyz'",
    "stack": "Error: ER_BAD_FIELD_ERROR..."
  }
}

Production mode:

{
  "success": false,
  "error": {
    "code": "DB_002",
    "message": "Der opstod en fejl ved hentning af data. Kontakt support hvis problemet fortsætter.",
    "timestamp": "2024-11-14T12:34:56.789Z"
  }
}

🧹 Automatisk Cleanup

Database event kører hver dag og sletter:

  • INFO/WARNING/DEBUG logs ældre end 90 dage
  • ERROR logs ældre end 180 dage
  • Request logs ældre end 30 dage

For at aktivere (kræves kun én gang):

SET GLOBAL event_scheduler = ON;

🚀 Best Practices

GØR:

  • Brug asyncHandler til alle async route handlers
  • Tag fejl specifikt (error.name = 'OrdrestyringError')
  • Log vigtige operationer med logger.logInfo()
  • Tilføj kontekst og metadata til logs
  • Brug kategori til at gruppere logs (API, DATABASE, BUSINESS, etc.)

UNDGÅ:

  • console.log() direkte (brug logger i stedet)
  • At sende stack traces til frontend i production
  • At logge følsomme data (passwords, tokens)
  • For mange INFO logs (kun vigtige operationer)

🔐 Sikkerhed

⚠️ VIGTIGT: Admin endpoints er IKKE beskyttede endnu!

I production skal du tilføje authentication:

const authMiddleware = require('./src/middleware/auth');
app.use('/api/admin/logs', authMiddleware.requireAdmin, require('./routes/adminLogs'));

📈 Monitoring

Tjek system health:

# Antal fejl i dag
SELECT COUNT(*) FROM system_logs WHERE level='ERROR' AND DATE(created_at) = CURDATE();

# Langsomme endpoints
SELECT url, AVG(response_time_ms) as avg_time 
FROM request_logs 
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY url 
HAVING avg_time > 1000 
ORDER BY avg_time DESC;

# Uløste fejl
SELECT error_code, COUNT(*) as count 
FROM system_logs 
WHERE level='ERROR' AND resolved=FALSE 
GROUP BY error_code 
ORDER BY count DESC;

🐛 Fejlsøgning

Log vises ikke i databasen?

  1. Tjek at tabellerne er oprettet: SHOW TABLES LIKE 'system_logs';
  2. Tjek database connection i logger.js
  3. Tjek console for "Failed to log to database" fejl

Får stadig gamle fejlbeskeder?

  1. Sørg for at du bruger asyncHandler i routes
  2. Tjek at errorHandler middleware er aktiveret
  3. Restart serveren

Performance problemer?

  1. Tjek antal logs: SELECT COUNT(*) FROM system_logs;
  2. Kør cleanup manuelt hvis nødvendigt
  3. Overvej at øge cleanup frekvens

📝 Opdatering af Eksisterende Routes

For at opdatere en eksisterende route til at bruge det nye logging system:

// FØR
router.get('/my-route', async (req, res) => {
  try {
    const data = await getData();
    res.json({ success: true, data });
  } catch (error) {
    console.error('Error:', error);
    res.status(500).json({ error: error.message });
  }
});

// EFTER
const logger = require('../src/utils/logger');
const { asyncHandler } = require('../src/middleware/errorHandler');

router.get('/my-route', asyncHandler(async (req, res) => {
  logger.logInfo('MyRoute.Get', 'Fetching data', {
    category: 'API',
    req
  });
  
  const data = await getData();
  
  logger.logInfo('MyRoute.Get', 'Data fetched successfully', {
    category: 'API',
    req,
    metadata: { count: data.length }
  });
  
  res.json({ success: true, data });
}));

Lavet af: GitHub Copilot
Dato: 14. november 2024