NX Lab

Gỡ lỗi bằng log có cấu trúc: module logging ghi ra file, mức DEBUG/INFO/ERROR và xoay vòng file

#Python#Log#Gỡ lỗi1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    In ra Listing Window là cách gỡ lỗi tạm thời. Với công cụ dùng lâu dài cần log thật sự: có mức độ, thời gian, tên module và tự xoay vòng để không đầy ổ đĩa.

    Gỡ lỗi bằng log có cấu trúc Gỡ lỗi bằng log có cấu trúc

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

    1. Cấu hình logging. Một hàm thiết lập dùng chung.
    2. Chọn mức. DEBUG khi gỡ lỗi, INFO khi chạy thường.
    3. Xoay vòng file. RotatingFileHandler giới hạn dung lượng.
    4. Ghi ngoại lệ. logger.exception ghi cả traceback.
    5. Ghi cả ra Listing Window. Handler thứ hai tùy chọn.

    Code tham khảo (Python)

    import logging
    import logging.handlers
    import os
    import NXOpen
    
    class DanhChoListing(logging.Handler):
        """Handler đưa log vào Listing Window của NX."""
        def emit(self, record):
            try:
                lw = NXOpen.Session.GetSession().ListingWindow
                lw.Open()
                lw.WriteLine(self.format(record))
            except Exception:
                pass
    
    def cau_hinh_log(ten="nxlab", thu_muc="D:/NXLab_log", muc=logging.INFO):
        logger = logging.getLogger(ten)
        if logger.handlers:                 # tránh gắn handler lặp khi chạy lại trong cùng phiên
            return logger
        os.makedirs(thu_muc, exist_ok=True)
        logger.setLevel(muc)
        dinh_dang = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s")
        file_log = logging.handlers.RotatingFileHandler(
            os.path.join(thu_muc, ten + ".log"), maxBytes=1000000, backupCount=5, encoding="utf-8")
        file_log.setFormatter(dinh_dang)
        logger.addHandler(file_log)
        man_hinh = DanhChoListing()
        man_hinh.setFormatter(logging.Formatter("[%(levelname)s] %(message)s"))
        logger.addHandler(man_hinh)
        return logger
    
    def main():
        log = cau_hinh_log(muc=logging.DEBUG)
        log.info("Bắt đầu")
        try:
            part = NXOpen.Session.GetSession().Parts.Work
            log.debug("Work Part: %s", part.Leaf if part else None)
            1 / 0                           # lỗi cố ý để xem traceback
        except Exception:
            log.exception("Có lỗi khi xử lý")
        log.info("Kết thúc")
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Kiểm tra logger.handlers rất quan trọng: NX giữ module trong bộ nhớ nên chạy lại script sẽ gắn thêm handler và log bị nhân đôi.
    • RotatingFileHandler giữ tối đa 5 file x 1 MB; file cũ tự bị xoay.
    • log.exception(...) ghi cả traceback, thông tin quý nhất khi người dùng báo lỗi.

    Lỗi thường gặp

    • Một số tính năng Python mới (f-string, gạch dưới trong số) cần phiên bản Python mà bản NX của bạn có thể chưa hỗ trợ; kiểm tra platform.python_version().
    • Đường dẫn log nên cho phép ghi với mọi người dùng; thư mục mạng chỉ đọc làm handler lỗi.

    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.