2013-11-04 2 views
7

내가 사용 로그 모듈은 내가하지 않으려는 어떤 것을 만들 것입니다 포맷 형태로 바쁜 HTTP 서버에 보내는 모든 단일 요청의 일부 정보를 기록하려면 :csv 파일에 로그인하는 올바른 방법은 무엇입니까?

[I 131104 15:31:29 Sys:34] 

내가 CSV 형식으로 생각을하지만, 그것을 열고 파일을 각 시간을 닫습니다 것이기 때문에 내가 전체 서버를 느려지 게 이런 식으로 두려워, 나는 그것을 사용자 정의하는 방법을 알고하지 않으며, 파이썬은 CSV 모듈을 얻었으나, 수동

import csv 
with open('some.csv', 'w', newline='') as f: 
    writer = csv.writer(f) 
    writer.writerows(someiterable) 

읽기 성능, 내가 뭘 할 수 있을까?

+1

csv 행을 출력하는 형식의 logging.Formatter 인스턴스를 사용해야합니다. –

답변

6

그냥 파이썬의 logging 모듈을 사용하십시오.

출력을 원하는대로 조절할 수 있습니다. Changing the format of displayed messages에서 살펴 :

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
:

을 메시지를 표시하는 데 사용되는 형식을 변경하려면, 당신은 당신이 사용하고자하는 형식을 지정해야 logging.warning('And this, too')

Formatters :

포맷터 개체가 로그 메시지의 마지막 순서, 구조 및 내용을 구성합니다.

당신은 쉽게 CSV와 같은 출력 파일을 생성하기 위해 ,:를 교체 할 수 있습니다.

여기에서 사용할 수있는 attribtus 목록은 LogRecord attributes입니다.

0

나는 그것이 최선의 생각이라고 생각하지 않지만, 실행 가능하고 아주 간단합니다. 로그를 수동으로 버퍼링하십시오. 로그 항목을 어떤 위치에 저장하고 수시로 파일에 기록하십시오. 서버가 계속 바쁠 것이라는 것을 알고 있으면 버퍼가 일정 크기에 도달하면 버퍼를 비 웁니다. 사용량에 큰 차이가있을 수 있다면, 나는 끊임없이 (이론적으로는 물론) 루프를 사용하여 새 스레드 (또는 더 나은 프로세스, 스레드가 빨려 들어가고 응용 프로그램이 느려지는 이유)를 더 잘 호출 할 것이라고 말하고 싶습니다. 또한, 서버가 중단되거나 실패 할 때 버퍼를 플러시하는 일종의 훅을 만드는 것을 잊지 마십시오 (주 기능에서 신호를 보내거나 그냥 사용해보십시오 - 더 많은 방법이 있습니다). 그러면 플러시되지 않게됩니다. 예기치 않은 이탈시 데이터를 버퍼링합니다.

나는 반복한다 - 이것은 최선의 생각이 아니다, 그것이 내 마음에 온 첫 번째 것이다. Flask 또는 다른 webapp 프레임 워크 (AFAIR Flask에는 CSV 로깅이 있음)의 로깅 구현을 참조 할 수 있습니다.

1

sloth가 암시 하듯이 로그의 구분 기호를 쉼표로 쉽게 편집하여 CSV 파일을 생성 할 수 있습니다.

근무 예 :

import logging 

# create logger 
lgr = logging.getLogger('logger name') 
lgr.setLevel(logging.DEBUG) # log all escalated at and above DEBUG 
# add a file handler 
fh = logging.FileHandler('path_of_your_log.csv') 
fh.setLevel(logging.DEBUG) # ensure all messages are logged to file 

# create a formatter and set the formatter for the handler. 
frmt = logging.Formatter('%(asctime)s,%(name)s,%(levelname)s,%(message)s') 
fh.setFormatter(frmt) 

# add the Handler to the logger 
lgr.addHandler(fh) 

# You can now start issuing logging statements in your code 
lgr.debug('a debug message') 
lgr.info('an info message') 
lgr.warn('A Checkout this warning.') 
lgr.error('An error writen here.') 
lgr.critical('Something very critical happened.') 
+2

거기에 CSV 헤더 행을 추가하는 방법이 있습니까? (예 : 열의 이름을 포함하는 CSV 텍스트 파일의 첫 번째 행) – ycomp

+0

예, 찾고있는 것일 수 있습니다. http://stackoverflow.com/questions/27840094/write-a-header-at - 모든 - 로그 파일 - 그것은 - 시간 - 회전 로거와 함께 만들어집니다 – ecoe

2

난 당신이 로깅 모듈을 사용하도록 동의하지만, 다른 답변의 일부가 보여처럼 그들이 당신이 정말로, 단지 형식 문자열을 제대로 할 수 없어 쉼표가 포함 된 메시지를 기록하는 상황을 설명하지 마십시오.

메시지 (또는 다른 입력란)의 특수 문자를 올바르게 이스케이프 처리하는 솔루션이 필요한 경우 사용자 지정 포매터를 작성하고 설정해야합니다.

logger = logging.getLogger() 

formatter = MyCsvFormatter() 

handler = logging.FileHandler(filename, "w") 
handler.setFormatter(formatter) 
logger.addHandler(handler) 
logger.setLevel(level) 

당신은 분명히 logging.Formatter에서 상속 형식() 메소드

class MyCsvFormatter(logging.Formatter): 
    def __init__(self): 
     fmt = "%(levelname)s,%(message)s" # Set a format that uses commas, like the other answers 
     super(MyCsvFormatter, self).__init__(fmt=fmt) 

    def format(self, record): 
     msg = record.getMessage() 
     # convert msg to a csv compatible string using your method of choice 
     record.msg = msg 
     return super(MyCsvFormatter, self).format(self, record) 

주보다 우선해야 MyCsvFormatter 클래스를 구현해야합니다 : 전에이 같은 짓을 한을, 하지만이 특정 코드 샘플

을 테스트하지 않았습니다

지금까지 메시지의 실제 탈출을하는 등, 여기에 하나의 가능한 접근 방식 : Python - write data into csv format as string (not file)

관련 문제