瀏覽代碼

Add encryption function & Optimize the log system

liqudong 3 年之前
父節點
當前提交
9e41082235

+ 80 - 0
AES_crypt.py

@@ -0,0 +1,80 @@
+"""
+@File  : AES_new.py
+@Author: lee
+@Date  : 2022/3/8/0008 9:41:14
+@Desc  :
+"""
+import base64
+
+import wmi
+from Crypto.Cipher import AES
+
+passwd = "123456781234567"
+iv = '1234567812345678'
+
+
+class AESCrypt:
+    def __init__(self, key, model, iv):
+        self.key = self.add_16(key)
+        self.model = model
+        self.iv = self.add_16(iv)
+
+    def add_16(self, par):
+        if type(par) == str:
+            par = par.encode()
+        while len(par) % 16 != 0:
+            par += b'\x00'
+        return par
+
+    def aesencrypt(self, text):
+        text = self.add_16(text)
+        if self.model == AES.MODE_CBC:
+            aes = AES.new(self.key, self.model, self.iv)
+        elif self.model == AES.MODE_ECB:
+            aes = AES.new(self.key, self.model)
+        encrypt_text = aes.encrypt(text)
+        return base64.encodebytes(encrypt_text).decode('utf8')
+
+    def aesdecrypt(self, text):
+        if self.model == AES.MODE_CBC:
+            aes = AES.new(self.key, self.model, self.iv)
+        elif self.model == AES.MODE_ECB:
+            aes = AES.new(self.key, self.model)
+        try:
+            decrypt_text = text.encode('utf8')
+            decrypt_text = base64.decodebytes(decrypt_text)
+            decrypt_text = aes.decrypt(decrypt_text)
+            decrypt_text = decrypt_text.strip(b"\x00")
+            return decrypt_text.decode('utf8')
+        except Exception as e:
+            print(e)
+            return None
+
+
+def get_cpu_code():
+    try:
+        c = wmi.WMI()
+        for cpu in c.Win32_Processor():
+            cpu_code = cpu.ProcessorId.strip()
+        return cpu_code
+    except Exception as e:
+        return None
+
+
+def decrypt(text):
+    aes_cryptor = AESCrypt(passwd, AES.MODE_CBC, iv)  # CBC模式
+    return aes_cryptor.aesdecrypt(text)
+
+
+if __name__ == '__main__':
+    activation_verify('B3VLrUgeo8+Xp/+ouVTlQ==\n')
+    # passwd = "123456781234567"
+    # iv = '1234567812345678'
+    #
+    # aescryptor = AESCrypt(passwd, AES.MODE_CBC, iv)  # CBC模式
+    # # aescryptor = Aescrypt(passwd,AES.MODE_ECB,"") # ECB模式
+    # text = "123456"
+    # en_text = aescryptor.aesencrypt(text)
+    # print("密文:", en_text)
+    # text = aescryptor.aesdecrypt(en_text)
+    # print("明文:", text)

+ 4 - 4
alarm.py

