feat(logging): implement dynamic log directory resolution and add rotating file handler for improved logging management
This commit is contained in:
@@ -35,6 +35,7 @@ from aiohttp import WSCloseCode, WSMessage, WSMsgType, web
|
|||||||
from aiohttp_session import get_session
|
from aiohttp_session import get_session
|
||||||
from aiohttp_session import setup as setup_session
|
from aiohttp_session import setup as setup_session
|
||||||
from aiohttp_session.cookie_storage import EncryptedCookieStorage
|
from aiohttp_session.cookie_storage import EncryptedCookieStorage
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
from cryptography import x509
|
from cryptography import x509
|
||||||
from cryptography.hazmat.backends import default_backend
|
from cryptography.hazmat.backends import default_backend
|
||||||
from cryptography.hazmat.primitives import hashes, serialization
|
from cryptography.hazmat.primitives import hashes, serialization
|
||||||
@@ -91,11 +92,56 @@ from meshchatx.src.version import __version__ as app_version
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_log_dir():
|
||||||
|
"""Choose a writable log directory across container, desktop, and Windows."""
|
||||||
|
env_dir = os.environ.get("MESHCHAT_LOG_DIR")
|
||||||
|
candidates = []
|
||||||
|
if env_dir:
|
||||||
|
candidates.append(env_dir)
|
||||||
|
|
||||||
|
candidates.append("/config/logs")
|
||||||
|
|
||||||
|
if os.name == "nt":
|
||||||
|
appdata = os.environ.get("LOCALAPPDATA") or os.environ.get("APPDATA")
|
||||||
|
if appdata:
|
||||||
|
candidates.append(os.path.join(appdata, "MeshChatX", "logs"))
|
||||||
|
|
||||||
|
home_dir = os.path.expanduser("~")
|
||||||
|
candidates.append(os.path.join(home_dir, ".reticulum-meshchatx", "logs"))
|
||||||
|
candidates.append(os.path.join(tempfile.gettempdir(), "meshchatx", "logs"))
|
||||||
|
|
||||||
|
for path in candidates:
|
||||||
|
if not path:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
os.makedirs(path, exist_ok=True)
|
||||||
|
return path
|
||||||
|
except PermissionError:
|
||||||
|
continue
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Global log handler
|
# Global log handler
|
||||||
memory_log_handler = PersistentLogHandler()
|
memory_log_handler = PersistentLogHandler()
|
||||||
logging.basicConfig(
|
log_dir = resolve_log_dir()
|
||||||
level=logging.INFO, handlers=[memory_log_handler, logging.StreamHandler(sys.stdout)]
|
handlers = [memory_log_handler]
|
||||||
)
|
|
||||||
|
if log_dir:
|
||||||
|
file_handler = RotatingFileHandler(
|
||||||
|
os.path.join(log_dir, "meshchatx.log"),
|
||||||
|
maxBytes=5 * 1024 * 1024,
|
||||||
|
backupCount=3,
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
handlers.append(file_handler)
|
||||||
|
else:
|
||||||
|
handlers.append(logging.StreamHandler(sys.stdout))
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, handlers=handlers)
|
||||||
|
logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
|
||||||
logger = logging.getLogger("meshchatx")
|
logger = logging.getLogger("meshchatx")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user