programing

로깅 수준 설정

stoneblock 2023. 8. 22. 21:47

로깅 수준 설정

표준 라이브러리를 사용하여 코드를 디버깅하려고 합니다.

이것은 잘 작동합니다.

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