Ghi nhật ký Python - thông điệp nhật ký bộ lọc cho tất cả các loggers


8

Tôi có một dự án nơi các công cụ cơ bản đang ghi nhật ký và tôi cũng đang đăng nhập (với các phiên bản logger khác nhau).

Tuy nhiên, đôi khi trình ghi nhật ký tôi không có quyền truy cập để lộ thông tin mà tôi muốn loại bỏ khỏi nhật ký (hoặc thay thế bằng trình giữ chỗ).

Có cách nào tôi có thể sử dụng bộ lọc để làm điều đó cho tất cả các logger python trong một dự án không?

Đây là cấu hình đăng nhập của tôi trong Django:

LOGGING_CONFIG = None
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "my_formatter",
        },
    },
    "loggers": {
        "my_logger": {
            "handlers": ["console"],
            "level": "DEBUG"
        },
    },
}

logging.config.dictConfig(LOGGING)

Thực sự, mục tiêu cuối cùng của tôi chỉ là ngăn những thứ nhất định xuất hiện trong nhật ký bằng cách thay thế chúng - nếu có cách nào khác để làm điều đó, hãy thoải mái chia sẻ nó.

Cảm ơn!


Làm thế nào để bạn khởi tạo / cấu hình đăng nhập của bạn?
Klaus D.

Tôi cập nhật câu hỏi.
OhMad

Vì vậy, câu hỏi của bạn là "làm thế nào để lọc sự kiện đăng nhập", phải không?
pbacterio

Câu trả lời:


3

Nếu mục tiêu chính của bạn là lọc dữ liệu nhạy cảm, hãy đọc Ẩn dữ liệu nhạy cảm từ Nhật ký bằng Python . Bạn có thể thực hiện logging.Filterđể ngăn chặn việc ghi nhật ký một số hồ sơ hoặc thực hiện loggingFormatterđể chỉ cắt giảm các phần của hồ sơ cụ thể với biểu thức chính quy.

Để áp dụng các lớp bộ lọc và trình định dạng cho tất cả các trình ghi nhật ký, hãy xác định chúng trong cấu hình dict và thêm vào tất cả các trình xử lý mà bạn có. Ngoài ra, hãy xem xét loại bỏ bất kỳ trình xử lý không được mô tả bằng cách cài đặt disable_existing_loggers': True. Xem ví dụ về trình định dạng và bộ lọc tùy chỉnh trong tài liệu ghi nhật ký Django .


2

Dù bạn có tin hay không, bạn vẫn có quyền truy cập vào các logger của các dự án cơ bản đó! Vì bạn đang ở trong django, các cài đặt của bạn có thể được tải và ghi nhật ký có thể được khởi tạo, trước khi các logger của các dự án cơ bản được khởi tạo.

Đây là một quy trình gồm hai bước. Bước đầu tiên là xác định logger là nguồn gốc của thông điệp bạn muốn loại bỏ. Để làm điều này, thêm namevào my_formatter:

    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] [%(name)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },

Khi chúng tôi đã tìm thấy tên, chúng tôi có thể xác định bộ lọc của mình.

import logging


class AwesomeFilter(logging.Filter):
    def filter(self, rec):
        if 'sensitive' in rec.msg:
            return 0
        # you may need to filter based on `getMessage()` if
        # you can't find the information in the pre-formatted msg field
        return 1

Và bây giờ vì bạn biết tên của logger đang tạo ra thông báo xấu, chúng ta có thể đính kèm AwesomeFiltervào logger:

LOGGING_CONFIG = None
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] [%(name)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "my_formatter",
        },
    },
    "loggers": {
        "my_logger": {
            "handlers": ["console"],
            "level": "DEBUG"
        },
        "name_of_logger_producing_bad_messages": {
            "filters": [ "app.filters.AwesomeFilter", ],
        },
    },
}

logging.config.dictConfig(LOGGING)

Chúng tôi sử dụng thủ thuật tìm tên của trình ghi nhật ký để kiểm soát đầu ra của việc ghi nhật ký cho các thư viện bên thứ ba khá thường xuyên. Chúc may mắn!


1

Nếu bạn muốn tuyên truyền cùng một cấu hình ghi nhật ký cho tất cả các nhân viên trong dự án của bạn, tôi khuyên bạn nên tạo một tệp logger trong các tiện ích của bạn và sau đó nhập nó ở mọi nơi để sử dụng nó thay vì import logging

Nếu bạn muốn đảm bảo cấu hình của bạn không xung đột với các trình xử lý khác, bạn có thể làm như sau

tập tin utils / log.py

import logging
import os

root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)]
LOGGING_CONFIG=[your config]
logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger()

Sau đó, chỉ cần nhập logger này trong tất cả các công nhân của bạn thay vì thư viện đăng nhập

from utils.log import logger

logger.info("Hello world")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.