| 339 | |
| 340 | |
| 341 | class TeamCityFormatter(logging.Formatter): |
| 342 | def __init__(self): |
| 343 | super().__init__('##teamcity[message text=\'%(message)s\' status=\'%(levelname)s\']') |
| 344 | |
| 345 | def format(self, record): |
| 346 | record.message = record.getMessage() |
| 347 | if record.exc_info: |
| 348 | if not record.exc_text: |
| 349 | record.exc_text = self.formatException(record.exc_info) |
| 350 | if record.exc_text: |
| 351 | try: |
| 352 | _ = '' + record.exc_text |
| 353 | except UnicodeError: |
| 354 | record.exc_text = record.exc_text.decode(sys.getfilesystemencoding(), 'replace') |
| 355 | |
| 356 | tc_level = 'NORMAL' |
| 357 | if record.levelno >= logging.ERROR: |
| 358 | tc_level = 'ERROR' |
| 359 | elif record.levelno >= logging.WARNING: |
| 360 | tc_level = 'WARNING' |
| 361 | output = getattr(record, 'output', '') |
| 362 | message = '\n'.join((record.message, record.exc_text or '', output)).strip() |
| 363 | |
| 364 | s = '\n'.join((self._fmt % {'message': escape_value(x), 'levelname': tc_level}) for x in message.split('\n')) |
| 365 | return s |
| 366 | |
| 367 | |
| 368 | def main(argv): |