|
35 | 35 | "outputs": [], |
36 | 36 | "source": [ |
37 | 37 | "#| export\n", |
38 | | - "from logtail import LogtailHandler\n", |
39 | | - "import logging\n", |
40 | | - "import os" |
| 38 | + "import logging.config\n", |
| 39 | + "from logtail import LogtailHandler, LogtailContext\n", |
| 40 | + "import sys" |
41 | 41 | ] |
42 | 42 | }, |
43 | 43 | { |
|
46 | 46 | "metadata": {}, |
47 | 47 | "outputs": [], |
48 | 48 | "source": [ |
49 | | - "\n", |
50 | 49 | "#| export\n", |
51 | | - "def setup_logging():\n", |
52 | | - " \"\"\"\n", |
53 | | - " Configure logging to use Better Stack's LogtailHandler\n", |
54 | | - " with env context included automatically.\n", |
55 | | - " \n", |
56 | | - " This should be called once at application startup.\n", |
57 | | - " \"\"\"\n", |
58 | | - " env = os.environ.get(\"ENV\", \"development\")\n", |
59 | | - " source_token = os.environ.get(\"BETTER_STACK_SOURCE_TOKEN\")\n", |
60 | | - " host = os.environ.get(\"BETTER_STACK_HOST\")\n", |
61 | | - " \n", |
62 | | - " if not source_token or not host:\n", |
63 | | - " # If Better Stack credentials are not available, fall back to basic config\n", |
64 | | - " logging.basicConfig(level=logging.INFO)\n", |
65 | | - " logging.warning(\"Better Stack credentials not found, using basic logging config\")\n", |
66 | | - " return\n", |
67 | | - " \n", |
68 | | - " # Configure the root logger first to set the minimum level\n", |
| 50 | + "\n", |
| 51 | + "def setup_logging(env, host, token):\n", |
69 | 52 | " root_logger = logging.getLogger()\n", |
70 | 53 | " root_logger.setLevel(logging.INFO)\n", |
71 | 54 | " \n", |
72 | | - " # Remove any existing handlers to avoid duplicates\n", |
73 | | - " for handler in root_logger.handlers[:]:\n", |
74 | | - " root_logger.removeHandler(handler)\n", |
75 | | - " \n", |
76 | | - " # Add a console handler for local development\n", |
77 | | - " console = logging.StreamHandler()\n", |
78 | | - " root_logger.addHandler(console)\n", |
| 55 | + " # Clear existing handlers to avoid duplicates if called multiple times\n", |
| 56 | + " root_logger.handlers = []\n", |
79 | 57 | " \n", |
80 | | - " try:\n", |
81 | | - " # Set up the Logtail handler\n", |
82 | | - " handler = LogtailHandler(\n", |
83 | | - " source_token=source_token,\n", |
84 | | - " host=host\n", |
| 58 | + " # Add Logtail handler for cloud logging\n", |
| 59 | + " logtail_handler = LogtailHandler(\n", |
| 60 | + " source_token=token, \n", |
| 61 | + " host=host,\n", |
| 62 | + " context=LogtailContext().context(\n", |
| 63 | + " environment={'name': env}\n", |
85 | 64 | " )\n", |
86 | | - " \n", |
87 | | - " # Override LogRecord factory to add env to all records\n", |
88 | | - " old_factory = logging.getLogRecordFactory()\n", |
89 | | - " def record_factory(*args, **kwargs):\n", |
90 | | - " record = old_factory(*args, **kwargs)\n", |
91 | | - " record.env = env\n", |
92 | | - " return record\n", |
93 | | - " logging.setLogRecordFactory(record_factory)\n", |
94 | | - " \n", |
95 | | - " # Add the handler to the root logger\n", |
96 | | - " root_logger.addHandler(handler)\n", |
97 | | - " \n", |
98 | | - " logging.info(f\"Better Stack logging configured with env: {env}\")\n", |
99 | | - " except Exception as e:\n", |
100 | | - " logging.error(f\"Failed to configure Better Stack logging: {e}\")\n", |
101 | | - "\n" |
| 65 | + " )\n", |
| 66 | + " root_logger.addHandler(logtail_handler)\n", |
| 67 | + " \n", |
| 68 | + "\n", |
| 69 | + " console_handler = logging.StreamHandler(sys.stdout)\n", |
| 70 | + " console_formatter = logging.Formatter(\n", |
| 71 | + " '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n", |
| 72 | + " )\n", |
| 73 | + " console_handler.setFormatter(console_formatter)\n", |
| 74 | + " root_logger.addHandler(console_handler)" |
102 | 75 | ] |
103 | 76 | }, |
104 | 77 | { |
|
0 commit comments