| import logging |
| |
| class udf_logging(object): |
| udf_log_level = logging.INFO |
| |
| @classmethod |
| def set_log_level_error(cls): |
| cls.udf_log_level = logging.ERROR |
| |
| @classmethod |
| def set_log_level_warn(cls): |
| cls.udf_log_level = logging.WARN |
| |
| @classmethod |
| def set_log_level_info(cls): |
| cls.udf_log_level = logging.INFO |
| |
| @classmethod |
| def set_log_level_debug(cls): |
| cls.udf_log_level = logging.DEBUG |
| |
| def outputSchema(schema_str): |
| def wrap(f): |
| def wrapped_f(*args): |
| return f(*args) |
| return wrapped_f |
| return wrap |
| |
| def write_user_exception(filename, stream_err_output, num_lines_offset_trace=0): |
| import sys |
| import traceback |
| import inspect |
| (t, v, tb) = sys.exc_info() |
| name = t.__name__ |
| record_error = False |
| |
| if name in ['SyntaxError', 'IndentationError']: |
| syntax_error_values = v.args |
| user_line_number = syntax_error_values[1][1] - num_lines_offset_trace |
| error_message = "%s: %s\n\tFile: %s, line %s column %s\n\t%s" % \ |
| (name, |
| syntax_error_values[0], |
| syntax_error_values[1][0], |
| user_line_number, |
| syntax_error_values[1][2], |
| syntax_error_values[1][3]) |
| else: |
| error_message = "%s: %s\n" % (name, v) |
| user_line_number = None |
| while 1: |
| e_file_name = tb.tb_frame.f_code.co_filename |
| if e_file_name.find(filename) > 0: |
| record_error = True |
| if not record_error: |
| if not tb.tb_next: |
| break |
| tb = tb.tb_next |
| continue |
| |
| line_number = tb.tb_lineno |
| mod = inspect.getmodule(tb) |
| if mod: |
| lines, offset = inspect.getsourcelines(mod) |
| line = lines[line_number - offset - 1] |
| else: |
| #Useful to catch exceptions with an invalid module (like syntax |
| #errors) |
| lines, offset = inspect.getsourcelines(tb.tb_frame) |
| if (line_number - 1) >= len(lines): |
| line = "Unknown Line" |
| else: |
| line = lines[line_number - 1] |
| |
| user_line_number = line_number - num_lines_offset_trace |
| func_name = tb.tb_frame.f_code.co_name |
| error_message += 'File %s, line %s, in %s\n\t%s\n' % \ |
| (e_file_name, user_line_number, func_name, line) |
| if not tb.tb_next: |
| break |
| tb = tb.tb_next |
| if name in ['UnicodeEncodeError']: |
| error_message += "\nTo print a unicode string in your udf use encode('utf-8'). Example: \n\tprint 'Example'.encode('utf-8')" |
| if user_line_number: |
| stream_err_output.write("%s\n" % user_line_number) |
| stream_err_output.write("%s\n" % error_message) |