44import logging .config
55import os
66from contextlib import contextmanager
7+ from datetime import datetime
78from os import environ
89from pathlib import Path
910from typing import cast
@@ -124,11 +125,10 @@ def getLogger(self, name) -> trace_logger.TraceLogger:
124125 def _configure_logging (self ):
125126 trace_logger .install ()
126127
127- log_level = self .get ("APPMAP_LOG_LEVEL" , "warning " ).upper ()
128-
128+ log_level = self .get ("APPMAP_LOG_LEVEL" , "warn " ).upper ()
129+ disable_log = os . environ . get ( "APPMAP_DISABLE_LOG_FILE" , "false" ). upper () != "FALSE"
129130 log_config = self .get ("APPMAP_LOG_CONFIG" )
130- log_stream = self .get ("APPMAP_LOG_STREAM" , "stderr" )
131- log_stream = "ext://sys.%s" % (log_stream )
131+ now = datetime .now ()
132132 config_dict = {
133133 "version" : 1 ,
134134 "disable_existing_loggers" : False ,
@@ -138,9 +138,7 @@ def _configure_logging(self):
138138 "format" : "[{asctime}] {levelname} {name}: {message}" ,
139139 }
140140 },
141- "handlers" : {
142- "default" : {"class" : "logging.StreamHandler" , "formatter" : "default" }
143- },
141+ "handlers" : {"default" : {"class" : "logging.StreamHandler" , "formatter" : "default" }},
144142 "loggers" : {
145143 "appmap" : {
146144 "level" : log_level ,
@@ -154,6 +152,20 @@ def _configure_logging(self):
154152 },
155153 },
156154 }
155+ if not disable_log :
156+ # Default to being more verbose if we're logging to a file, but
157+ # still allow the level to be overridden.
158+ log_level = self .get ("APPMAP_LOG_LEVEL" , "info" ).upper ()
159+ loggers = config_dict ["loggers" ]
160+ loggers ["appmap" ]["level" ] = loggers ["_appmap" ]["level" ] = log_level
161+ config_dict ["handlers" ] = {
162+ "default" : {
163+ "class" : "logging.FileHandler" ,
164+ "formatter" : "default" ,
165+ "filename" : f"appmap-{ now :%Y%m%d%H%M%S} -{ os .getpid ()} .log" ,
166+ }
167+ }
168+
157169 if log_config is not None :
158170 name , level = log_config .split ("=" , 2 )
159171 config_dict ["loggers" ].update (
0 commit comments