Skip to content

Commit 2b712bc

Browse files
Merge pull request Project-Babble#74 from dfgHiatus/feat/persistent-logging
(feat) Add persistent logging
2 parents 4c35c7f + 92f9439 commit 2b712bc

File tree

2 files changed

+82
-3
lines changed

2 files changed

+82
-3
lines changed

BabbleApp/babbleapp.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from notification_manager import NotificationManager
3636
from utils.misc_utils import EnsurePath, is_nt, bg_color_highlight, bg_color_clear
3737
from lang_manager import LocaleStringManager as lang
38+
from logger import setup_logging
3839

3940
winmm = None
4041

@@ -74,6 +75,7 @@ def timerResolution(toggle):
7475
else:
7576
winmm.timeEndPeriod(1)
7677

78+
7779
async def check_for_updates(config, notification_manager):
7880
if config.settings.gui_update_check:
7981
try:
@@ -98,6 +100,7 @@ async def check_for_updates(config, notification_manager):
98100

99101
async def async_main():
100102
EnsurePath()
103+
setup_logging()
101104

102105
# Get Configuration
103106
config: BabbleConfig = BabbleConfig.load()
@@ -333,9 +336,6 @@ async def async_main():
333336
if setting.started():
334337
setting.render(window, event, values)
335338

336-
# Does adding this help?
337-
# await asyncio.sleep(0)
338-
339339
def main():
340340
asyncio.run(async_main())
341341

BabbleApp/logger.py

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import re
2+
import logging
3+
import os
4+
import sys
5+
import platform
6+
import psutil
7+
8+
def strip_ansi_codes(text):
9+
"""Remove ANSI color codes from a string."""
10+
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
11+
return ansi_escape.sub('', text)
12+
13+
def log_system_info(logger):
14+
"""
15+
Logs basic system and hardware information to the provided logger.
16+
"""
17+
try:
18+
# Operating system details
19+
os_name = platform.system()
20+
os_version = platform.version()
21+
os_release = platform.release()
22+
machine = platform.machine()
23+
processor = platform.processor()
24+
25+
# CPU and Memory
26+
cpu_count = psutil.cpu_count(logical=True)
27+
total_memory = psutil.virtual_memory().total // (1024 ** 2) # Convert bytes to MB
28+
29+
logger.info("========== System Information ==========")
30+
logger.info(f"Operating System: {os_name} {os_release} (Version: {os_version})")
31+
logger.info(f"Architecture: {machine}")
32+
logger.info(f"Processor: {processor}")
33+
logger.info(f"Logical CPUs: {cpu_count}")
34+
logger.info(f"Total Memory: {total_memory} MB")
35+
logger.info(f"Python Version: {platform.python_version()}")
36+
logger.info("========================================")
37+
except Exception as e:
38+
logger.error(f"Failed to log system information: {e}")
39+
40+
41+
def setup_logging():
42+
# Determine the user's Documents directory
43+
#documents_dir = os.path.join(os.path.expanduser("~"), "Documents")
44+
documents_dir = "./Logs"
45+
log_dir = os.path.join(documents_dir, "ProjectBabble")
46+
os.makedirs(log_dir, exist_ok=True)
47+
log_file = os.path.join(log_dir, "latest.log")
48+
49+
# Set up logging
50+
logger = logging.getLogger("debug_logger")
51+
logger.setLevel(logging.DEBUG)
52+
53+
file_handler = logging.FileHandler(log_file, mode='w', encoding='utf-8')
54+
file_handler.setLevel(logging.DEBUG)
55+
formatter = logging.Formatter('%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
56+
file_handler.setFormatter(formatter)
57+
58+
logger.addHandler(file_handler)
59+
60+
# Redirect stdout and stderr
61+
class StreamToLogger:
62+
def __init__(self, stream, log_level):
63+
self.stream = stream
64+
self.log_level = log_level
65+
66+
def write(self, message):
67+
message = strip_ansi_codes(message)
68+
if message.strip():
69+
logger.log(self.log_level, message.strip())
70+
self.stream.write(message)
71+
self.stream.flush()
72+
73+
def flush(self):
74+
self.stream.flush()
75+
76+
sys.stdout = StreamToLogger(sys.stdout, logging.INFO)
77+
sys.stderr = StreamToLogger(sys.stderr, logging.ERROR)
78+
79+
log_system_info(logger)

0 commit comments

Comments
 (0)