python 로그 기록 모듈 인 스 턴 스 및 개선

6347 단어 python로그 모듈
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()

좋은 웹페이지 즐겨찾기