Skip to content

Commit e2650e9

Browse files
author
Tom Softreck
committed
update
1 parent 2289223 commit e2650e9

File tree

12 files changed

+409
-20
lines changed

12 files changed

+409
-20
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
.env.1
2+
info
3+
logs
4+
yolov8n.pt
25
.idea
36
.old
47
.todo.txt

scripts/init_logging.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Initialize logging and display recent logs.
4+
"""
5+
import os
6+
import sys
7+
from pathlib import Path
8+
from dialogchain.utils.logger import setup_logger, display_recent_logs
9+
10+
# Set up logger for this script
11+
logger = setup_logger(__name__)
12+
13+
def main():
14+
"""Initialize logging and display recent logs."""
15+
try:
16+
# Log a test message
17+
logger.info("Logging system initialized")
18+
19+
# Display recent logs
20+
print("\n" + "="*50)
21+
print("DIALOGCHAIN LOGGING SYSTEM")
22+
print("="*50)
23+
24+
display_recent_logs(limit=10)
25+
26+
print("\nLogs are being saved to: logs.db")
27+
print("Use `python -m dialogchain.utils.logger` to view logs\n")
28+
29+
except Exception as e:
30+
logger.error(f"Failed to initialize logging: {e}", exc_info=True)
31+
return 1
32+
33+
return 0
34+
35+
if __name__ == "__main__":
36+
sys.exit(main())

scripts/test_logging.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Test the logging system.
4+
"""
5+
import os
6+
import sys
7+
import time
8+
from pathlib import Path
9+
10+
# Add the src directory to the path
11+
sys.path.insert(0, str(Path(__file__).parent.parent / 'src'))
12+
13+
from dialogchain.utils.logger import setup_logger, display_recent_logs
14+
15+
def main():
16+
"""Test the logging system."""
17+
# Set up logger
18+
logger = setup_logger(__name__)
19+
20+
# Test different log levels
21+
logger.debug("This is a debug message")
22+
logger.info("This is an info message")
23+
logger.warning("This is a warning message")
24+
logger.error("This is an error message")
25+
logger.critical("This is a critical message")
26+
27+
# Test with extra context
28+
try:
29+
result = 1 / 0
30+
except Exception as e:
31+
logger.error("Division by zero error", exc_info=True, extra={"context": {"operation": "division"}})
32+
33+
# Display recent logs
34+
print("\n=== Recent Logs ===")
35+
display_recent_logs(limit=10)
36+
37+
print("\n✅ Logging test completed. Check logs.db for stored logs.")
38+
39+
if __name__ == "__main__":
40+
main()

src/dialogchain/connectors.py

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
from email.mime.text import MIMEText
1212
from email.mime.multipart import MIMEMultipart
1313
from datetime import datetime
14+
from dialogchain.utils.logger import setup_logger
15+
logger = setup_logger(__name__)
16+
1417

1518

1619
class Source(ABC):
@@ -58,7 +61,7 @@ async def receive(self) -> AsyncIterator[Dict[str, Any]]:
5861
while True:
5962
ret, frame = cap.read()
6063
if not ret:
61-
print("📹 Lost connection to camera")
64+
logger.info("📹 Lost connection to camera")
6265
break
6366

6467
# Skip frames for performance
@@ -194,34 +197,73 @@ def __init__(self, uri: str):
194197
self.recipients = self.recipients[0].split(",")
195198

196199
async def send(self, message: Any) -> None:
197-
"""Send email"""
200+
"""Send email with enhanced logging"""
198201
try:
202+
print(f"🔧 Preparing email with server: {self.server}:{self.port}")
203+
print(f"🔧 Authenticating as user: {self.user}")
204+
199205
msg = MIMEMultipart()
200206
msg["From"] = self.user
201-
msg["Subject"] = "Camel Router Alert"
207+
208+
# Extract subject from message if it's a dict and has a subject field
209+
if isinstance(message, dict) and 'subject' in message:
210+
msg["Subject"] = message.get('subject', 'Camel Router Alert')
211+
print(f"📨 Using subject from message: {msg['Subject']}")
212+
else:
213+
msg["Subject"] = "Camel Router Alert"
214+
logger.info("ℹ️ Using default subject")
202215

203-
# Format message
216+
# Format message body
204217
if isinstance(message, dict):
205218
body = json.dumps(message, indent=2)
219+
print(f"ℹ️ Message is a dictionary, converting to JSON")
206220
else:
207221
body = str(message)
222+
print(f"ℹ️ Message is a string, length: {len(body)} characters")
208223

209224
msg.attach(MIMEText(body, "plain"))
225+
print(f"✉️ Message prepared, connecting to SMTP server...")
210226

211-
server = smtplib.SMTP(self.server, self.port)
227+
# SMTP connection and sending
228+
server = smtplib.SMTP(self.server, self.port, timeout=10)
229+
print(f"🔌 Connected to SMTP server: {self.server}:{self.port}")
230+
212231
server.starttls()
232+
logger.info("🔒 Started TLS encryption")
233+
234+
print(f"🔑 Authenticating user: {self.user}")
213235
server.login(self.user, self.password)
236+
logger.info("✅ Authentication successful")
214237

238+
success_count = 0
215239
for recipient in self.recipients:
216-
msg["To"] = recipient.strip()
217-
server.send_message(msg)
218-
del msg["To"]
240+
clean_recipient = recipient.strip()
241+
if not clean_recipient:
242+
logger.info("⚠️ Empty recipient, skipping")
243+
continue
244+
245+
try:
246+
msg["To"] = clean_recipient
247+
print(f"📤 Sending to: {clean_recipient}")
248+
server.send_message(msg)
249+
del msg["To"]
250+
success_count += 1
251+
print(f"✅ Successfully sent to: {clean_recipient}")
252+
except Exception as send_error:
253+
print(f"❌ Failed to send to {clean_recipient}: {send_error}")
219254

