Revize 5678036c
Přidáno uživatelem David Friesecký před téměř 4 roky(ů)
app.py | ||
---|---|---|
14 | 14 |
handle_generic_exception |
15 | 15 |
from src.exceptions.database_exception import DatabaseException |
16 | 16 |
from src.services.cryptography import CryptographyService, CryptographyException |
17 |
from src.utils import logger |
|
17 | 18 |
from src.utils.logger import Logger |
18 | 19 |
|
19 | 20 |
app = Flask(__name__) |
... | ... | |
126 | 127 |
FlaskInjector(app=application, modules=modules) |
127 | 128 |
|
128 | 129 |
config = injector.get(Configuration) |
129 |
configuration.configure_logging(config)
|
|
130 |
logger.configure_logging(config)
|
|
130 | 131 |
|
131 | 132 |
Logger.info(f"Using configuration file: {config.config_file}") |
132 | 133 |
|
src/config/configuration.py | ||
---|---|---|
2 | 2 |
|
3 | 3 |
import configparser |
4 | 4 |
import logging |
5 |
from logging import handlers |
|
6 | 5 |
|
7 |
from injector import singleton, inject
|
|
6 |
from injector import singleton |
|
8 | 7 |
|
9 |
from src.constants import DEFAULT_CONNECTION_STRING, TEST_DATABASE_FILE, DEFAULT_SERVER_BASE_URL, LOG_NAME, \ |
|
10 |
LOG_DIR, DEFAULT_LOG_LEVEL, LOG_FILENAME |
|
11 |
from src.constants import LOG_FILE_LOCATION, LOG_FORMAT |
|
12 |
from src.utils.logger import Logger |
|
8 |
from src.constants import DEFAULT_CONNECTION_STRING, TEST_DATABASE_FILE, DEFAULT_SERVER_BASE_URL, \ |
|
9 |
DEFAULT_LOG_LEVEL, DEFAULT_ROOT_DIR |
|
13 | 10 |
|
14 | 11 |
DATABASE_SECTION = "Database" |
15 | 12 |
DATABASE_CONNECTION_STRING = "ConnectionString" |
... | ... | |
17 | 14 |
SERVER_SECTION = "Server" |
18 | 15 |
SERVER_BASE_URL = "ServerBaseURL" |
19 | 16 |
SERVER_LOG_LEVEL = "LogLevel" |
17 |
SERVER_ROOT_DIR = "RootDir" |
|
20 | 18 |
|
21 | 19 |
LOG_LEVEL_MAPPING = { |
22 | 20 |
"DEBUG": logging.DEBUG, |
... | ... | |
42 | 40 |
self.connection_string = DEFAULT_CONNECTION_STRING |
43 | 41 |
self.base_server_url = DEFAULT_SERVER_BASE_URL |
44 | 42 |
self.log_level = DEFAULT_LOG_LEVEL |
43 |
self.root_dir = DEFAULT_ROOT_DIR |
|
45 | 44 |
|
46 | 45 |
|
47 | 46 |
def test_configuration(): |
... | ... | |
79 | 78 |
app_configuration.base_server_url = server_config.get(SERVER_BASE_URL, |
80 | 79 |
DEFAULT_SERVER_BASE_URL) |
81 | 80 |
app_configuration.log_level = server_config.get(SERVER_LOG_LEVEL, DEFAULT_LOG_LEVEL) |
81 |
app_configuration.root_dir = server_config.get(SERVER_ROOT_DIR, DEFAULT_ROOT_DIR) |
|
82 | 82 |
|
83 | 83 |
binder.bind(Configuration, to=app_configuration, scope=singleton) |
84 |
|
|
85 |
|
|
86 |
def configure_logging(config: Configuration): |
|
87 |
if not os.path.exists(LOG_DIR): |
|
88 |
os.makedirs(LOG_DIR) |
|
89 |
|
|
90 |
handler = logging.handlers.TimedRotatingFileHandler( |
|
91 |
os.path.join(LOG_DIR, LOG_FILENAME), |
|
92 |
when='H', interval=1) |
|
93 |
formatter = logging.Formatter(LOG_FORMAT) |
|
94 |
handler.setFormatter(formatter) |
|
95 |
|
|
96 |
# set log level based on config file |
|
97 |
app_logger = logging.getLogger(LOG_NAME) |
|
98 |
app_logger.setLevel(LOG_LEVEL_MAPPING.get(config.log_level, logging.DEBUG)) |
|
99 |
|
|
100 |
app_logger.addHandler(handler) |
|
101 |
|
|
102 |
# TODO check is 'valid' |
|
103 |
log = logging.getLogger('werkzeug') |
|
104 |
log.disabled = True |
src/config/connection_provider.py | ||
---|---|---|
5 | 5 |
from injector import Module, provider, singleton |
6 | 6 |
|
7 | 7 |
from src.config.configuration import Configuration |
8 |
from src.constants import DB_DIR |
|
8 |
from src.constants import DB_DIR, TEST_DATABASE_FILE
|
|
9 | 9 |
from src.db.init_queries import DEFAULT_VALUES_SQL, CHECK_SCHEMA_SQL |
10 |
from src.db.setup_database import setup_database
|
|
10 |
from src.utils.file_anchor import FileAnchor
|
|
11 | 11 |
from src.utils.logger import Logger |
12 | 12 |
|
13 | 13 |
|
... | ... | |
28 | 28 |
Logger.debug(f"Creating a database connection [{configuration.connection_string}].") |
29 | 29 |
|
30 | 30 |
try: |
31 |
if not os.path.exists(DB_DIR): |
|
32 |
os.makedirs(DB_DIR) |
|
31 |
if not os.path.exists(FileAnchor(configuration.root_dir, DB_DIR).shortest_relative_path()) and \ |
|
32 |
configuration.connection_string != TEST_DATABASE_FILE: |
|
33 |
os.makedirs(FileAnchor(configuration.root_dir, DB_DIR).shortest_relative_path()) |
|
33 | 34 |
|
34 | 35 |
co = sqlite3.connect(database=configuration.connection_string, check_same_thread=False) |
35 | 36 |
cu = co.cursor() |
src/constants.py | ||
---|---|---|
1 |
from src.utils.file_anchor import FileAnchor |
|
2 |
|
|
1 |
# Database |
|
3 | 2 |
INMEMORY_DATABASE_FILE = ":memory:" |
4 | 3 |
TEST_DATABASE_FILE = INMEMORY_DATABASE_FILE |
5 | 4 |
DB_DIR = "db" |
6 |
DATABASE_FILE = f"{DB_DIR}/database_sqlite.db" |
|
7 |
DATABASE_FILE_LOCATION = FileAnchor("aswi2021jmsd", DATABASE_FILE) |
|
8 | 5 |
DATETIME_FORMAT = "%d.%m.%Y %H:%M:%S" |
9 | 6 |
|
7 |
# Logging |
|
10 | 8 |
LOG_DIR = "logs" |
11 | 9 |
LOG_FILENAME = "application.log" |
12 |
LOG_FILE = f"{LOG_DIR}/{LOG_FILENAME}" |
|
13 |
LOG_FILE_LOCATION = FileAnchor("aswi2021jmsd", LOG_FILE) |
|
14 | 10 |
LOG_FORMAT = "%(levelname)-8s %(asctime)s - %(message)s" |
15 | 11 |
LOG_NAME = "app_logger" |
16 | 12 |
|
... | ... | |
69 | 65 |
DEFAULT_CONNECTION_STRING = "db/database_sqlite.db" |
70 | 66 |
DEFAULT_SERVER_BASE_URL = "http://localhost" |
71 | 67 |
DEFAULT_LOG_LEVEL = "DEBUG" |
68 |
DEFAULT_ROOT_DIR = "aswi2021jmsd" |
|
72 | 69 |
|
73 | 70 |
# available certificate states and revocation reasons |
74 | 71 |
CERTIFICATE_STATES = {"valid", "revoked"} |
src/db/setup_database.py | ||
---|---|---|
1 |
import os |
|
2 |
import sqlite3 |
|
3 |
from pathlib import Path |
|
4 |
|
|
5 |
from src.constants import DATABASE_FILE_LOCATION, DB_DIR |
|
6 |
from src.db.init_queries import SCHEMA_SQL, DEFAULT_VALUES_SQL |
|
7 |
from src.utils.logger import Logger |
|
8 |
|
|
9 |
|
|
10 |
def setup_database(): |
|
11 |
Logger.debug(f"Database is setting.") |
|
12 |
|
|
13 |
try: |
|
14 |
# TODO improve creating DB dir |
|
15 |
if not os.path.exists(DB_DIR): |
|
16 |
os.makedirs("../../" + DB_DIR) |
|
17 |
|
|
18 |
# TODO improve creating DB file (now via FileAnchor) |
|
19 |
co = sqlite3.connect(DATABASE_FILE_LOCATION.shortest_relative_path()) |
|
20 |
cu = co.cursor() |
|
21 |
cu.executescript(SCHEMA_SQL) |
|
22 |
cu.executescript(DEFAULT_VALUES_SQL) |
|
23 |
except sqlite3.Error as e: |
|
24 |
Logger.error(f"Unknown error during database setting.") |
|
25 |
raise e |
|
26 |
|
|
27 |
return co |
|
28 |
|
|
29 |
|
|
30 |
if __name__ == '__main__': |
|
31 |
setup_database() |
src/utils/logger.py | ||
---|---|---|
1 | 1 |
import inspect |
2 | 2 |
import logging |
3 |
from logging import handlers |
|
4 |
import os |
|
3 | 5 |
from pathlib import Path |
4 | 6 |
|
5 |
from src.constants import LOG_NAME |
|
7 |
from src.config.configuration import Configuration, LOG_LEVEL_MAPPING |
|
8 |
from src.constants import LOG_NAME, LOG_DIR, LOG_FILENAME, LOG_FORMAT |
|
9 |
from src.utils.file_anchor import FileAnchor |
|
10 |
|
|
11 |
|
|
12 |
def configure_logging(config: Configuration): |
|
13 |
if not os.path.exists(FileAnchor(config.root_dir, LOG_DIR).shortest_relative_path()): |
|
14 |
os.makedirs(FileAnchor(config.root_dir, LOG_DIR).shortest_relative_path()) |
|
15 |
|
|
16 |
handler = logging.handlers.TimedRotatingFileHandler( |
|
17 |
os.path.join(FileAnchor(config.root_dir, LOG_DIR).shortest_relative_path(), LOG_FILENAME), |
|
18 |
when='H', interval=1) |
|
19 |
formatter = logging.Formatter(LOG_FORMAT) |
|
20 |
handler.setFormatter(formatter) |
|
21 |
|
|
22 |
# set log level based on config file |
|
23 |
app_logger = logging.getLogger(LOG_NAME) |
|
24 |
app_logger.setLevel(LOG_LEVEL_MAPPING.get(config.log_level, logging.DEBUG)) |
|
25 |
|
|
26 |
app_logger.addHandler(handler) |
|
27 |
|
|
28 |
log = logging.getLogger('werkzeug') |
|
29 |
log.disabled = True |
|
6 | 30 |
|
7 | 31 |
|
8 | 32 |
class Logger: |
test_server.cfg | ||
---|---|---|
4 | 4 |
[Server] |
5 | 5 |
ServerBaseURL=http://78.128.250.101 |
6 | 6 |
LogLevel=DEBUG |
7 |
RootDir=app |
Také k dispozici: Unified diff
Re #8880 - Edited config file (inserted RootDir)
- improved creating of logs and db directories