
Ghi nhật ký hoạt động dạng JSON Lines và phân tích: định dạng dễ máy đọc, dễ lọc bằng công cụ
#Python#Log#JSON1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Log văn bản tự do khó thống kê. JSON Lines (mỗi dòng một đối tượng JSON) vừa dễ ghi nối, vừa phân tích được bằng vài dòng Python hoặc công cụ khác. Bài này ghi và đọc lại để thống kê.
Ghi nhật ký hoạt động dạng JSON Lines và…Các bước thực hiện
- Ghi mỗi sự kiện một dòng. json.dumps rồi thêm xuống dòng.
- Chuẩn hóa trường. thoi_gian, muc, script, thong_diep, du_lieu.
- Đọc lại. Từng dòng, bỏ qua dòng hỏng.
- Thống kê. Đếm theo mức và theo script.
- Lọc. Theo khoảng thời gian hoặc theo mức.
Code tham khảo (Python)
import collections import getpass import json import os import time FILE = "D:/NXLab_log/su_kien.jsonl" def ghi_su_kien(muc, script, thong_diep, **du_lieu): os.makedirs(os.path.dirname(FILE), exist_ok=True) ban_ghi = {"thoi_gian": time.strftime("%Y-%m-%dT%H:%M:%S"), "nguoi_dung": getpass.getuser(), "muc": muc, "script": script, "thong_diep": thong_diep, "du_lieu": du_lieu} with open(FILE, "a", encoding="utf-8") as f: f.write(json.dumps(ban_ghi, ensure_ascii=False) + "\n") def doc_su_kien(duong_dan=FILE): if not os.path.isfile(duong_dan): return with open(duong_dan, "r", encoding="utf-8") as f: for dong in f: dong = dong.strip() if not dong: continue try: yield json.loads(dong) except json.JSONDecodeError: continue # dòng hỏng (ghi dở) thì bỏ qua def thong_ke(): theo_muc, theo_script_loi = collections.Counter(), collections.Counter() for b in doc_su_kien(): theo_muc[b["muc"]] += 1 if b["muc"] == "LOI": theo_script_loi[b["script"]] += 1 return theo_muc, theo_script_loi def main(): ghi_su_kien("INFO", "xuat_step", "Bắt đầu xuất", so_file=120) ghi_su_kien("LOI", "xuat_step", "Không xuất được", file="a.prt", ly_do="file bị khóa") ghi_su_kien("INFO", "xuat_step", "Hoàn tất", thanh_cong=119, loi=1) theo_muc, loi = thong_ke() print("Theo mức:", dict(theo_muc)) print("Script lỗi nhiều nhất:", loi.most_common(3)) if __name__ == "__main__": main()Giải thích code
- Mỗi dòng là một JSON độc lập nên ghi nối đơn giản và hỏng một dòng không hỏng cả file.
**du_lieucho phép gắn thêm trường tùy ý vào mỗi sự kiện mà không đổi khung.- Hàm
doc_su_kienlà generator, xử lý được file rất lớn mà không đọc hết vào bộ nhớ.
Lỗi thường gặp
- Nhiều tiến trình ghi cùng file có thể trộn lẫn dòng; mỗi tiến trình nên ghi file riêng nếu chạy song song.
- Không ghi nội dung nhạy cảm vào trường
du_lieu.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.