@@ -2,7 +2,7 @@
 @Date  :2021/5/21/00219:10:57
 @Desc  :
 """
-import logging
+from sanic.log import logger
 import threading
 import time
 from event_storage import EventStorage
@@ -52,7 +52,7 @@ class Alarm(threading.Thread):
 
     # 越限报警
     def overrun_alarm(self):
-        logging.info('Over run alarm module is running!')
+        logger.info('Over run alarm module is running!')
         try:
             point_info = self.get_point_table()
             while 1:
@@ -77,14 +77,14 @@ class Alarm(threading.Thread):
                                 continue
                 time.sleep(1)
         except Exception as e:
-            logging.error(e)
+            logger.error(e)
 
     def overrun_alarm_storage(self, table_name, save_time, item):
         pass
 
     # 变位报警
     def displacement_alarm(self):
-        logging.info('[displacement_alarm] - Displacement alarm module is running!')
+        logger.info('[displacement_alarm] - Displacement alarm module is running!')
         point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
 
         keys_list = []

+ 3 - 3
config.json

@@ -1,13 +1,13 @@
 {
   "hardDiskdataBase": {
     "ip": "127.0.0.1",
-    "username": "root",
-    "password": "pass",
+    "username": "zz",
+    "password": "5BFkezzPY1C0/2/y2pMrag==\n",
     "dataBaseName": "shucai"
   },
   "memoryDatabase": {
     "ip": "127.0.0.1",
     "port": 6379
   },
-  "code": "18srfpUIeKFw+z/itQkUHbbi5nEh+4iF"
+  "activation_code": "gB3VLrUgeo8+Xp/+ouVTlQ==\n"
 }

+ 5 - 17
configuration.py

@@ -1,20 +1,7 @@
 import json
-import logging
-import os
+from sanic.log import error_logger
 import sys
-import base64
-
-import pyDes
-
-
-def DesEncrypt(string):
-    Des_Key = "u357asdu"  # Key
-    Des_IV = "u357asdu"  # 自定IV向量
-    string = base64.b64decode(string)
-    k = pyDes.des(Des_Key, pyDes.CBC, Des_IV, pad=None,
-                  padmode=pyDes.PAD_PKCS5)
-    decryptStr = k.decrypt(string)
-    return decryptStr
+from AES_crypt import decrypt
 
 
 class Configuration:
@@ -26,10 +13,11 @@ class Configuration:
         try:
             with open(self.path) as json_file:
                 config = json.load(json_file)
+                config['hardDiskdataBase']['password'] = decrypt(config['hardDiskdataBase']['password'])
             return config
         except FileNotFoundError as e:
-            logging.error("find config file failed:", e)
-            return None
+            error_logger.error(f"config file does not exist:{e}")
+            sys.exit()
         # 解密密码和序列号
         # config['hardDiskdataBase']['password'] = DesEncrypt(
         #     config['hardDiskdataBase']['password']).decode('utf-8')

+ 9 - 9
connectors/shuizhi_tcp_connector.py

@@ -9,7 +9,7 @@ import struct
 import socket
 from connector import Connector
 from event_storage import EventStorage
-import logging
+from sanic.log import logger
 from binascii import *
 from crcmod import *
 
@@ -48,10 +48,10 @@ class ShuizhiTcpConnector(Connector, threading.Thread):
         self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)  # 在客户端开启心跳维护
         try:
             self.__sock.connect((self.__ip, self.__port))
-            logging.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
+            logger.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
             self.__connected = True
         except socket.error as e:
-            logging.error(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!!')
+            logger.error(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!!')
             self.__connected = False
             self.__reconnect()
 
@@ -63,10 +63,10 @@ class ShuizhiTcpConnector(Connector, threading.Thread):
                 self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)  # 在客户端开启心跳维护
                 self.__sock.connect((self.__ip, self.__port))
                 self.__connected = True
-                logging.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
+                logger.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
                 break
             except Exception as e:
-                logging.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!! Continue reconnect in 5s..')
+                logger.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!! Continue reconnect in 5s..')
                 self.__connected = False
                 time.sleep(5)
 
@@ -162,22 +162,22 @@ class ShuizhiTcpConnector(Connector, threading.Thread):
             try:
                 recvData = clientSocket.recv(1024)
             except Exception as e:
-                logging.debug(f"Socket receive error:{e}")
+                logger.debug(f"Socket receive error:{e}")
                 break
             length = len(recvData)
             if length == 15:
                 fmt = str(length) + 'B'
                 res = struct.unpack(fmt, recvData)
                 t = int_to_hex(res[3], res[4], res[5], res[6])
-                logging.debug(time.strftime('%Y-%m-%d %H:%M:%S'), self._param_id[res[12]], "   t=", t)
+                logger.debug(time.strftime('%Y-%m-%d %H:%M:%S'), self._param_id[res[12]], "   t=", t)
                 self.save_format_data(t, self._param_id[res[12]])
                 if sendFlag == self._len_param - 1:
-                    logging.debug("-------------------")
+                    logger.debug("-------------------")
                     sendFlag = 0
                 else:
                     sendFlag = sendFlag + 1
         clientSocket.close()
-        logging.info("Client closed.")
+        logger.info("Client closed.")
 
 
 def int_to_hex(a1, a2, b1, b2):

+ 7 - 7
connectors/tcp_connector.py

@@ -7,7 +7,7 @@ import threading
 import struct
 import socket
 import queue
-import logging
+from sanic.log import logger
 from connector import Connector
 from event_storage import EventStorage
 
@@ -52,10 +52,10 @@ class TcpConnector(Connector, threading.Thread):
         self.__sock.settimeout(10)  # 设置超时时间3mins
         try:
             self.__sock.connect((self.__ip, self.__port))
-            logging.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
+            logger.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
             self.__connected = True
         except Exception as e:
-            logging.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!!')
+            logger.info(f'Connect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!!')
             self.__connected = False
             self.__reconnect()
 
@@ -70,10 +70,10 @@ class TcpConnector(Connector, threading.Thread):
                 self.__sock.settimeout(10)  # 设置超时时间3mins
                 self.__sock.connect((self.__ip, self.__port))
                 self.__connected = True
-                logging.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
+                logger.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] success !')
                 break
             except Exception as e:
-                logging.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!! Continue reconnect in 5s..')
+                logger.info(f'Reconnect to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] failed:{e} !!! Continue reconnect in 5s..')
                 self.__connected = False
                 time.sleep(5)
 
@@ -96,7 +96,7 @@ class TcpConnector(Connector, threading.Thread):
             try:
                 self.__sock.send(data.encode(encoding='utf-8'))
             except Exception as e:
-                logging.info(f'Send command to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] error:{e}')
+                logger.info(f'Send command to [{self.get_name()}]:[{self.__ip}]:[{self.__port}] error:{e}')
 
     def command_polling(self):
         if self.__connected:
@@ -110,7 +110,7 @@ class TcpConnector(Connector, threading.Thread):
                     if data != "error" and data != 'pass':
                         self.__storager.real_time_data_storage(data)
             except Exception as e:
-                logging.error(f'Other error occur [{self.get_name()}]:[{self.__ip}]:[{self.__port}]:{e}')
+                logger.error(f'Other error occur [{self.get_name()}]:[{self.__ip}]:[{self.__port}]:{e}')
                 time.sleep(5)
                 self.__reconnect()
         else:

+ 8 - 8
converters/adcp_converter.py

@@ -2,7 +2,7 @@
 @Date  :2021/5/21/00219:10:57
 @Desc  :
 """
