Skip to content

Commit 94175a0

Browse files
authored
feat: 添加前台打印日志 (#190)
* feat: 前台打印日志 * feat: 添加前台运行日志和localization
1 parent 1dff5e8 commit 94175a0

File tree

14 files changed

+769
-788
lines changed

14 files changed

+769
-788
lines changed

bot/base/localization.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
class LocalizationMap:
2+
SCENARIO_TYPE_UNKNOWN = '未知'
3+
SCENARIO_TYPE_URA = 'URA'
4+
SCENARIO_TYPE_AOHARUHAI = '青春杯'
5+
6+
SUPPORT_CARD_TYPE_UNKNOWN = '未知'
7+
SUPPORT_CARD_TYPE_SPEED = '速度'
8+
SUPPORT_CARD_TYPE_STAMINA = '耐力'
9+
SUPPORT_CARD_TYPE_POWER = '力量'
10+
SUPPORT_CARD_TYPE_WILL = '毅力'
11+
SUPPORT_CARD_TYPE_INTELLIGENCE = '智力'
12+
SUPPORT_CARD_TYPE_FRIEND = '友情'
13+
SUPPORT_CARD_TYPE_GROUP = '团队'
14+
SUPPORT_CARD_TYPE_NPC = 'NPC'
15+
16+
SUPPORT_CARD_FAVOR_LEVEL_UNKNOWN = '未知'
17+
SUPPORT_CARD_FAVOR_LEVEL_1 = '等级1'
18+
SUPPORT_CARD_FAVOR_LEVEL_2 = '等级2'
19+
SUPPORT_CARD_FAVOR_LEVEL_3 = '等级3'
20+
SUPPORT_CARD_FAVOR_LEVEL_4 = '等级4'
21+
22+
TRAINING_TYPE_UNKNOWN = '未知'
23+
TRAINING_TYPE_SPEED = '速度'
24+
TRAINING_TYPE_STAMINA = '耐力'
25+
TRAINING_TYPE_POWER = '力量'
26+
TRAINING_TYPE_WILL = '毅力'
27+
TRAINING_TYPE_INTELLIGENCE = '智力'
28+
29+
MOTIVATION_LEVEL_UNKNOWN = '未知'
30+
MOTIVATION_LEVEL_1 = '等级1'
31+
MOTIVATION_LEVEL_2 = '等级2'
32+
MOTIVATION_LEVEL_3 = '等级3'
33+
MOTIVATION_LEVEL_4 = '等级4'
34+
MOTIVATION_LEVEL_5 = '等级5'
35+
36+
TURN_OPERATION_TYPE_UNKNOWN = '未知'
37+
TURN_OPERATION_TYPE_TRAINING = '训练'
38+
TURN_OPERATION_TYPE_REST = '休息'
39+
TURN_OPERATION_TYPE_MEDIC = '医务室'
40+
TURN_OPERATION_TYPE_TRIP = '外出'
41+
TURN_OPERATION_TYPE_RACE = '赛事'
42+
43+
SUPPORT_CARD_UMA_UNKNOWN = '未知'
44+
SUPPORT_CARD_UMA_AKIKAWA = '理事长'
45+
SUPPORT_CARD_UMA_REPORTER = '记者'
46+
47+
RACE_TACTIC_TYPE_UNKNOWN = '未知'
48+
RACE_TACTIC_TYPE_BACK = '后追'
49+
RACE_TACTIC_TYPE_MIDDLE = '居中'
50+
RACE_TACTIC_TYPE_FRONT = '跟前'
51+
RACE_TACTIC_TYPE_ESCAPE = '领跑'
52+
53+
TASK_STATUS_INVALID = '任务无效'
54+
TASK_STATUS_PENDING = '任务暂停'
55+
TASK_STATUS_RUNNING = '任务运行'
56+
TASK_STATUS_INTERRUPT = '任务被打断'
57+
TASK_STATUS_SUCCESS = '任务完成'
58+
TASK_STATUS_FAILED = '任务失败'
59+
TASK_STATUS_SCHEDULED = '任务定时'
60+
TASK_STATUS_CANCELED = '任务取消'
61+
62+
support_card = '暂无'
63+
64+
localization_map = {attr: value for attr, value in vars(LocalizationMap).items()
65+
if not callable(value) and not attr.startswith('_')}
66+
67+
def _localization_single(string):
68+
for name, value in localization_map.items():
69+
string = string.replace(name, value)
70+
return string
71+
72+
73+
def localization(text):
74+
if isinstance(text, str):
75+
return _localization_single(text)
76+
if not isinstance(text, list):
77+
raise TypeError(f'localization failed: illegal type {type(text)}')
78+
for i, string in enumerate(text):
79+
if not isinstance(string, str):
80+
raise TypeError(f'localization failed: illegal type {type(string)}')
81+
text[i] = _localization_single(string)
82+
return text

bot/base/log.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import logging
2+
import os
23
import sys
4+
import time
5+
import threading
6+
from collections import deque
37
from logging import Logger
4-
8+
from bot.base.user_data import base_path
9+
from bot.base.localization import localization
510
import colorlog
611

712
log_colors_config = {
@@ -12,6 +17,37 @@
1217
'CRITICAL': 'bold_red',
1318
}
1419

20+
current_time = time.strftime("%Y%m%d_%H%M%S", time.localtime())
21+
log_path = os.path.join(base_path, "log_" + current_time + ".txt")
22+
23+
class TaskLogHandler(logging.Handler):
24+
def __init__(self, capacity=1000):
25+
super().__init__()
26+
self.task_id = None
27+
self.buffer = {}
28+
self.lock = threading.RLock()
29+
self.capacity = capacity
30+
31+
def emit(self, record):
32+
if hasattr(record, "task_id"):
33+
self.task_id = record.task_id
34+
if self.task_id is not None:
35+
if self.task_id not in self.buffer:
36+
self.buffer[self.task_id] = deque(maxlen=self.capacity)
37+
log_text = localization(self.format(record))
38+
with self.lock:
39+
self.buffer[self.task_id].append(log_text)
40+
41+
def get_task_log(self, task_id):
42+
with self.lock:
43+
logs = list(self.buffer[task_id])
44+
return logs
45+
46+
task_log_handler = TaskLogHandler()
47+
fmt = logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M')
48+
task_log_handler.setFormatter(fmt)
49+
task_log_handler.setLevel(logging.INFO)
50+
1551

1652
def get_logger(name) -> Logger:
1753
logger = logging.getLogger(name)
@@ -26,6 +62,14 @@ def get_logger(name) -> Logger:
2662
console_handler.setFormatter(fmt)
2763
console_handler.setLevel(logging.DEBUG)
2864
logger.addHandler(console_handler)
65+
66+
fmt = logging.Formatter('%(asctime)s %(levelname)-8s [%(funcName)34s] %(filename)-20s: %(message)s')
67+
file_handler = logging.FileHandler(log_path)
68+
file_handler.setFormatter(fmt)
69+
file_handler.setLevel(logging.DEBUG)
70+
logger.addHandler(file_handler)
71+
72+
logger.addHandler(task_log_handler)
2973
return logger
3074

3175

bot/base/task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def end_task(self, status, reason) -> None:
6767

6868
@abstractmethod
6969
def start_task(self) -> None:
70-
pass
70+
log.info("任务开始", extra={"task_id": self.task_id})
7171

7272
def running(self) -> bool:
7373
return self.task_status == TaskStatus.TASK_STATUS_RUNNING

bot/base/user_data.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
22

33
base_path = "userdata"
4-
4+
if not os.path.exists(base_path):
5+
os.makedirs(base_path)
56

67
def write_file(filename, content):
78
filepath = os.path.dirname(base_path + filename)

bot/conn/u2_ctrl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def execute_adb_shell(self, cmd, sync):
138138

139139
def start_app(self, name):
140140
self.u2client.app_start(name)
141-
log.info("starting app <" + name + ">")
141+
log.debug("starting app <" + name + ">")
142142

143143
# get_front_activity 获取前台正在运行的应用
144144
def get_front_activity(self):

bot/server/handler.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from fastapi import FastAPI, Path
44
from fastapi.middleware.cors import CORSMiddleware
55

6+
from bot.base.log import task_log_handler
67
from bot.engine import ctrl as bot_ctrl
78
from bot.server.protocol.task import *
89
from starlette.responses import FileResponse
@@ -33,6 +34,10 @@ def delete_task(req: DeleteTaskRequest):
3334
def get_task():
3435
return bot_ctrl.get_task_list()
3536

37+
@server.get("/log/{task_id}")
38+
def get_task_log(task_id):
39+
return task_log_handler.get_task_log(task_id)
40+
3641

3742
@server.post("/action/bot/reset-task")
3843
def reset_task(req: ResetTaskRequest):

module/umamusume/task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def end_task(self, status, reason) -> None:
3838
super().end_task(status, reason)
3939

4040
def start_task(self) -> None:
41-
pass
41+
super().start_task()
4242

4343

4444
class UmamusumeTaskType(Enum):

module/umamusume/types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def log_training_info(self):
5252
text = "此训练附带支援卡列表:["
5353
for c in self.support_card_info_list:
5454
if c.favor != SupportCardFavorLevel.SUPPORT_CARD_FAVOR_LEVEL_UNKNOWN:
55-
text += "[支援卡名称:" + str(c.name) + "支援卡类型:" + str(c.card_type.name) + ", 支援卡羁绊阶段:" + str(c.favor.name) + "] "
55+
text += "[支援卡名称:" + str(c.name) + ", 支援卡类型:" + str(c.card_type.name) + ", 支援卡羁绊阶段:" + str(c.favor.name) + "] "
5656
text += "]"
5757
log.info(text)
5858

@@ -124,9 +124,9 @@ def __init__(self):
124124
self.turn_learn_skill_done = False
125125

126126
def log_turn_info(self):
127-
log.info("当前回合时间 >" + str(self.date))
127+
log.info("当前回合时间 " + str(self.date))
128128
log.info("干劲状态 " + str(self.motivation_level.name))
129-
log.info("体力剩余" + str(self.remain_stamina))
129+
log.info("体力剩余 " + str(self.remain_stamina))
130130
log.info("当前属性值 速度:%s, 耐力:%s, 力量:%s, 毅力:%s, 智力:%s, 技能点:%s", self.uma_attribute.speed,
131131
self.uma_attribute.stamina, self.uma_attribute.power, self.uma_attribute.will, self.uma_attribute.intelligence, self.uma_attribute.skill_point)
132132
log.info("速度训练结果:")

public/assets/index.8b6feb95.js

Lines changed: 0 additions & 766 deletions
This file was deleted.

public/assets/index.8221f85d.css renamed to public/assets/index.b97bb97d.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)