77import os
88import sys
99import typing as t
10+ from datetime import datetime
1011from enum import Enum
1112
1213from sqlmesh .core .dialect import extend_sqlglot
@@ -88,6 +89,9 @@ def is_notebook(self) -> bool:
8889 pass
8990
9091
92+ LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
93+
94+
9195# SO: https://stackoverflow.com/questions/384076/how-can-i-color-python-logging-output
9296class CustomFormatter (logging .Formatter ):
9397 """Custom logging formatter."""
@@ -97,14 +101,13 @@ class CustomFormatter(logging.Formatter):
97101 red = "\x1b [31;20m"
98102 bold_red = "\x1b [31;1m"
99103 reset = "\x1b [0m"
100- log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
101104
102105 FORMATS = {
103- logging .DEBUG : grey + log_format + reset ,
104- logging .INFO : grey + log_format + reset ,
105- logging .WARNING : yellow + log_format + reset ,
106- logging .ERROR : red + log_format + reset ,
107- logging .CRITICAL : bold_red + log_format + reset ,
106+ logging .DEBUG : grey + LOG_FORMAT + reset ,
107+ logging .INFO : grey + LOG_FORMAT + reset ,
108+ logging .WARNING : yellow + LOG_FORMAT + reset ,
109+ logging .ERROR : red + LOG_FORMAT + reset ,
110+ logging .CRITICAL : bold_red + LOG_FORMAT + reset ,
108111 }
109112
110113 def format (self , record : logging .LogRecord ) -> str :
@@ -113,7 +116,7 @@ def format(self, record: logging.LogRecord) -> str:
113116 return formatter .format (record )
114117
115118
116- def enable_logging (level : t .Optional [int ] = None ) -> None :
119+ def enable_logging (level : t .Optional [int ] = None , write_to_file : bool = False ) -> None :
117120 """Enable logging to send to stdout and color different levels"""
118121 level = level or (logging .DEBUG if debug_mode_enabled () else logging .INFO )
119122 logger = logging .getLogger ()
@@ -123,3 +126,10 @@ def enable_logging(level: t.Optional[int] = None) -> None:
123126 handler .setLevel (level )
124127 handler .setFormatter (CustomFormatter ())
125128 logger .addHandler (handler )
129+
130+ if write_to_file :
131+ filename = f"sqlmesh_{ datetime .now ().strftime ('%Y_%m_%d_%H_%M_%S' )} .log"
132+ file_handler = logging .FileHandler (filename , mode = "w" , encoding = "utf-8" )
133+ file_handler .setLevel (level )
134+ file_handler .setFormatter (logging .Formatter (LOG_FORMAT ))
135+ logger .addHandler (file_handler )
0 commit comments