-import logging
+from sanic.log import logger
 from converter import Converter
 
 
@@ -12,14 +12,14 @@ from converter import Converter
 class AdcpConverter(Converter):
     def convert(self, config, data):
         if data:
-            # logging.debug(config)
-            # logging.debug(data)
+            logger.debug(config)
+            logger.debug(data)
             dict = {}
             try:
                 raw_data = data.decode().split("\r\n")
-                # logging.debug(len(raw_data))
+                # logger.debug(len(raw_data))
                 if len(raw_data) == 32:
-                    # logging.debug(raw_data)
+                    # logger.debug(raw_data)
                     raw_data = raw_data[1:-1]
                     flow_rate_data = []
                     flow_direction = []
@@ -30,9 +30,9 @@ class AdcpConverter(Converter):
                         flow_rate_data.append(t1[1] / 1000)  # 流速值除以1000
                         flow_direction.append(t1[2] / 10)  # 流向值除以10
                     format_data = flow_rate_data + flow_direction
-                    # logging.debug(format_data)
+                    logger.debug(format_data)
                     j = 0
-                    # logging.debug(len(config), len(format_data))
+                    logger.debug(len(config), len(format_data))
                     for index in config:
                         name = 'c' + str(index['serial_number'])
                         if index['divisor'] is not None:
@@ -47,5 +47,5 @@ class AdcpConverter(Converter):
                 else:
                     return "error"
             except Exception as e:
-                logging.debug(e)
+                logger.debug(e)
                 return "error"

+ 6 - 6
converters/nmea0183_converter.py

