python 로그 기록 모듈 인 스 턴 스 및 개선
def prn_obj(obj):
print '
'.join(['%s:%s' % item for item in obj.__dict__.items()])
Python logger 대상 속성(위 함수 에서 가 져 온)
name:get_data
parent:<logging.RootLogger instance at 0x1d8bd88>
handlers:[<logging.FileHandler instance at 0x21bcc68>]
level:10
disabled:1 # logger , 0
manager:<logging.Manager instance at 0x1d8bea8>
propagate:0 #
filters:[]
부분 로그 출력 불가File:logger.conf
[formatters]
keys=default
[formatter_default]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
class=logging.Formatter
[handlers]
keys=console, error_file
[handler_console]
class=logging.StreamHandler
formatter=default
args=tuple()
[handler_error_file]
class=logging.FileHandler
level=INFO
formatter=default
args=("logger.log", "a")
[loggers]
keys=root
[logger_root]
level=DEBUG
formatter=default
handlers=console,error_file
File:logger.py
#!/bin/env python
import logging
from logging.config import logging
class Test(object):
"""docstring for Test"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
def test_func(self):
self.logger.error('test_func function')
class Worker(object):
"""docstring for Worker"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
data_logger = logging.getLogger('data')
handler = logging.FileHandler('./data.log')
fmt = logging.Formatter('%(asctime)s|%(message)s')
handler.setFormatter(fmt)
data_logger.addHandler(handler)
data_logger.setLevel(logging.DEBUG)
self.data_logger = data_logger
def test_logger(self):
self.data_logger.error("test_logger function")
instance = Test()
self.data_logger.error("test_logger output")
instance.test_func()
def main():
worker = Worker()
worker.test_logger()
if __name__ == '__main__':
main()
문제 1:테스트 과정 에서 test 만 출력 할 수 있 습 니 다.logger function 한 문장문제 2:분명히 datalogger 에서 문 구 를 인쇄 하 였 으 나,logger 로그 에 도 관련 로그 가 나 타 났 습 니 다.
문제 해결 방안:
python-m pdb logger.py 문 구 를 이용 하여 스 크 립 트 를 디 버 깅 한 결과 인 스 턴 스=Test()문 구 를 실행 한 후 print'.join(['%s:%s'%item for item in self.datalogger.__dict__.items()])디 버 깅 문 구 는 datalogger 의 disable 속성 값 이 0 에서 True 로 바 뀌 었 습 니 다.이때 logger 의 대응 속성 도 똑 같은 변화 가 생 겼 습 니 다.이러한 변 화 는 logger 대상 이 기록 로 그 를 중단 하 게 만 들 었 습 니 다.python 참조 logging 모듈 관련 매 뉴 얼 발견"The fileConfig()function takes a default parameter,disableexisting_"loggers,which defaults to True for reasons of backward compatibility.이것 은 file Config()call to be disabled before they(or an ancestor)are explicitly named in the configuration."의 설명 에 의 하면,다음 과 같은 이유 로 true 에 대한 기본 값 입 니 다.fileconfig()함 수 를 호출 하면 이전에 존 재 했 던 모든 logger 를 사용 하지 않 습 니 다.python 2.7 버 전에 서 이 fileConfig()함수 에 인 자 를 추가 하 였 습 니 다.logging.config.fileConfig(fname,defaults=None,disableexisting_loggers=True),명시 적 으로 disableexisting_loggers 는 기 존의 logger 를 사용 하지 않도록 FALSE 로 설정 합 니 다.위 코드 의 Test 클래스 의 logging.config.fileConfig 함 수 를 logging.config.fileConfig("./logger.conf",disable 로 변경 합 니 다.existing_loggers=0)문 제 를 해결 할 수 있 습 니 다.그러나 이 코드 는 같은 프로그램 에 있 기 때문에 logging.getLogger(LOGGOR)를 직접 사용 할 수 있 습 니 다.NAME)함 수 는 같은 logger 를 참조 합 니 다.logging.config.fileConfig 함 수 를 다시 불 러 올 필요 가 없습니다.
문제 2 해결 방안:
logger 대상 에 속성 propagate 가 있 습 니 다.이 속성 이 True 라면 출력 할 정 보 를 이 logger 의 모든 상급 logger 에 보 냅 니 다.이 상급 logger 에 대응 하 는 handlers 는 받 은 정 보 를 관련 로그 에 인쇄 합 니 다.logger.conf 설정 파일 에 루트 logger 의 속성 을 설정 하 였 습 니 다.이 루트 logger 는 기본 logger 로그 입 니 다.
수 정 된 것 은 다음 과 같다.
File:logger.conf
[formatters]
keys=default, data
[formatter_default]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
class=logging.Formatter
[formatter_data]
format=%(asctime)s|%(message)s
class=logging.Formatter
[handlers]
keys=console, error_file, data_file
[handler_console]
class=logging.StreamHandler
formatter=default
args=tuple()
[handler_error_file]
class=logging.FileHandler
level=INFO
formatter=default
args=("logger.log", "a")
[handler_data_file]
class=logging.FileHandler
level=INFO
formatter=data
args=("data_new.log", "a")
[loggers]
keys=root, data
[logger_root]
level=DEBUG
handlers=console,error_file
[logger_data]
level=DEBUG
handlers=data_file
qualname=data
propagate=0
File:logger.py
#!/bin/env python
import logging
from logging.config import logging
class Test(object):
"""docstring for Test"""
def __init__(self):
self.logger = logging.getLogger(__name__)
def test_func(self):
self.logger.error('test_func function')
class Worker(object):
"""docstring for Worker"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
self.data_logger = logging.getLogger('data')
def test_logger(self):
self.data_logger.error("test_logger function")
instance = Test()
self.data_logger.error("test_logger output")
instance.test_func()
def main():
worker = Worker()
worker.test_logger()
if __name__ == '__main__':
main()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.