chore: refactor logging setup · basicmachines-co/basic-memory@f4b703e · GitHub
Skip to content

Commit f4b703e

Browse files
author
phernandez
committed
chore: refactor logging setup
1 parent 6b8cefc commit f4b703e

11 files changed

Lines changed: 40 additions & 33 deletions

File tree

src/basic_memory/api/app.py

Lines changed: 0 additions & 4 deletions

src/basic_memory/cli/app.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
from basic_memory import db
66
from basic_memory.config import config
7-
from basic_memory.utils import setup_logging
87

9-
setup_logging(log_file=".basic-memory/basic-memory-cli.log", console=False) # pragma: no cover
108

119
asyncio.run(db.run_migrations(config))
1210

src/basic_memory/cli/commands/mcp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ def mcp(): # pragma: no cover
1717
home_dir = config.home
1818
logger.info(f"Starting Basic Memory MCP server {basic_memory.__version__}")
1919
logger.info(f"Home directory: {home_dir}")
20-
mcp_server.run()
20+
mcp_server.run()

src/basic_memory/cli/commands/sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,4 +203,4 @@ def sync(
203203
logger.exception("Sync failed")
204204
typer.echo(f"Error during sync: {e}", err=True)
205205
raise typer.Exit(1)
206-
raise
206+
raise

src/basic_memory/cli/commands/tools.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def build_context(
7272
max_related=max_related,
7373
)
7474
)
75-
rprint(context.model_dump())
75+
rprint(context.model_dump_json(indent=2))
7676
except Exception as e: # pragma: no cover
7777
if not isinstance(e, typer.Exit):
7878
typer.echo(f"Error during build_context: {e}", err=True)
@@ -105,7 +105,7 @@ def recent_activity(
105105
max_related=max_related,
106106
)
107107
)
108-
rprint(context.model_dump())
108+
rprint(context.model_dump_json(indent=2))
109109
except Exception as e: # pragma: no cover
110110
if not isinstance(e, typer.Exit):
111111
typer.echo(f"Error during build_context: {e}", err=True)
@@ -137,7 +137,7 @@ def search(
137137
after_date=after_date,
138138
)
139139
results = asyncio.run(mcp_search(query=search_query, page=page, page_size=page_size))
140-
rprint(results.model_dump())
140+
rprint(results.model_dump_json(indent=2))
141141
except Exception as e: # pragma: no cover
142142
if not isinstance(e, typer.Exit):
143143
typer.echo(f"Error during search: {e}", err=True)
@@ -149,7 +149,7 @@ def search(
149149
def get_entity(identifier: str):
150150
try:
151151
entity = asyncio.run(mcp_get_entity(identifier=identifier))
152-
rprint(entity.model_dump())
152+
rprint(entity.model_dump_json(indent=2))
153153
except Exception as e: # pragma: no cover
154154
if not isinstance(e, typer.Exit):
155155
typer.echo(f"Error during get_entity: {e}", err=True)

src/basic_memory/cli/main.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@
1515
tools,
1616
)
1717

18-
1918
if __name__ == "__main__": # pragma: no cover
2019
app()

src/basic_memory/config.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
from pathlib import Path
44
from typing import Literal
55

6+
from loguru import logger
67
from pydantic import Field, field_validator
78
from pydantic_settings import BaseSettings, SettingsConfigDict
89

10+
import basic_memory
11+
from basic_memory.utils import setup_logging
12+
913
DATABASE_NAME = "memory.db"
1014
DATA_DIR_NAME = ".basic-memory"
1115

@@ -60,3 +64,13 @@ def ensure_path_exists(cls, v: Path) -> Path: # pragma: no cover
6064

6165
# Load project config
6266
config = ProjectConfig()
67+
68+
# setup logging
69+
setup_logging(
70+
env=config.env,
71+
home_dir=config.home,
72+
log_level=config.log_level,
73+
log_file=".basic-memory/basic-memory.log",
74+
console=False,
75+
)
76+
logger.info(f"Starting Basic Memory {basic_memory.__version__}")

src/basic_memory/mcp/server.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
"""Enhanced FastMCP server instance for Basic Memory."""
22

33
from mcp.server.fastmcp import FastMCP
4-
5-
from basic_memory.utils import setup_logging
4+
from mcp.server.fastmcp.utilities.logging import configure_logging
65

76
# mcp console logging
8-
# configure_logging(level='INFO')
9-
7+
configure_logging(level="INFO")
108

11-
# start our out file logging
12-
setup_logging(log_file=".basic-memory/basic-memory.log")
139

1410
# Create the shared server instance
1511
mcp = FastMCP("Basic Memory")

src/basic_memory/utils.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""Utility functions for basic-memory."""
2-
2+
import logging
33
import os
44
import re
55
import sys
@@ -10,7 +10,6 @@
1010
from unidecode import unidecode
1111

1212
import basic_memory
13-
from basic_memory.config import config
1413

1514
import logfire
1615

@@ -65,8 +64,8 @@ def generate_permalink(file_path: Union[Path, str]) -> str:
6564

6665

6766
def setup_logging(
68-
home_dir: Path = config.home, log_file: Optional[str] = None, console: bool = True
69-
) -> None: # pragma: no cover
67+
env: str, home_dir: Path, log_file: Optional[str] = None, log_level: str = "INFO", console: bool = True
68+
, ) -> None: # pragma: no cover
7069
"""
7170
Configure logging for the application.
7271
:param home_dir: the root directory for the application
@@ -79,15 +78,14 @@ def setup_logging(
7978
logger.remove()
8079

8180
# Add file handler if we are not running tests
82-
if log_file and config.env != "test":
81+
if log_file and env != "test":
8382
# enable pydantic logfire
8483
logfire.configure(
8584
code_source=logfire.CodeSource(
8685
repository="https://github.com/basicmachines-co/basic-memory",
8786
revision=basic_memory.__version__,
88-
root_path="/src/basic_memory",
8987
),
90-
environment=config.env,
88+
environment=env,
9189
console=False,
9290
)
9391
logger.configure(handlers=[logfire.loguru_handler()])
@@ -100,7 +98,7 @@ def setup_logging(
10098
log_path = home_dir / log_file
10199
logger.add(
102100
str(log_path),
103-
level=config.log_level,
101+
level=log_level,
104102
rotation="100 MB",
105103
retention="10 days",
106104
backtrace=True,
@@ -109,7 +107,13 @@ def setup_logging(
109107
colorize=False,
110108
)
111109

112-
# Add stderr handler
113-
logger.add(sys.stderr, level=config.log_level, backtrace=True, diagnose=True, colorize=True)
110+
if env == "test" or console:
111+
# Add stderr handler
112+
logger.add(sys.stderr, level=log_level, backtrace=True, diagnose=True, colorize=True)
113+
114+
logger.info(f"ENV: '{env}' Log level: '{log_level}' Logging to {log_file}")
114115

115-
logger.info(f"ENV: '{config.env}' Log level: '{config.log_level}' Logging to {log_file}")
116+
# Get the logger for 'httpx'
117+
httpx_logger = logging.getLogger("httpx")
118+
# Set the logging level to WARNING to ignore INFO and DEBUG logs
119+
httpx_logger.setLevel(logging.WARNING)

tests/__init__.py

Lines changed: 2 additions & 2 deletions

0 commit comments

Comments
 (0)