44import logging
55import os
66import time
7+ import sys
8+ from pathlib import Path
79from typing import Optional
810
911from fastcore .net import HTTP404NotFoundError , HTTP403ForbiddenError # type: ignore
@@ -25,6 +27,32 @@ def __str__(self):
2527 )
2628
2729
30+ def setup_logger (repo : str , log_file : Path , mode : str = "w" ) -> logging .Logger :
31+ """Used for logging the build process of images and running containers.
32+ It writes logs to the log file.
33+ """
34+ log_file .parent .mkdir (parents = True , exist_ok = True )
35+ logger = logging .getLogger (f"{ repo } .{ log_file .name } " )
36+ handler = logging .FileHandler (log_file , mode = mode )
37+ stdout_handler = logging .StreamHandler (sys .stdout )
38+ logger .addHandler (stdout_handler )
39+ formatter = logging .Formatter ("%(asctime)s - %(levelname)s - %(message)s" )
40+ handler .setFormatter (formatter )
41+ logger .addHandler (handler )
42+ logger .setLevel (logging .INFO )
43+ logger .propagate = False
44+ setattr (logger , "log_file" , log_file )
45+ return logger
46+
47+
48+ def close_logger (logger : logging .Logger ) -> None :
49+ """Closes all handlers associated with the given logger to prevent too many open files."""
50+ # To avoid too many open files
51+ for handler in logger .handlers :
52+ handler .close ()
53+ logger .removeHandler (handler )
54+
55+
2856def get_hash_string (input_string : str ) -> str :
2957 # Create a new SHA-256 hash object
3058 sha256 = hashlib .sha256 ()
0 commit comments