로깅 수준 설정
표준 라이브러리를 사용하여 코드를 디버깅하려고 합니다.
이것은 잘 작동합니다.
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('message')
하위 레벨에서는 작업을 로거로 만들 수 없습니다.
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('message')
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('message')
저는 두 가지 모두에 대해 아무런 응답을 받지 못합니다.
어떤 파이썬 버전?3.4에서 작동합니다.그러나 basicConfig()가 이미 설정되어 있으면 루트 핸들러에 영향을 주지 않습니다.
루트 로거에 이미 구성된 핸들러가 있는 경우 이 기능은 아무 동작도 하지 않습니다.
루트의 수준을 명시적으로 설정하려면 다음을 수행합니다.logging.getLogger().setLevel(logging.DEBUG)
하지만 당신이 전화했는지 확인하세요.basicConfig()
루트 로거에 초기 설정이 있어야 합니다.예:
import logging
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger('foo').debug('bah')
logging.getLogger().setLevel(logging.INFO)
logging.getLogger('foo').debug('bah')
또한 "로거"와 "처리기"는 모두 서로 다른 독립적인 로그 수준을 가지고 있습니다.따라서 이전에 Python 스크립트에 일부 복잡한 로거 구성을 명시적으로 로드한 적이 있고 루트 로거의 핸들러가 손상되었다면, 이는 영향을 미칠 수 있으며 로거 로그 수준만 변경할 수 있습니다.logging.getLogger().setLevel(..)
작동하지 않을 수 있습니다.연결된 처리기의 로그 수준이 독립적으로 설정되어 있을 수 있기 때문입니다.이것은 사실일 가능성이 낮고 여러분이 보통 걱정해야 하는 것이 아닙니다.
로깅을 위해 다음 설정을 사용합니다.
Yaml 기반 구성
다음과 같이 logging.yml이라는 yaml 파일을 만듭니다.
version: 1
formatters:
simple:
format: "%(name)s - %(lineno)d - %(message)s"
complex:
format: "%(asctime)s - %(name)s - %(lineno)d - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
file:
class: logging.handlers.TimedRotatingFileHandler
when: midnight
backupCount: 5
level: DEBUG
formatter: simple
filename : Thrift.log
loggers:
qsoWidget:
level: INFO
handlers: [console,file]
propagate: yes
__main__:
level: DEBUG
handlers: [console]
propagate: yes
파이썬 - 메인
"주" 모듈은 다음과 같아야 합니다.
import logging.config
import logging
import yaml
with open('logging.yaml','rt') as f:
config=yaml.safe_load(f.read())
f.close()
logging.config.dictConfig(config)
logger=logging.getLogger(__name__)
logger.info("Contest is starting")
하위 모듈/클래스
이것들은 이렇게 시작해야 합니다.
import logging
class locator(object):
def __init__(self):
self.logger = logging.getLogger(__name__)
self.logger.debug('{} initialized')
그게 당신에게 도움이 되길...
제 생각에는, 이것이 대부분의 경우에 가장 좋은 접근법입니다.
INI 파일을 통한 구성
파일 이름 만들기logging.ini
아래와 같이 프로젝트 루트 디렉터리에 있습니다.
[loggers]
keys=root
[logger_root]
level=DEBUG
handlers=screen,file
[formatters]
keys=simple,verbose
[formatter_simple]
format=%(asctime)s [%(levelname)s] %(name)s: %(message)s
[formatter_verbose]
format=[%(asctime)s] %(levelname)s [%(filename)s %(name)s %(funcName)s (%(lineno)d)]: %(message)s
[handlers]
keys=file,screen
[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=verbose
level=WARNING
args=('debug.log',)
[handler_screen]
class=StreamHandler
formatter=simple
level=DEBUG
args=(sys.stdout,)
그런 다음 아래와 같이 구성합니다.
import logging
from logging.config import fileConfig
fileConfig('logging.ini')
logger = logging.getLogger('dev')
name = "stackoverflow"
logger.info(f"Hello {name}!")
logger.critical('This message should go to the log file.')
logger.error('So should this.')
logger.warning('And this, too.')
logger.debug('Bye!')
스크립트를 실행하면sysout
다음과 같습니다.
2021-01-31 03:40:10,241 [INFO] dev: Hello stackoverflow!
2021-01-31 03:40:10,242 [CRITICAL] dev: This message should go to the log file.
2021-01-31 03:40:10,243 [ERROR] dev: So should this.
2021-01-31 03:40:10,243 [WARNING] dev: And this, too.
2021-01-31 03:40:10,243 [DEBUG] dev: Bye!
그리고.debug.log
파일은 다음을 포함해야 합니다.
[2021-01-31 03:40:10,242] CRITICAL [my_loger.py dev <module> (12)]: This message should go to the log file.
[2021-01-31 03:40:10,243] ERROR [my_loger.py dev <module> (13)]: So should this.
[2021-01-31 03:40:10,243] WARNING [my_loger.py dev <module> (14)]: And this, too.
다 됐습니다.
기본 로거를 경고 수준으로 유지하고 싶었지만 내 코드에 대한 자세한 하위 레벨 로거가 있습니다.하지만 아무것도 안 보여요다른 답변을 바탕으로 실행하는 것이 중요합니다.logging.basicConfig()
사전에
import logging
logging.basicConfig()
logging.getLogger('foo').setLevel(logging.INFO)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('info')
logging.getLogger('foo').setLevel(logging.DEBUG)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('debug')
예상 출력
INFO:foo:info
INFO:foo:info
DEBUG:foo:debug
모듈 전체에 걸친 로깅 솔루션을 위해 다음 작업을 수행했습니다.
# cfg.py
import logging
logging.basicConfig()
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info(f'active')
# main.py
import cfg
cfg.logger.info(f'main')
언급URL : https://stackoverflow.com/questions/38537905/set-logging-levels
'programing' 카테고리의 다른 글
Angular2에서 이미지를 제공하는 방법은 무엇입니까? (0) | 2023.08.22 |
---|---|
엑셀의 INDEX 함수가 배열을 반환할 수 있습니까? (0) | 2023.08.22 |
Windows 10의 파워셸을 사용하여 여러 데스크톱에서 프로그램 시작 (0) | 2023.08.22 |
Android Gradle: build toolsVersion 대 compileSdkVersion (0) | 2023.08.22 |
Ajax를 사용한 Tiny MCE 텍스트 영역 및 게시 양식 (0) | 2023.08.22 |