ฉันต้องการใช้dictConfigแต่เอกสารประกอบเป็นนามธรรมเล็กน้อย ฉันจะหาตัวอย่างที่เป็นรูปธรรมสำเนา + วางของพจนานุกรมที่ใช้กับได้dictConfig
ที่ไหน
ฉันต้องการใช้dictConfigแต่เอกสารประกอบเป็นนามธรรมเล็กน้อย ฉันจะหาตัวอย่างที่เป็นรูปธรรมสำเนา + วางของพจนานุกรมที่ใช้กับได้dictConfig
ที่ไหน
คำตอบ:
มาที่นี่ได้ยังไง!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
การใช้งาน:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
ในกรณีที่คุณเห็นบันทึกจากแพ็คเกจของบุคคลที่สามมากเกินไปอย่าลืมเรียกใช้การกำหนดค่านี้โดยใช้logging.config.dictConfig(LOGGING_CONFIG)
ก่อนที่จะนำเข้าแพ็กเกจของ บริษัท อื่น
อ้างอิง: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
'disable_existing_loggers': False
เพราะคุณอาจจะไม่ได้กำหนดค่ามันทั้งผืน แต่อาจจะนำบางอย่างที่มีอยู่แล้วกลับมาใช้ใหม่ .. ถ้าคุณตั้งค่าเป็นTrue
แล้วฉันก็ดูเหมือนจะไม่ได้รับผลลัพธ์ใด ๆ
format
จากformatters
?
คำตอบที่ยอมรับนั้นดี! แต่ถ้าใครสามารถเริ่มต้นด้วยสิ่งที่ซับซ้อนน้อยกว่าได้ล่ะ? โมดูลการบันทึกเป็นสิ่งที่มีประสิทธิภาพมากและเอกสารประกอบค่อนข้างล้นหลามโดยเฉพาะสำหรับมือใหม่ แต่สำหรับการเริ่มต้นคุณไม่จำเป็นต้องกำหนดค่าฟอร์แมตและตัวจัดการ คุณสามารถเพิ่มได้เมื่อคุณคิดว่าคุณต้องการอะไร
ตัวอย่างเช่น:
import logging.config
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'loggers': {
'': {
'level': 'INFO',
},
'another.module': {
'level': 'DEBUG',
},
}
}
logging.config.dictConfig(DEFAULT_LOGGING)
logging.info('Hello, log')
logging.info('Hello, log')
ที่ทำให้สิ่งต่างๆคลิกสำหรับฉัน ความสับสนในเอกสารประกอบคือการใช้ dictConfig เราไม่จำเป็นต้องดำเนินการgetLogger
หรือดำเนินการใด ๆอีกต่อไป
'': { 'level': 'INFO'...
ได้ไหมและทำไมถึงใช้ไม่ได้ถ้าไม่มี (เช่นเมื่อเปลี่ยนค่าว่างเป็นค่าที่ถูกต้องเช่นstandard
getLogger()
หากคุณต้องการให้คนตัดไม้หลายคนมีชื่อต่างกัน ตัวตัดไม้แต่ละตัวจะสืบทอดการกำหนดค่าจาก root logger
getLogger
เป็นทางเลือกเสมอ เมื่อใช้logging.info()
วิธีนี้โดยตรงจะใช้ root logger ในขณะที่getLogger()
คุณสามารถมี loggers ที่แตกต่างกันโดยมีชื่อและระดับที่แตกต่างกัน
ตัวอย่างด้วย Stream Handler, File Handler, Rotating File Handler และ SMTP Handler
from logging.config import dictConfig
LOGGING_CONFIG = {
'version': 1,
'loggers': {
'': { # root logger
'level': 'NOTSET',
'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
},
'my.package': {
'level': 'WARNING',
'propagate': False,
'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
},
},
'handlers': {
'debug_console_handler': {
'level': 'DEBUG',
'formatter': 'info',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
},
'info_rotating_file_handler': {
'level': 'INFO',
'formatter': 'info',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'info.log',
'mode': 'a',
'maxBytes': 1048576,
'backupCount': 10
},
'error_file_handler': {
'level': 'WARNING',
'formatter': 'error',
'class': 'logging.FileHandler',
'filename': 'error.log',
'mode': 'a',
},
'critical_mail_handler': {
'level': 'CRITICAL',
'formatter': 'error',
'class': 'logging.handlers.SMTPHandler',
'mailhost' : 'localhost',
'fromaddr': 'monitoring@domain.com',
'toaddrs': ['dev@domain.com', 'qa@domain.com'],
'subject': 'Critical error with application name'
}
},
'formatters': {
'info': {
'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
},
'error': {
'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
},
},
}
dictConfig(LOGGING_CONFIG)
ฉันพบการกำหนดค่าเริ่มต้นDjango v1.11.15ด้านล่างหวังว่าจะช่วยได้
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
}
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import logging.handlers
from logging.config import dictConfig
logger = logging.getLogger(__name__)
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
"""
Initialize logging defaults for Project.
:param logfile_path: logfile used to the logfile
:type logfile_path: string
This function does:
- Assign INFO and DEBUG level to logger file handler and console handler
"""
dictConfig(DEFAULT_LOGGING)
default_formatter = logging.Formatter(
"[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
"%d/%m/%Y %H:%M:%S")
file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
file_handler.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(default_formatter)
console_handler.setFormatter(default_formatter)
logging.root.setLevel(logging.DEBUG)
logging.root.addHandler(file_handler)
logging.root.addHandler(console_handler)
[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module
root
คนตัดไม้: ที่ระดับบนสุดของพจนานุกรม มีการอธิบายไว้ในเอกสารมีการตั้งค่ามากกว่า['loggers']['']
เวลาที่มีอยู่ แต่ในความคิดของฉัน['loggers']['']
มีเหตุผลมากกว่า ดูการอภิปรายที่นี่