@@ -22,10 +22,11 @@ def parse_debug_args():
2222 args , _ = debug_parser .parse_known_args ()
2323 return args
2424
25+
2526def setup_debug_logging ():
2627 debug_args = parse_debug_args ()
2728 root_logger = logging .getLogger ("root" )
28-
29+
2930 if debug_args .verbose :
3031 nxc_logger .logger .setLevel (logging .INFO )
3132 root_logger .setLevel (logging .INFO )
@@ -35,7 +36,7 @@ def setup_debug_logging():
3536 else :
3637 nxc_logger .logger .setLevel (logging .ERROR )
3738 root_logger .setLevel (logging .ERROR )
38-
39+
3940
4041def create_temp_logger (caller_frame , formatted_text , args , kwargs ):
4142 """Create a temporary logger for emitting a log where we need to override the calling file & line number, since these are obfuscated"""
@@ -47,22 +48,24 @@ def create_temp_logger(caller_frame, formatted_text, args, kwargs):
4748
4849class SmartDebugRichHandler (RichHandler ):
4950 """Custom logging handler for when we want to log normal messages to DEBUG and not double log"""
51+
5052 def __init__ (self , formatter = None , * args , ** kwargs ):
5153 super ().__init__ (* args , ** kwargs )
5254 if formatter is not None :
5355 self .setFormatter (formatter )
54-
56+
5557 def emit (self , record ):
5658 """Overrides the emit method of the RichHandler class so we can set the proper pathname and lineno"""
5759 # for some reason in RDP, the exc_text is None which leads to a KeyError in Python logging
5860 record .exc_text = record .getMessage () if record .exc_text is None else record .exc_text
59-
61+
6062 if hasattr (record , "caller_frame" ):
6163 frame_info = inspect .getframeinfo (record .caller_frame )
6264 record .pathname = frame_info .filename
6365 record .lineno = frame_info .lineno
6466 super ().emit (record )
6567
68+
6669def no_debug (func ):
6770 """Stops logging non-debug messages when we are in debug mode
6871 It creates a temporary logger and logs the message to the console and file
@@ -72,7 +75,7 @@ def no_debug(func):
7275 def wrapper (self , msg , * args , ** kwargs ):
7376 if self .logger .getEffectiveLevel () >= logging .INFO :
7477 return func (self , msg , * args , ** kwargs )
75- else :
78+ else :
7679 formatted_text = Text .from_ansi (self .format (msg , * args , ** kwargs )[0 ])
7780 caller_frame = inspect .currentframe ().f_back
7881 create_temp_logger (caller_frame , formatted_text , args , kwargs )
@@ -94,7 +97,7 @@ def __init__(self, extra=None):
9497 self .logger = logging .getLogger ("nxc" )
9598 self .extra = extra
9699 self .output_file = None
97-
100+
98101 logging .getLogger ("impacket" ).disabled = True
99102 logging .getLogger ("pypykatz" ).disabled = True
100103 logging .getLogger ("minidump" ).disabled = True
@@ -181,7 +184,7 @@ def add_file_log(self, log_file=None):
181184 open (output_file , "x" ) # noqa: SIM115
182185 file_creation = True
183186
184- file_handler = RotatingFileHandler (output_file , maxBytes = 100000 )
187+ file_handler = RotatingFileHandler (output_file , maxBytes = 100000 , encoding = "utf-8" )
185188
186189 with file_handler ._open () as f :
187190 if file_creation :
@@ -203,7 +206,7 @@ def init_log_file():
203206 datetime .now ().strftime ("%Y-%m-%d" ),
204207 f"log_{ datetime .now ().strftime ('%Y-%m-%d-%H-%M-%S' )} .log" ,
205208 )
206-
209+
207210
208211class TermEscapeCodeFormatter (logging .Formatter ):
209212 """A class to strip the escape codes for logging to files"""
0 commit comments