- Create modular architecture with separate packages for config, database, HTTP, logging, and state management - Implement Cobra CLI with daemon command - Set up Uber FX dependency injection - Add Chi router with health check and IP lookup endpoints - Implement GeoIP database downloader with automatic updates - Add state persistence for tracking database download times - Include comprehensive test coverage for all components - Configure structured logging with slog - Add Makefile with test, lint, and build targets - Support both IPv4 and IPv6 lookups - Return country, city, ASN, and location data in JSON format
50 lines
919 B
Go
50 lines
919 B
Go
// Package log provides structured logging functionality.
|
|
package log
|
|
|
|
import (
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
|
|
"git.eeqj.de/sneak/ipapi/internal/config"
|
|
)
|
|
|
|
// New creates a new logger instance based on configuration.
|
|
func New(cfg *config.Config) *slog.Logger {
|
|
var level slog.Level
|
|
switch strings.ToLower(cfg.LogLevel) {
|
|
case "debug":
|
|
level = slog.LevelDebug
|
|
case "info":
|
|
level = slog.LevelInfo
|
|
case "warn", "warning":
|
|
level = slog.LevelWarn
|
|
case "error":
|
|
level = slog.LevelError
|
|
default:
|
|
level = slog.LevelInfo
|
|
}
|
|
|
|
opts := &slog.HandlerOptions{
|
|
Level: level,
|
|
}
|
|
|
|
var handler slog.Handler
|
|
if isTerminal() {
|
|
handler = slog.NewTextHandler(os.Stdout, opts)
|
|
} else {
|
|
handler = slog.NewJSONHandler(os.Stdout, opts)
|
|
}
|
|
|
|
return slog.New(handler)
|
|
}
|
|
|
|
func isTerminal() bool {
|
|
fileInfo, err := os.Stdout.Stat()
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
return (fileInfo.Mode() & os.ModeCharDevice) != 0
|
|
}
|