11import logging , sys , traceback
22from logging .handlers import RotatingFileHandler
33from threading import Lock
4+ import copy
45
56from code42cli .compat import str
67from code42cli .util import get_user_project_path , is_interactive
@@ -79,6 +80,20 @@ def _get_user_error_logger():
7980 return _get_error_file_logger ()
8081
8182
83+ class RedStderrHandler (logging .StreamHandler ):
84+ """Logging handler for logging error messages to stderr using red scary text prefixed by the
85+ word `ERROR`. For logging info to stderr, it will not add the scary red text."""
86+ def __init__ (self ):
87+ super (RedStderrHandler , self ).__init__ (sys .stderr )
88+
89+ def emit (self , record ):
90+ if record .levelno == logging .ERROR :
91+ message = _get_red_error_text (record .msg )
92+ record = copy .copy (record )
93+ record .msg = message
94+ super (RedStderrHandler , self ).emit (record )
95+
96+
8297def _get_interactive_user_error_logger ():
8398 """This logger has two handlers, one for stderr and one for the error log file."""
8499 logger = logging .getLogger (u"code42_stderr_main" )
@@ -87,7 +102,7 @@ def _get_interactive_user_error_logger():
87102
88103 with logger_deps_lock :
89104 if not logger_has_handlers (logger ):
90- stderr_handler = logging . StreamHandler ( sys . stderr )
105+ stderr_handler = RedStderrHandler ( )
91106 stderr_formatter = _get_standard_formatter ()
92107 stderr_handler .setFormatter (stderr_formatter )
93108
@@ -98,7 +113,7 @@ def _get_interactive_user_error_logger():
98113 add_handler_to_logger (logger , stderr_handler , stderr_formatter )
99114 add_handler_to_logger (logger , file_handler , file_formatter )
100115
101- logger .setLevel (logging .ERROR )
116+ logger .setLevel (logging .INFO )
102117 return logger
103118 return logger
104119
@@ -139,14 +154,12 @@ def print_bold(self, message):
139154 self ._info_logger .info (u"\033 [1m{}\033 [0m" .format (message ))
140155
141156 def print_and_log_error (self , message ):
142- """For not interrupting stdout output. Excludes red text and 'ERROR: ' from `error()`.
143- """
144- """Logs red text to stderr and a log file."""
145- self ._user_error_logger .error (_get_red_error_text (message ))
157+ """Logs red error text to stderr and non-color messages to the log file."""
158+ self ._user_error_logger .error (message )
146159
147160 def print_and_log_info (self , message ):
148- """Logs red text to stderr and a log file."""
149- self ._user_error_logger .error (message )
161+ """Prints to stderr and the log file."""
162+ self ._user_error_logger .info (message )
150163
151164 def log_error (self , err ):
152165 if err :
@@ -171,7 +184,7 @@ def log_verbose_error(self, invocation_str=None, http_request=None):
171184 prefix = (
172185 u"Exception occurred."
173186 if not invocation_str
174- else "Exception occurred from input: '{}'." .format (invocation_str )
187+ else u "Exception occurred from input: '{}'." .format (invocation_str )
175188 )
176189 message = u"{}. See error below." .format (prefix )
177190 self .log_error (message )
0 commit comments