220255
server.quit()
221-
print(f"📧 Email sent to {len(self.recipients)} recipients")
256+
print(f"📬 Email sending complete. Successfully sent to {success_count}/{len(self.recipients)} recipients")
222257

258+
except smtplib.SMTPException as smtp_error:
259+
print(f"❌ SMTP Error: {smtp_error}")
260+
print(f" SMTP Code: {getattr(smtp_error, 'smtp_code', 'N/A')}")
261+
print(f" SMTP Error: {getattr(smtp_error, 'smtp_error', 'N/A')}")
223262
except Exception as e:
224-
print(f"❌ Email error: {e}")
263+
import traceback
264+
print(f"❌ Unexpected error: {e}")
265+
logger.info("📝 Stack trace:")
266+
traceback.print_exc()
225267

226268

227269
class HTTPDestination(Destination):
@@ -297,7 +339,7 @@ def __init__(self, uri: str):
297339
async def send(self, message: Any) -> None:
298340
"""Log message to console and optionally to a file"""
299341
log_msg = f"📝 {datetime.now().isoformat()}: {message}"
300-
print(log_msg)
342+
logger.info(log_msg)
301343

302344
if self.log_file:
303345
try:

src/dialogchain/engine.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import yaml
1010
from .processors import *
1111
from .connectors import *
12+
from dialogchain.utils.logger import setup_logger
13+
logger = setup_logger(__name__)
14+
1215

1316

1417
def parse_uri(uri: str) -> Tuple[str, str]:
@@ -216,17 +219,19 @@ def dry_run(self, route_name: Optional[str] = None):
216219
routes_to_check = self.routes
217220
if route_name:
218221
routes_to_check = [r for r in self.routes if r.get("name") == route_name]
222+
else:
223+
routes_to_check = self.routes
219224

220-
print("🔍 DRY RUN - Configuration Analysis:")
221-
print("=" * 50)
225+
logger.info("🔍 DRY RUN - Configuration Analysis:")
226+
logger.info("=" * 50)
222227

223228
for route in routes_to_check:
224229
name = route.get("name", "unnamed")
225230
print(f"\n📍 Route: {name}")
226231
print(f" From: {self.resolve_variables(route['from'])}")
227232

228233
if "processors" in route:
229-
print(" Processors:")
234+
logger.info(" Processors:")
230235
for i, proc in enumerate(route["processors"], 1):
231236
print(f" {i}. {proc['type']}")
232237
if proc["type"] == "external":
@@ -236,7 +241,7 @@ def dry_run(self, route_name: Optional[str] = None):
236241
if isinstance(to_config, str):
237242
to_config = [to_config]
238243

239-
print(" To:")
244+
logger.info(" To:")
240245
for dest in to_config:
241246
resolved = self.resolve_variables(dest)
242247
print(f" • {resolved}")

src/dialogchain/processors.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
from abc import ABC, abstractmethod
77
from typing import Any, Dict, Optional, Union
88
from jinja2 import Template
9+
from dialogchain.utils.logger import setup_logger
10+
logger = setup_logger(__name__)
11+
912

1013

1114
def create_processor(config: Dict[str, Any]) -> 'Processor':

src/dialogchain/utils/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""
2+
Utility functions and classes for DialogChain.
3+
"""
4+
5+
from .logger import (
6+
setup_logger,
7+
get_logs,
8+
display_recent_logs,
9+
DatabaseLogHandler
10+
)
11+
12+
__all__ = [
13+
'setup_logger',
14+
'get_logs',
15+
'display_recent_logs',
16+
'DatabaseLogHandler'
17+
]

src/dialogchain/utils/detect_objects.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import numpy as np
1313
import cv2
1414
from pathlib import Path
15+
from dialogchain.utils.logger import setup_logger
16+
logger = setup_logger(__name__)
17+
1518

1619
# Optional: ultralytics for YOLO
1720
try:
@@ -20,7 +23,7 @@
2023
HAS_YOLO = True
2124
except ImportError:
2225
HAS_YOLO = False
23-
print("Warning: ultralytics not installed, using dummy detection")
26+
logger.info("Warning: ultralytics not installed, using dummy detection")
2427

2528

2629
def load_config():
@@ -150,11 +153,11 @@ def main():
150153
with open(args.output, "w") as f:
151154
json.dump(output, f, indent=2)
152155
else:
153-
print(json.dumps(output, indent=2))
156+
logger.info(json.dumps(output, indent=2))
154157

155158
except Exception as e:
156159
error_output = {"error": str(e), "success": False}
157-
print(json.dumps(error_output, indent=2), file=sys.stderr)
160+
logger.info(json.dumps(error_output, indent=2), file=sys.stderr)
158161
sys.exit(1)
159162

160163

src/dialogchain/utils/extract_markdown.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import re
77
from pathlib import Path
88
from typing import Dict, List, Optional, Tuple, Any
9+
from dialogchain.utils.logger import setup_logger
10+
logger = setup_logger(__name__)
11+
912

1013

1114
class MarkdownExtractor:
@@ -90,7 +93,7 @@ def run(self):
9093
for md_file in md_files:
9194
self.process_markdown_file(md_file)
9295

93-
print("\nExtraction complete!")
96+
logger.info("\nExtraction complete!")
9497
return 0
9598

9699

0 commit comments

Comments
 (0)