102 lines
3.0 KiB
Python
102 lines
3.0 KiB
Python
import json
|
|
from pathlib import Path
|
|
import sqlite3
|
|
import threading
|
|
import time
|
|
import atexit
|
|
|
|
|
|
def init_logdb():
|
|
conn = sqlite3.connect(":memory:", isolation_level=None, check_same_thread=False, cached_statements=2048)
|
|
cursor = conn.cursor()
|
|
cursor.execute("PRAGMA journal_mode=wal")
|
|
cursor.execute("PRAGMA wal_checkpoint=TRUNCATE")
|
|
cursor.execute("PRAGMA synchronous=normal")
|
|
cursor.execute("PRAGMA temp_store=memory")
|
|
cursor.execute("PRAGMA mmap_size=30000000000")
|
|
cursor.execute("PRAGMA cache_size=200000")
|
|
cursor.execute(
|
|
"""
|
|
create table if not exists logs(
|
|
id integer primary key autoincrement,
|
|
timestamp DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')),
|
|
level text,
|
|
module text,
|
|
content text
|
|
)
|
|
"""
|
|
)
|
|
return conn, cursor
|
|
|
|
|
|
def db_lock(func):
|
|
def wrapper(*args, **kwargs):
|
|
try:
|
|
lock.acquire(True)
|
|
ret = func(*args, **kwargs)
|
|
finally:
|
|
lock.release()
|
|
return ret
|
|
return wrapper
|
|
|
|
|
|
def detect_db_size():
|
|
@db_lock
|
|
def release_memory():
|
|
line_number = 20000
|
|
leftover = 4000 # 200s
|
|
cursor.execute("SELECT COUNT(id) FROM logs")
|
|
len_records = cursor.fetchone()[0]
|
|
if len_records > line_number:
|
|
del_num = len_records - leftover + 1
|
|
cursor.execute(f"DELETE FROM logs WHERE id < {del_num}")
|
|
cursor.execute(f"UPDATE logs SET id=(id-{del_num - 1}) WHERE id > {del_num - 1}")
|
|
cursor.execute(f"UPDATE sqlite_sequence SET seq = {leftover + 1} WHERE name = 'logs' ")
|
|
cursor.execute("VACUUM")
|
|
|
|
while True:
|
|
release_memory()
|
|
time.sleep(interval*30)
|
|
|
|
|
|
@db_lock
|
|
def to_logdb(level="", module="", content=""):
|
|
if "move.monitor" in content:
|
|
return
|
|
cursor.execute(f"INSERT INTO logs (level, module, content) VALUES (?, ?, ?)", (level.upper(), module, content))
|
|
|
|
|
|
def save_logdb():
|
|
db_file = str(Path.home()) + "\\Downloads\\aio.db"
|
|
disk_db = sqlite3.connect(db_file)
|
|
conn.backup(disk_db)
|
|
disk_db.close()
|
|
conn.close()
|
|
|
|
|
|
# ===========================================================================
|
|
base_path = Path(__file__).parent.parent
|
|
with open(f"{base_path}/assets/confs/configs.json", mode="r", encoding="utf-8") as f_cfg:
|
|
cfg = json.load(f_cfg)
|
|
ip_addr = cfg["ip_addr"]
|
|
ssh_port = cfg["ssh_port"]
|
|
socket_port = cfg["socket_port"]
|
|
xService_port = cfg["xService_port"]
|
|
external_port = cfg["external_port"]
|
|
modbus_port = cfg["modbus_port"]
|
|
upgrade_port = cfg["upgrade_port"]
|
|
interval = cfg["interval"]
|
|
max_frame_size = cfg["max_frame_size"]
|
|
MAX_RECEIVED_SIZE = cfg["MAX_RECEIVED_SIZE"]
|
|
suffix = cfg["suffix"]
|
|
username = cfg["username"]
|
|
password = cfg["password"]
|
|
retry_time = cfg["retry_time"]
|
|
|
|
lock = threading.Lock()
|
|
conn, cursor = init_logdb()
|
|
atexit.register(save_logdb)
|
|
t = threading.Thread(target=detect_db_size)
|
|
t.daemon = True
|
|
t.start()
|