NX Lab

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

  1. 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à… Ghi nhật ký hoạt động dạng JSON Lines và…

    Các bước thực hiện

    1. Ghi mỗi sự kiện một dòng. json.dumps rồi thêm xuống dòng.
    2. Chuẩn hóa trường. thoi_gian, muc, script, thong_diep, du_lieu.
    3. Đọc lại. Từng dòng, bỏ qua dòng hỏng.
    4. Thống kê. Đếm theo mức và theo script.
    5. 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_lieu cho 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_kien là 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.