From ff9d612e678ee5d88b7db724ac81965f98749f4f Mon Sep 17 00:00:00 2001 From: liuyebo <1515783401@qq.com> Date: Thu, 26 Sep 2024 13:44:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AE=B9=E5=99=A8=E6=8C=82?= =?UTF-8?q?=E8=BD=BD=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 7 +- .gitignore | 7 +- README.md | 2 +- docker-compose-test.yml | 6 +- services/paddle_services/cost_api.py | 2 +- services/paddle_services/discharge_api.py | 2 +- services/paddle_services/log/__init__.py | 70 +++++++++++++++++++ .../paddle_services/model}/README.md | 0 services/paddle_services/settlement_api.py | 2 +- services/paddle_services/utils.py | 2 + visual_model_test/visual_model_test.py | 8 +-- 11 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 services/paddle_services/log/__init__.py rename {model => services/paddle_services/model}/README.md (100%) diff --git a/.dockerignore b/.dockerignore index a87a63e..46a45c7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -238,8 +238,11 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ -# 模型通过卷绑定挂载到容器中 -/model +# 通过卷绑定挂载到容器中 +/log +/services/paddle_services/log +/services/paddle_services/model +/tmp_img # docker Dockerfile docker-compose*.yml \ No newline at end of file diff --git a/.gitignore b/.gitignore index ad003c9..d3e9a22 100644 --- a/.gitignore +++ b/.gitignore @@ -142,7 +142,10 @@ cython_debug/ .idea ### Model -model +services/paddle_services/model ### Log Backups -*.log.*-*-* \ No newline at end of file +*.log.*-*-* + +### Tmp Files +/tmp_img \ No newline at end of file diff --git a/README.md b/README.md index c7028a5..8d42692 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ 1. 从Git远程仓库克隆项目到本地。 -2. 将深度学习模型复制到./model目录下,具体请看[模型更新](#模型更新)部分。 +2. 将深度学习模型复制到./services/paddle_services/model目录下,具体请看[模型更新](#模型更新)部分。 3. 安装docker和docker-compose。 diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 936ebcd..d41f5e8 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -8,14 +8,16 @@ x-project: image: fcb_photo_review:2.0.0 volumes: - ./log:/app/log + - ./tmp_img:/app/tmp_img x-paddle: &paddle_template <<: *base_template image: fcb_paddle:0.0.1 volumes: - - ./log:/app/log - - ./model:/app/model + - ./services/paddle_services/log:/app/log + - ./services/paddle_services/model:/app/model + - ./tmp_img:/app/tmp_img services: ocr_api: diff --git a/services/paddle_services/cost_api.py b/services/paddle_services/cost_api.py index bcadee9..6a508e7 100644 --- a/services/paddle_services/cost_api.py +++ b/services/paddle_services/cost_api.py @@ -9,7 +9,7 @@ from . import PATIENT_NAME, ADMISSION_DATE, DISCHARGE_DATE, MEDICAL_EXPENSES app = Flask(__name__) COST_LIST_SCHEMA = PATIENT_NAME + ADMISSION_DATE + DISCHARGE_DATE + MEDICAL_EXPENSES COST = Taskflow('information_extraction', schema=COST_LIST_SCHEMA, model='uie-x-base', - task_path='../../model/cost_list_model', layout_analysis=False, precision='fp16') + task_path='model/cost_list_model', layout_analysis=False, precision='fp16') @app.route('/nlp/cost', methods=['POST']) diff --git a/services/paddle_services/discharge_api.py b/services/paddle_services/discharge_api.py index 174cdba..1a49178 100644 --- a/services/paddle_services/discharge_api.py +++ b/services/paddle_services/discharge_api.py @@ -11,7 +11,7 @@ DISCHARGE_RECORD_SCHEMA = ( HOSPITAL + DEPARTMENT + PATIENT_NAME + ADMISSION_DATE + DISCHARGE_DATE + DOCTOR + ADMISSION_ID + AGE ) DISCHARGE = Taskflow('information_extraction', schema=DISCHARGE_RECORD_SCHEMA, model='uie-x-base', - task_path='../../model/discharge_record_model', layout_analysis=False, precision='fp16') + task_path='model/discharge_record_model', layout_analysis=False, precision='fp16') @app.route('/nlp/discharge', methods=['POST']) diff --git a/services/paddle_services/log/__init__.py b/services/paddle_services/log/__init__.py new file mode 100644 index 0000000..d2e9472 --- /dev/null +++ b/services/paddle_services/log/__init__.py @@ -0,0 +1,70 @@ +import os +import socket + +# 获取主机名,方便区分容器 +HOSTNAME = socket.gethostname() +# 检测日志文件的路径是否存在,不存在则创建 +LOG_PATHS = [ + f"log/{HOSTNAME}/error", +] +for path in LOG_PATHS: + if not os.path.exists(path): + os.makedirs(path) + +# 配置字典 +LOGGING_CONFIG = { + 'version': 1, # 必需,指定配置格式的版本 + 'disable_existing_loggers': False, # 是否禁用已经存在的logger实例 + + # formatters定义了不同格式的日志样式 + 'formatters': { + 'standard': { + 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s', + 'datefmt': '%Y-%m-%d %H:%M:%S', + }, + }, + + # handlers定义了不同类型的日志处理器 + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', # 控制台处理器 + 'level': 'DEBUG', + 'formatter': 'standard', + 'stream': 'ext://sys.stdout', # 输出到标准输出,默认编码跟随系统,一般为UTF-8 + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', # 文件处理器,支持日志滚动 + 'level': 'INFO', + 'formatter': 'standard', + 'filename': f'log/{HOSTNAME}/fcb_photo_review.log', # 日志文件路径 + 'when': 'midnight', + 'interval': 1, + 'backupCount': 14, # 保留的备份文件数量 + 'encoding': 'utf-8', # 显式指定文件编码为UTF-8以支持中文 + }, + 'error': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'level': 'INFO', + 'formatter': 'standard', + 'filename': f'log/{HOSTNAME}/error/fcb_photo_review_error.log', + 'when': 'midnight', + 'interval': 1, + 'backupCount': 14, + 'encoding': 'utf-8', + }, + }, + + # loggers定义了日志记录器 + 'loggers': { + '': { # 根记录器 + 'handlers': ['console', 'file'], # 关联的处理器 + 'level': 'DEBUG', # 根记录器的级别 + 'propagate': False, # 是否向上级传播日志信息 + }, + 'error': { + 'handlers': ['console', 'file', 'error'], + 'level': 'DEBUG', + 'propagate': False, + }, + }, +} diff --git a/model/README.md b/services/paddle_services/model/README.md similarity index 100% rename from model/README.md rename to services/paddle_services/model/README.md diff --git a/services/paddle_services/settlement_api.py b/services/paddle_services/settlement_api.py index 248c727..fd790c3 100644 --- a/services/paddle_services/settlement_api.py +++ b/services/paddle_services/settlement_api.py @@ -15,7 +15,7 @@ SETTLEMENT_LIST_SCHEMA = ( + UPPERCASE_MEDICAL_EXPENSES ) SETTLEMENT_IE = Taskflow('information_extraction', schema=SETTLEMENT_LIST_SCHEMA, model='uie-x-base', - task_path='../../model/settlement_list_model', layout_analysis=False, precision='fp16') + task_path='model/settlement_list_model', layout_analysis=False, precision='fp16') @app.route('/nlp/settlement', methods=['POST']) diff --git a/services/paddle_services/utils.py b/services/paddle_services/utils.py index 078ebb4..6e646cb 100644 --- a/services/paddle_services/utils.py +++ b/services/paddle_services/utils.py @@ -1,3 +1,4 @@ +import logging import os from flask import jsonify @@ -13,6 +14,7 @@ def process_request(func): result = func(*args, **kwargs) return jsonify(result), 200 except Exception as e: + logging.getLogger("error").error(e, exc_info=e) return jsonify({'error': str(e)}), 500 return wrapper diff --git a/visual_model_test/visual_model_test.py b/visual_model_test/visual_model_test.py index 6af72d3..c33dbfc 100644 --- a/visual_model_test/visual_model_test.py +++ b/visual_model_test/visual_model_test.py @@ -125,20 +125,20 @@ def main(model_type, pic_name=None): "drg103") if pic_name else "../test_img/PH20240725004467_3_185708_1.jpg" schema = None elif model_type == "settlement": - task_path = "../model/settlement_list_model" + task_path = "../services/paddle_services/model/settlement_list_model" test_img_path = ufile.get_private_url(pic_name) if pic_name else "img/PH20240511000638_1_094306_1.jpg" schema = ["患者姓名", "入院日期", "出院日期", "费用总额", "个人现金支付", "个人账户支付", "自费金额", "医保类型", "住院号", "医保结算单号码", "大写总额"] elif model_type == "discharge": - task_path = "../model/discharge_record_model" + task_path = "../services/paddle_services/model/discharge_record_model" test_img_path = ufile.get_private_url(pic_name) if pic_name else "img/PH20240401000003_3_001938_2.jpg" schema = ["医院", "科室", "患者姓名", "入院日期", "出院日期", "主治医生", "住院号", "年龄"] elif model_type == "cost": - task_path = "../model/cost_list_model" + task_path = "../services/paddle_services/model/cost_list_model" test_img_path = ufile.get_private_url(pic_name) if pic_name else "img/PH20240511000648_4_094542_2.jpg" schema = ["患者姓名", "入院日期", "出院日期", "费用总额"] elif model_type == "cost_detail": - task_path = "../model/cost_list_detail_model" + task_path = "../services/paddle_services/model/cost_list_detail_model" test_img_path = ufile.get_private_url(pic_name) if pic_name else "img/PH20240511000648_4_094542_2.jpg" schema = {"名称": ["类别", "规格", "单价", "数量", "金额"]} else: