>

현재 특정 함수 "export_log"를 호출하면 처음부터 앱과의 사용자 상호 작용에 관한 모든 이전 로그 기록이 출력되는 응용 프로그램을 설계하고 있습니다. 처음에는 모든 로그를 목록에 저장 한 다음 파일로 출력했지만 더 나은 방법을 찾고있었습니다. 필자는 필자의 요구에 완벽하게 보이는 Python 로깅 모듈을 발견했지만 제대로 작동하도록하는 것은 약간 익숙하지 않습니다.

아래는 나의 최소 작업 예입니다. func1은 기본적으로 func2에 의해 호출 될 때마다 "foo"를 출력하는 로거입니다. 현재 스크립트를 처음 실행할 때 빈 파일이 생성됩니다. 그러나 스크립트를 두 번 실행하면 파일이 추가되지만 예상되지는 않습니다. func1에서 생성 된 모든 이전 출력 기록을 저장하고 싶습니다.

export_log 함수가 요청시 호출 될 때만 로그 파일을 출력하도록하려면 어떻게해야합니까?

import logging
global logger
logger = logging.getLogger('log_file')
logger.setLevel(logging.INFO)
#
def export_log():
    global logger
    fh = logging.FileHandler('logFile.log')
    fh.setLevel(logging.INFO)
    logger.addHandler(fh)
# run 3 times
def func1():
    global logger
    logger.info("foo")
def func2():
    for i in range(3):
        func1()
func2()
export_log()
# Desired output upon calling the export_log() function:
# foo
# foo
# foo
# Actual output:
# File is initially blank after running script once.
# always appends "foo" every time the script is run again


수정: 와이즈 비즈  Tkinter 버튼으로 호출되기 때문에이 함수가 필요합니다 : export_log . 기본적으로 버튼을 클릭했을 때만 모든 로그 기록을 파일로 출력하고 싶습니다.

Button(controls, text="Export", command = export_log)

  • 답변 # 1

    이 경우 가능한 해결책은 데이터를 io.StringIO() 에 저장하는 것입니다.  버튼을 누르면 파일로 저장합니다 :

    import io
    import logging
    import shutil
    stream = io.StringIO()
    handler = logging.StreamHandler(stream)
    logger = logging.getLogger("mylogger")
    logger.setLevel(logging.INFO)
    logger.addHandler(handler)
    
    def export_log():
        handler.flush()
        with open("logFile.log", "w") as fd:
            stream.seek(0)
            shutil.copyfileobj(stream, fd)
    # ...
    
    

  • 이전 ruby on rails - RSpec이 시작하는 데 오랜 시간이 걸리는 이유를 찾는 방법은 무엇입니까?
  • 다음 클래스 인스턴스를 반환하는 모듈의 형식 스크립트 선언 파일을 작성하는 방법