@@ -2,7 +2,7 @@
 @Date  :2021/5/21/00219:10:57
 @Desc  :
 """
-import logging
+from sanic.log import logger
 import binascii
 
 from converter import Converter
@@ -63,13 +63,13 @@ class NEMA0183Converter(Converter):
         data = data.split('*')
         # Splits up the NMEA data by comma
         data = data[0].split(',')
-        # logging.debug('len:', len(data), 'data:', data)
+        logger.debug('len:', len(data), 'data:', data)
         if data[0] == '$PMIRWM':
             for index in config:
                 name = 'c' + str(index['serial_number'])
                 i = int(index['address'])
                 dict[name] = data[i]
-            # logging.debug(dict)
+            logger.debug(dict)
             return dict
 
         # return data[0]
@@ -89,11 +89,11 @@ data = "$PMIRR,20210325,033351.719,0.000,0.000,V,0.00*0F"
 data2 = data.split('*')
 data2 = data2[0].split(',')
 
-logging.debug(data2[0][3:6])
+logger.debug(data2[0][3:6])
 
 c = NEMA0183Converter(None)
 d = c.checksum(data)  
-logging.debug(d)
+logger.debug(d)
 
-logging.debug(c.nmea2utc(data2[1]))
+logger.debug(c.nmea2utc(data2[1]))
 '''

+ 6 - 6
converters/td266_converter.py

@@ -1,6 +1,6 @@
 import json
 import re
-import logging
+from sanic.log import logger
 
 from converter import Converter
 
@@ -11,7 +11,7 @@ class TD266Converter(Converter):
         # 去除结尾\r\n: data = b'4420\t1194\t29.823\t104.507\t-7.471\t28.872\t253.153\t9.369\t1.816\t91.491\t-59.593\t100\t9.542\t9.589\t0.015'
         # decode('utf-8'): data = 4420	1194	29.823	104.507	-7.471	28.872	253.153	9.369	1.816	91.491	-59.593	100	9.542	9.589	0.015
         # split('\t'): data = ['4420', '1194', '29.823', '104.507', '-7.471', '28.872', '253.153', '9.369', '1.816', '91.491', '-59.593', '100', '9.542', '9.589', '0.015']
-        # logging.debug(len(data), time.strftime('%Y-%m-%d %H:%M:%S'), data)
+        # logger.debug(len(data), time.strftime('%Y-%m-%d %H:%M:%S'), data)
         pattern_start = b"4420"
         # pattern_end = b"\r\n"
         index_start = re.search(pattern_start, data)  # 查找字符串得到开始索引
@@ -21,9 +21,9 @@ class TD266Converter(Converter):
             index_start = index_start.span()[0]
             # index_end = index_end.span()[1]
             data = data[index_start:75]  # 只获取流速和流向,大约取25个字符即可
-            # logging.debug(data)
+            logger.debug(data)
             data = data.decode('utf-8').split('\t')
-            # logging.debug(data)
+            logger.debug(data)
             dict = {}
             try:
                 for index in config:
@@ -33,10 +33,10 @@ class TD266Converter(Converter):
                         dict[name] = float(data[i])
                     else:
                         dict[name] = round((float(data[i]) / index['divisor']), 2)
-                # logging.debug(dict)
+                logger.debug(dict)
                 return dict
             except Exception as e:
-                logging.debug(e)
+                logger.error(e)
                 return "error"
         else:
             return 'pass'

+ 2 - 2
converters/wxt536_converter.py

@@ -1,4 +1,4 @@
-import logging
+from sanic.log import logger
 import re
 from converter import Converter
 
@@ -32,5 +32,5 @@ class WXT536Converter(Converter):
                 else:
                     return "error"
             except Exception as e:
-                logging.debug(e)
+                logger.error(e)
                 return "error"

+ 18 - 27
gateway.py

@@ -2,7 +2,9 @@ import asyncio
 import datetime
 import sys
 import time
-import logging
+import logging.config
+
+import wmi
 from sanic import Sanic
 from sanic_cors import CORS, cross_origin
 from sanic import response
@@ -15,26 +17,14 @@ from alarm import Alarm
 from historical_data_storage import HistoricalDataStorage
 from hard_disk_storage import HardDiskStorage
 from api_context import ApiContext
+from AES_crypt import decrypt
+from sanic.log import logger
+from my_log_config import MY_LOGGING_CONFIG
 
-logging.basicConfig(level=logging.DEBUG,
-                    format='[%(asctime)s] - thread:%(thread)d - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s ',
-                    datefmt='%Y-%m-%d %H:%M:%S',
-                    # filename='gateway.log',  # 调式程序时注释掉本行
-                    )
-
-app = Sanic(__name__)
+app = Sanic(__name__, log_config=MY_LOGGING_CONFIG)
 CORS(app)
 
 
-# config = {"ip": "127.0.0.1",
-#           "username": "root",
-#           "password": "root",
-#           "dataBaseName": "shucai"}
-# handler = HardDiskStorage(config=config, port=3306, charset='utf8')
-# res = handler.get_connectors()
-# print(res)
-
-
 @app.route('/readReal', methods=['POST'])
 async def read_point_data(request):
     list = request.json['pointList']
@@ -132,9 +122,7 @@ async def read_statistics_data(request):
 #     config = config_handle.get_system_config()
 #     cpu_code_from_config_file = config['code']
 #     # 获取当前设备CPU序列号
-#     c = wmi.WMI()
-#     for cpu in c.Win32_Processor():
-#         cpu_code = cpu.ProcessorId.strip()
+#
 #
 #     # 判断是否匹配
 #     if cpu_code == cpu_code_from_config_file:
@@ -143,12 +131,16 @@ async def read_statistics_data(request):
 #         return False
 
 
-# @app.post('/verify')
-# def verify_app(request):
-#     if is_active:
-#         return response.json({'status': 'yes'})
-#     else:
-#         return response.json({'status': 'no'})
+@app.post('/verify')
+def verify_app(request):
+    config = Configuration().get_config()
+    for cpu in wmi.WMI().Win32_Processor():
+        cpu_code = cpu.ProcessorId.strip()
+    de_cpu_code = decrypt(config['activation_code'])
+    if cpu_code == de_cpu_code:
+        return response.json({'status': 'yes'})
+    else:
+        return response.json({'status': 'no'})
 
 
 # def overrun_alarm(alarms):
@@ -180,7 +172,6 @@ async def notify_server_started_after_five_seconds():
 
 
 if __name__ == "__main__":
-    system_config = Configuration().get_config()
     gateway_storage = EventStorage()
     connector_config = gateway_storage.get_connector_config()
     Utility.start_connectors(connector_config)

+ 4 - 5
hard_disk_storage.py

@@ -1,7 +1,5 @@
 import datetime
-import json
 import logging
-
 import openpyxl
 import pymysql
 import traceback
@@ -17,15 +15,16 @@ class HardDiskStorage:
         self.port = port
         self.charset = charset
         self.conn = None
-        if not self._conn(): self._reConn()
+        self.logger = logging.getLogger()
+        if not self._conn():
+            self._reConn()
 
     def _conn(self):
         try:
             self.conn = pymysql.connect(host=self.host, user=self.user, password=self.passwd, database=self.db, port=self.port, autocommit=True)
-            logging.debug(f'success to connect to {self.host}:{self.port}:{self.db} by [{self.user}:{self.passwd}]')
             return True
         except Exception as e:
-            logging.error(f'failed to connect to {self.host}:{self.port}:{self.db} by [{self.user}:{self.passwd}]:{e}')
+            self.logger.error(f'failed to connect to {self.host}:{self.port}:{self.db} by [{self.user}:{self.passwd}]:{e}')
             return False
 
     def _reConn(self, num=28800, stime=3):  # 重试连接总次数为1天,这里根据实际情况自己设置,如果服务器宕机1天都没发现就......

+ 5 - 7
historical_data_storage.py

@@ -2,7 +2,7 @@ import json
 import threading
 from event_storage import EventStorage
 import time
-import logging
+from sanic.log import logger
 
 
 class HistoricalDataStorage(threading.Thread):
@@ -12,7 +12,7 @@ class HistoricalDataStorage(threading.Thread):
 
     # 历史存储主函数
     def run(self):
-        logging.info('Historical data storage module is running!')
+        logger.info('Historical data storage module is running!')
         station_info = self._storage.hardDiskStorage.get_connectors()  # 获取所有站点信息
 
         all_devices = []
@@ -20,15 +20,13 @@ class HistoricalDataStorage(threading.Thread):
             station_name = item['station_name']  # 站点名称
             connector_config = json.loads(item['connector_config'])  # 加载json格式connector_config参数
             save_frequency = connector_config['save_frequency']  # 获取存储频率
-            devices_each_station = self._storage.hardDiskStorage.get_device_name_by_station_name(
-                station_name)  # 根据站点名称获取设备列表
+            devices_each_station = self._storage.hardDiskStorage.get_device_name_by_station_name(station_name)  # 根据站点名称获取设备列表
 
             for i in devices_each_station:
                 temp_dict = {}
                 # 获取每个设备所有点的serial_number,转换为键列表
                 device_name = i['device_name']
-                data_point_each_decive = self._storage.hardDiskStorage.get_data_point_by_device_name(
-                    device_name)  # 根据设备名称获取设备点表
+                data_point_each_decive = self._storage.hardDiskStorage.get_data_point_by_device_name(device_name)  # 根据设备名称获取设备点表
 
                 serial_number_list = []
                 for item in data_point_each_decive:
@@ -67,7 +65,7 @@ class HistoricalDataStorage(threading.Thread):
                             if real_time_data[key] == '':  # redis存储的为空值
                                 real_time_data[key] = 'null'
                         table_name = "table_" + str(item['device_name'])  # 根据站名计算表名
-                        logging.debug(repr(table_name) + '<-' + repr(real_time_data))
+                        logger.debug(f"{table_name} <- {real_time_data}")
                         self._storage.hardDiskStorage.insert_column_many(table_name, save_time, real_time_data)
 
 

+ 66 - 0
my_log_config.py

@@ -0,0 +1,66 @@
+import sys
+
+MY_LOGGING_CONFIG = dict(
+    version=1,
+    disable_existing_loggers=False,
+    loggers={
+        "sanic.root": {
+            "level": "INFO",
+            "handlers": ["console"]
+        },
+        "sanic.error": {
+            "level": "INFO",
+            "handlers": ["error_console"],
+            "propagate": True,
+            "qualname": "sanic.error",
+        },
+        "sanic.access": {
+            "level": "INFO",
+            "handlers": ["access_console"],
+            "propagate": True,
+            "qualname": "sanic.access",
+        },
+    },
+    handlers={
+        "console": {
+            "class": "logging.StreamHandler",
+            "formatter": "generic",
+            "stream": sys.stdout,
+        },
+        "error_console": {
+            "class": "logging.StreamHandler",
+            "formatter": "generic",
+            "stream": sys.stderr,
+        },
+        "access_console": {
+            "class": "logging.StreamHandler",
+            "formatter": "access",
+            "stream": sys.stdout,
+        },
+        "file": {
+            "class": "logging.handlers.RotatingFileHandler",
+            "formatter": "myFormatter",
+            "filename": "gateway.log",
+            "maxBytes": 1024 * 1024,
+            "backupCount": 5,
+        },
+    },
+    formatters={
+        "generic": {
+            "format": "[%(asctime)s] -[%(threadName)s:%(thread)d] - %(filename)s[line:%(lineno)d][%(processName)s:%(process)d] [%(levelname)s] %(message)s",
+            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
+            "class": "logging.Formatter",
+        },
+        "access": {
+            "format": "%(asctime)s - (%(name)s)[%(levelname)s][%(host)s]: "
+                      + "%(request)s %(message)s %(status)d %(byte)d",
+            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
+            "class": "logging.Formatter",
+        },
+        "myFormatter": {
+            "format": "[%(asctime)s] -[%(threadName)s:%(thread)d] - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s",
+            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
+            "class": "logging.Formatter",
+        },
+    },
+)