log-analyzer
Expert guide for analyzing application logs including log searching, pattern detection, error tracking, and debugging. Use when investigating issues, tracking errors, or understanding application behavior.
What this skill does
# Log Analyzer Skill
## Overview
This skill helps you effectively analyze application logs to diagnose issues, track errors, and understand system behavior. Covers log searching, pattern detection, structured logging, and integration with monitoring tools.
## Log Analysis Philosophy
### Principles
1. **Structure over text**: Structured logs are easier to analyze
2. **Context matters**: Include relevant metadata
3. **Levels have meaning**: Use appropriate severity levels
4. **Correlation is key**: Link related events across services
### Log Levels
| Level | When to Use | Example |
|-------|-------------|---------|
| ERROR | Something failed, needs attention | Database connection failed |
| WARN | Unexpected but handled | Retry succeeded after failure |
| INFO | Normal operation milestones | User signed up |
| DEBUG | Detailed diagnostic info | Query executed in 50ms |
| TRACE | Very detailed, usually disabled | Function entered/exited |
## Structured Logging
### Winston Configuration (Node.js)
```typescript
// src/lib/logger.ts
import winston from 'winston';
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
defaultMeta: {
service: 'my-app',
environment: process.env.NODE_ENV,
},
transports: [
// Console for development
new winston.transports.Console({
format: process.env.NODE_ENV === 'development'
? winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
: winston.format.json(),
}),
],
});
// Add request context
export function createRequestLogger(requestId: string, userId?: string) {
return logger.child({
requestId,
userId,
});
}
export { logger };
```
### Pino Logger (High Performance)
```typescript
// src/lib/logger.ts
import pino from 'pino';
export const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: process.env.NODE_ENV === 'development'
? {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard',
},
}
: undefined,
base: {
service: 'my-app',
env: process.env.NODE_ENV,
},
redact: {
paths: ['password', 'token', 'apiKey', '*.password', '*.token'],
censor: '[REDACTED]',
},
});
// Request-scoped logger
export function requestLogger(requestId: string, userId?: string) {
return logger.child({ requestId, userId });
}
```
### Logging Best Practices
```typescript
// DO: Include context
logger.info('User signed up', {
userId: user.id,
email: user.email,
plan: 'free',
source: 'web',
});
// DO: Log errors with stack traces
logger.error('Payment failed', {
error: err.message,
stack: err.stack,
userId: user.id,
amount: 99.99,
provider: 'stripe',
});
// DO: Use appropriate levels
logger.debug('Database query', {
query: 'SELECT * FROM users WHERE id = ?',
duration: 45,
rows: 1,
});
// DON'T: Log sensitive data
// BAD: logger.info('Login', { password: user.password })
// DON'T: Use string concatenation
// BAD: logger.info('User ' + user.id + ' signed up')
```
## Log Searching & Filtering
### Command Line (grep, jq)
```bash
# Search JSON logs with jq
cat logs.json | jq 'select(.level == "error")'
# Search for specific user
cat logs.json | jq 'select(.userId == "usr_123")'
# Search by time range
cat logs.json | jq 'select(.timestamp >= "2024-01-15T10:00:00")'
# Count errors by type
cat logs.json | jq 'select(.level == "error") | .error.code' | sort | uniq -c
# Extract specific fields
cat logs.json | jq '{timestamp, level, message, userId}'
# Search text logs
grep -i "error" logs.txt
grep -E "error|warn" logs.txt
grep -A5 "ERROR" logs.txt # 5 lines after match
grep -B3 "ERROR" logs.txt # 3 lines before match
```
### Vercel Log Analysis
```bash
# View live logs
vercel logs --follow
# Filter by level
vercel logs --level error
# Search specific timeframe
vercel logs --since 2h
# Filter by deployment
vercel logs --deployment-url https://myapp-abc123.vercel.app
# Output JSON for processing
vercel logs --output json | jq 'select(.level == "error")'
```
### Supabase Log Analysis
```sql
-- Query Postgres logs
SELECT *
FROM postgres_logs
WHERE timestamp > now() - interval '1 hour'
AND error_severity = 'ERROR'
ORDER BY timestamp DESC
LIMIT 100;
-- Query auth logs
SELECT *
FROM auth.audit_log_entries
WHERE timestamp > now() - interval '24 hours'
AND payload->>'action' = 'login'
ORDER BY timestamp DESC;
-- Find slow queries
SELECT
query,
calls,
mean_exec_time,
total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 20;
```
## Pattern Detection
### Common Error Patterns
```typescript
// Error pattern analyzer
interface ErrorPattern {
pattern: RegExp;
category: string;
severity: 'critical' | 'high' | 'medium' | 'low';
suggestion: string;
}
const errorPatterns: ErrorPattern[] = [
{
pattern: /ECONNREFUSED|connection refused/i,
category: 'connectivity',
severity: 'critical',
suggestion: 'Check if the target service is running and accessible',
},
{
pattern: /timeout|ETIMEDOUT/i,
category: 'timeout',
severity: 'high',
suggestion: 'Increase timeout or check for slow operations',
},
{
pattern: /out of memory|heap|OOM/i,
category: 'memory',
severity: 'critical',
suggestion: 'Increase memory allocation or fix memory leak',
},
{
pattern: /rate.?limit|429|too many requests/i,
category: 'rate-limiting',
severity: 'medium',
suggestion: 'Implement backoff strategy or increase rate limits',
},
{
pattern: /unauthorized|401|invalid.?token/i,
category: 'auth',
severity: 'medium',
suggestion: 'Check authentication credentials or token expiry',
},
{
pattern: /not.?found|404/i,
category: 'not-found',
severity: 'low',
suggestion: 'Verify resource exists or check URL',
},
];
function categorizeError(message: string): ErrorPattern | null {
for (const pattern of errorPatterns) {
if (pattern.pattern.test(message)) {
return pattern;
}
}
return null;
}
```
### Log Aggregation Script
```typescript
// scripts/analyze-logs.ts
import * as readline from 'readline';
import * as fs from 'fs';
interface LogEntry {
timestamp: string;
level: string;
message: string;
error?: {
message: string;
code?: string;
};
[key: string]: any;
}
interface LogSummary {
totalEntries: number;
byLevel: Record<string, number>;
errorMessages: Record<string, number>;
timeRange: {
start: string;
end: string;
};
}
async function analyzeLogs(filePath: string): Promise<LogSummary> {
const summary: LogSummary = {
totalEntries: 0,
byLevel: {},
errorMessages: {},
timeRange: { start: '', end: '' },
};
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});
for await (const line of rl) {
try {
const entry: LogEntry = JSON.parse(line);
summary.totalEntries++;
// Count by level
summary.byLevel[entry.level] = (summary.byLevel[entry.level] || 0) + 1;
// Track error messages
if (entry.level === 'error' && entry.error?.message) {
const msg = entry.error.message.substring(0, 100);
summary.errorMessages[msg] = (summary.errorMessages[msg] || 0) + 1;
}
// Track time range
if (!summary.timeRange.start || entry.timestamp < summary.timeRange.start) {
summary.timeRange.start = entry.timestamp;
}
if (!summary.timeRange.end || entry.timestamp > summary.timeRange.end) {
summary.timeRange.end = entry.timestamp;
}
} catch {
// Skip non-JSON lines
}
}
return summary;
}
// Usage
analyzeLogs('logs.json').then(console.log);
```Related in Data & Analytics
clawarr-suite
IncludedComprehensive management for self-hosted media stacks (Sonarr, Radarr, Lidarr, Readarr, Prowlarr, Bazarr, Overseerr, Plex, Tautulli, SABnzbd, Recyclarr, Unpackerr, Notifiarr, Maintainerr, Kometa, FlareSolverr). Deep library exploration, analytics, dashboard generation, content management, request handling, subtitle management, indexer control, download monitoring, quality profile sync, library cleanup automation, notification routing, collection/overlay management, and media tracker integration (Trakt, Letterboxd, Simkl).
querying-soql
IncludedSOQL query generation, optimization, and analysis with 100-point scoring. Use this skill when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan analysis, and performance or safety improvements for Salesforce queries. TRIGGER when: user writes, optimizes, or debugs SOQL/SOSL queries, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER when: bulk data operations (use handling-sf-data), Apex DML logic (use generating-apex), or report/dashboard queries.
app-store-optimization
IncludedApp Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklists, and tracking ranking changes.
habit-flow
IncludedAI-powered atomic habit tracker with natural language logging, streak tracking, smart reminders, and coaching. Use for creating habits, logging completions naturally ("I meditated today"), viewing progress, and getting personalized coaching.
app-store-optimization
IncludedApp Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklists, and tracking ranking changes.
visualizing-data
IncludedBuilds dashboards, reports, and data-driven interfaces requiring charts, graphs, or visual analytics. Provides systematic framework for selecting appropriate visualizations based on data characteristics and analytical purpose. Includes 24+ visualization types organized by purpose (trends, comparisons, distributions, relationships, flows, hierarchies, geospatial), accessibility patterns (WCAG 2.1 AA compliance), colorblind-safe palettes, and performance optimization strategies. Use when creating visualizations, choosing chart types, displaying data graphically, or designing data interfaces.