1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4# 5# Copyright (c) 2023 Huawei Device Co., Ltd. 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17# 18 19import sys 20import re 21import os 22 23from containers.colors import Colors 24from helper.noInstance import NoInstance 25 26 27class LogLevel(): 28 INFO = 0 29 WARNING = 1 30 ERROR = 2 31 DEBUG = 3 32 33 34class LogUtil(metaclass=NoInstance): 35 36 @staticmethod 37 def hb_info(msg): 38 level = 'info' 39 for line in str(msg).splitlines(): 40 sys.stdout.write(LogUtil.message(level, line)) 41 sys.stdout.flush() 42 43 @staticmethod 44 def hb_warning(msg): 45 level = 'warning' 46 for line in str(msg).splitlines(): 47 sys.stderr.write(LogUtil.message(level, line)) 48 sys.stderr.flush() 49 50 @staticmethod 51 def hb_error(msg): 52 level = 'error' 53 for line in str(msg).splitlines(): 54 sys.stderr.write(LogUtil.message(level, line)) 55 sys.stderr.flush() 56 57 @staticmethod 58 def message(level, msg): 59 if isinstance(msg, str) and not msg.endswith('\n'): 60 msg += '\n' 61 if level == 'error': 62 msg = msg.replace('error:', f'{Colors.ERROR}error{Colors.END}:') 63 return f'{Colors.ERROR}[OHOS {level.upper()}]{Colors.END} {msg}' 64 elif level == 'info': 65 return f'[OHOS {level.upper()}] {msg}' 66 else: 67 return f'{Colors.WARNING}[OHOS {level.upper()}]{Colors.END} {msg}' 68 69 @staticmethod 70 def write_log(log_path, msg, level): 71 os.makedirs(os.path.dirname(log_path), exist_ok=True) 72 with open(log_path, 'at', encoding='utf-8') as log_file: 73 for line in str(msg).splitlines(): 74 sys.stderr.write(LogUtil.message(level, line)) 75 sys.stderr.flush() 76 log_file.write(LogUtil.message(level, line)) 77 78 @staticmethod 79 def get_failed_log(log_path): 80 with open(log_path, 'rt', encoding='utf-8') as log_file: 81 data = log_file.read() 82 83 failed_pattern = re.compile( 84 r'(\[\d+/\d+\].*?)(?=\[\d+/\d+\]|' 85 'ninja: build stopped)', re.DOTALL) 86 failed_log = failed_pattern.findall(data) 87 for log in failed_log: 88 if 'FAILED:' in log: 89 LogUtil.hb_error(log) 90 91 failed_pattern = re.compile(r'(ninja: error:.*?)\n', re.DOTALL) 92 failed_log = failed_pattern.findall(data) 93 for log in failed_log: 94 LogUtil.hb_error(log) 95 96 error_log = os.path.join(os.path.dirname(log_path), 'error.log') 97 if os.path.isfile(error_log): 98 with open(error_log, 'rt', encoding='utf-8') as log_file: 99 LogUtil.hb_error(log_file.read()) 100