Skip to content

Commit

Permalink
temporarily using a log terminal, moving to a viewer shortly
Browse files Browse the repository at this point in the history
  • Loading branch information
norton120 committed Nov 25, 2024
1 parent 1cd8d5e commit 1c7884b
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 61 deletions.
44 changes: 0 additions & 44 deletions installable_apps/cutelog_overload.py

This file was deleted.

6 changes: 6 additions & 0 deletions installable_apps/installable_logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from logging import getLogger

def get_logger(name: str):
logger = getLogger("installable_apps")
logger.setLevel("DEBUG")
return logger.getChild(name)
60 changes: 54 additions & 6 deletions installable_apps/logviewer.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,65 @@
from pathlib import Path
import psutil
import logging
from logging.handlers import SocketHandler
import subprocess

from letta.settings import settings
from letta.server.server import logger as server_logger

class CuteLogger:
from installable_logger import get_logger

def apply_cuteness(self):
installable_logger = get_logger(__name__)


class LogViewer:
log_dir: "Path"

def __init__(self):
self.log_dir = settings.letta_dir / "logs"
self.log_dir.mkdir(parents=True, exist_ok=True)
self.add_file_handler()

def add_file_handler(self):
"""adds the rotating file handler to all monitored loggers"""
# create a rotating file handler with 1mb size and no backup count
file_handler = logging.handlers.RotatingFileHandler(
maxBytes=10000, backupCount=2, filename=self.log_dir / "letta.log"
)
root_logger = logging.getLogger()
uvicorn_loggers = [
logging.getLogger(name)
for name in logging.root.manager.loggerDict.keys()
if name.startswith("uvicorn.")
]
socket_handler = SocketHandler("localhost", 19996)
for logger in (root_logger, server_logger,*uvicorn_loggers):
logger.addHandler(socket_handler)
for logger in (installable_logger, root_logger, server_logger, *uvicorn_loggers):
logger.addHandler(file_handler)


def start_log_terminal(self) -> None:
"""Start the log terminal"""
# MacOS only TODO win/linux
log_terminal_path = Path(__file__).parent / "macOS" / "log_terminal.command"
self.log_terminal = subprocess.Popen(
["open", str(log_terminal_path.absolute())], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
return self.log_terminal

def stop_log_terminal(self) -> None:
"""Stop the log terminal"""
installable_logger.info("Stopping log terminal...")
for process in psutil.process_iter():
try:
last_command = process.cmdline()
installable_logger.info("Checking process %s", last_command)
except (psutil.AccessDenied, psutil.NoSuchProcess,) as e:
installable_logger.info("Error checking process %s: %s", process, e)
continue
if "log_terminal.command" in last_command:
installable_logger.info("Killing log terminal process %s", process.pid)
try:
process.kill()
installable_logger.info("Log terminal process killed")
except Exception as e:
installable_logger.error("Error killing log terminal process: %s", e)
raise e
return
1 change: 1 addition & 0 deletions installable_apps/macOS/log_terminal.command
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
tail -f ~/.letta/logs/letta.log
4 changes: 1 addition & 3 deletions installable_apps/startup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from server import ThreadedServer
from tray import Tray
from logviewer import CuteLogger

pgdata = settings.letta_dir / "pgdata"
pgdata.mkdir(parents=True, exist_ok=True)
Expand All @@ -21,8 +20,7 @@
app_server = ThreadedServer.get_configured_server()

with app_server.run_in_thread():
cute = CuteLogger()
cute.apply_cuteness()
tray = Tray()
tray.log_viewer.start_log_terminal()
webbrowser.open("https://app.letta.com")
tray.create()
13 changes: 5 additions & 8 deletions installable_apps/tray.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,31 @@
from typing import TYPE_CHECKING
import darkdetect
from pathlib import Path
import webbrowser
from pystray import Icon, Menu, MenuItem
from PIL import Image

from cutelog_overload import CutelogOverload
from installable_image import InstallableImage
from logviewer import LogViewer

if TYPE_CHECKING:
from pathlib import Path

class Tray:
icon_image: "Path"

def __init__(self):
self.icon_image = InstallableImage.get_icon_path()
self.log_viewer = LogViewer()

def create(self) -> None:
"""creates tray icon in a thread"""
log_viewer = CutelogOverload()

def discord(icon, item):
webbrowser.open("https://discord.gg/letta")

def _on_quit(icon, *args):
log_viewer.stop_log_viewer()
self.log_viewer.stop_log_terminal()
icon.stop()

def _start_log_viewer(icon, item):
log_viewer.start_log_viewer()
self.log_viewer.start_log_terminal()

icon = Icon("Letta",
Image.open(self.icon_image),
Expand Down

0 comments on commit 1c7884b

Please sign in to comment.