Skip to content

Commit 99654dd

Browse files
committed
feat(logging): 添加日志扩展模块并集成到HTTP服务中
添加了`logging_extension.py`模块,用于初始化日志记录器,支持日志文件的按天轮转和控制台输出。将该模块集成到HTTP服务中,以便在服务启动时自动初始化日志记录器,并在错误处理时记录日志信息。
1 parent e573856 commit 99654dd

5 files changed

Lines changed: 785 additions & 39 deletions

File tree

internal/extension/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .migrate_extensive import migrate
22
from .database_extension import db
3+
from .logging_extension import logging_init_app
34

4-
__all__ = ["db", "migrate"]
5+
__all__ = ["db", "migrate", "logging_init_app"]
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import logging
2+
import os.path
3+
from logging.handlers import TimedRotatingFileHandler
4+
5+
from flask import Flask
6+
7+
8+
def logging_init_app(app: Flask):
9+
"""日志记录器初始化"""
10+
# 1.设置日志存储的文件夹,如果不存在则创建
11+
log_folder = os.path.join(os.getcwd(), "storage", "log")
12+
if not os.path.exists(log_folder):
13+
os.makedirs(log_folder)
14+
15+
# 2.定义日志的文件名
16+
log_file = os.path.join(log_folder, "app.log")
17+
18+
# 3.设置日志的格式,并且让日志每天更新一次
19+
handler = TimedRotatingFileHandler(
20+
log_file,
21+
when="midnight",
22+
interval=1,
23+
backupCount=30,
24+
encoding="utf-8",
25+
)
26+
formatter = logging.Formatter(
27+
"[%(asctime)s.%(msecs)03d] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s]: %(message)s"
28+
)
29+
handler.setLevel(logging.DEBUG)
30+
handler.setFormatter(formatter)
31+
logging.getLogger().addHandler(handler)
32+
33+
# 4.在开发环境下同时将日志输出到控制台
34+
if app.debug or os.getenv("FLASK_ENV") == "development":
35+
console_handler = logging.StreamHandler()
36+
console_handler.setFormatter(formatter)
37+
logging.getLogger().addHandler(console_handler)

internal/server/http.py

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,67 @@
1+
import logging
12
from flask import Flask, Response
23
from internal.router import Router
34
from config import Config
45
from internal.exception import CustomException
5-
from pkg.response import json,Response,HttpCode
6+
from internal.extension import logging_init_app
7+
from pkg.response import json, Response, HttpCode
68
import os
79
from pkg.sqlalchemy import SQLAlchemy
810
from flask_migrate import Migrate
911
from flask_cors import CORS
1012

1113

1214
class Http(Flask):
13-
def __init__(self, *args,config:Config,db: SQLAlchemy,
14-
migrate: Migrate, router:Router, **kwargs):
15-
super().__init__(*args, **kwargs)
16-
17-
if config:
18-
self.config.from_object(config)
19-
20-
self.register_error_handler(Exception, self._register_error_handler)
21-
22-
db.init_app(self)
23-
24-
25-
26-
# with self.app_context():
27-
# db.drop_all()
28-
# db.create_all()
29-
30-
migrate.init_app(self, db, directory="internal/migration")
31-
32-
CORS(self, resources={
33-
r"/*": {
34-
"origins": "*",
35-
"supports_credentials": True,
36-
}
37-
})
38-
39-
router.register_router(self)
40-
41-
42-
def _register_error_handler(self, err: Exception):
43-
if isinstance(err, CustomException):
44-
return json(Response(code=err.code, message=err.message, data=err.data if err.data is not None else {}))
45-
46-
if self.debug or os.getenv("FLASK_DEBUG"):
47-
raise err
48-
else:
49-
return json(Response(code=HttpCode.FAIL, message=str(err), data={}))
15+
def __init__(
16+
self,
17+
*args,
18+
config: Config,
19+
db: SQLAlchemy,
20+
migrate: Migrate,
21+
router: Router,
22+
**kwargs
23+
):
24+
super().__init__(*args, **kwargs)
25+
26+
if config:
27+
self.config.from_object(config)
28+
29+
self.register_error_handler(Exception, self._register_error_handler)
30+
31+
db.init_app(self)
32+
33+
# with self.app_context():
34+
# db.drop_all()
35+
# db.create_all()
36+
37+
migrate.init_app(self, db, directory="internal/migration")
38+
logging_init_app(self)
39+
40+
CORS(
41+
self,
42+
resources={
43+
r"/*": {
44+
"origins": "*",
45+
"supports_credentials": True,
46+
}
47+
},
48+
)
49+
50+
router.register_router(self)
51+
52+
def _register_error_handler(self, err: Exception):
53+
logging.error("An error occurred: %s", err, exc_info=True)
54+
55+
if isinstance(err, CustomException):
56+
return json(
57+
Response(
58+
code=err.code,
59+
message=err.message,
60+
data=err.data if err.data is not None else {},
61+
)
62+
)
63+
64+
if self.debug or os.getenv("FLASK_DEBUG"):
65+
raise err
66+
else:
67+
return json(Response(code=HttpCode.FAIL, message=str(err), data={}))

0 commit comments

Comments
 (0)