mirror of
https://github.com/Horizontal42/netsleuth.git
synced 2026-11-11 01:02:10 +03:00
feat: add structured logging with JSON formatter support
This commit is contained in:
parent
df4336a912
commit
1df97a139e
1 changed files with 85 additions and 0 deletions
|
|
@ -1 +1,86 @@
|
||||||
|
"""Netsleuth - Cross-platform CLI for deep network diagnostics.
|
||||||
|
|
||||||
|
Provides ISP/VPN/ASN identity, latency, path and bandwidth analysis
|
||||||
|
with comprehensive reporting in multiple formats.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
__version__ = "0.1.0"
|
__version__ = "0.1.0"
|
||||||
|
|
||||||
|
# Configure structured logging with JSON formatter when available
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def setup_logging(
|
||||||
|
level: int = logging.INFO,
|
||||||
|
log_file: Path | None = None,
|
||||||
|
json_format: bool = False,
|
||||||
|
) -> None:
|
||||||
|
"""Configure structured logging for netsleuth.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
level: Logging level (default: INFO)
|
||||||
|
log_file: Optional file path for log output
|
||||||
|
json_format: If True, use JSON formatting for structured logs
|
||||||
|
"""
|
||||||
|
handlers: list[logging.Handler] = []
|
||||||
|
|
||||||
|
# Console handler with rich formatting
|
||||||
|
console_handler = logging.StreamHandler(sys.stdout)
|
||||||
|
console_handler.setLevel(level)
|
||||||
|
|
||||||
|
if json_format:
|
||||||
|
try:
|
||||||
|
from pythonjsonlogger import jsonlogger
|
||||||
|
|
||||||
|
json_formatter = jsonlogger.JsonFormatter(
|
||||||
|
fmt="%(asctime)s %(name)s %(levelname)s %(message)s %(filename)s %(lineno)d",
|
||||||
|
datefmt="%Y-%m-%dT%H:%M:%S%z",
|
||||||
|
)
|
||||||
|
console_handler.setFormatter(json_formatter)
|
||||||
|
except ImportError:
|
||||||
|
# Fallback to basic format if python-json-logger not installed
|
||||||
|
formatter = logging.Formatter(
|
||||||
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
)
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
else:
|
||||||
|
formatter = logging.Formatter(
|
||||||
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
)
|
||||||
|
console_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
handlers.append(console_handler)
|
||||||
|
|
||||||
|
# File handler if requested
|
||||||
|
if log_file:
|
||||||
|
log_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
file_handler = logging.FileHandler(log_file, encoding="utf-8")
|
||||||
|
file_handler.setLevel(level)
|
||||||
|
if json_format:
|
||||||
|
try:
|
||||||
|
from pythonjsonlogger import jsonlogger
|
||||||
|
|
||||||
|
json_formatter = jsonlogger.JsonFormatter(
|
||||||
|
fmt="%(asctime)s %(name)s %(levelname)s %(message)s %(filename)s %(lineno)d",
|
||||||
|
datefmt="%Y-%m-%dT%H:%M:%S%z",
|
||||||
|
)
|
||||||
|
file_handler.setFormatter(json_formatter)
|
||||||
|
except ImportError:
|
||||||
|
formatter = logging.Formatter(
|
||||||
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
)
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
else:
|
||||||
|
formatter = logging.Formatter(
|
||||||
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
)
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
|
handlers.append(file_handler)
|
||||||
|
|
||||||
|
logging.basicConfig(level=level, handlers=handlers, force=True)
|
||||||
|
logger.debug("Logging configured: level=%s, file=%s, json=%s", level, log_file, json_format)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue