2012-08-09 3 views
2

저는 Linux Ubuntu 12.04 시스템을 사용하고 있습니다. 내가 여기있다, 나는 항상 빈 줄 뒤에있어 항목을받을 때마다 몇 가지 이유를 들어python - stdout을 로깅하지만 각 항목에 두 번째 빈 줄이 표시됨

class LogFile(object): 
    def __init__(self, name=None): 
     self.logger = logging.getLogger(name) 

    def write(self, msg, level=logging.INFO): 
     self.logger.log(level, msg) 

    def flush(self): 
     for handler in self.logger.handlers: 
      handler.flush() 

logging.basicConfig(level=logging.INFO, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d-%y %H:%M:%S', 
        filename='logging.log') 
sys.stdout = LogFile('stdout') 
sys.stderr = LogFile('stderr') 

.. 모든 표준 출력과 표준 에러 + 파일에 대한 정보 수준에 대한 자세한 로그를 기록 할이 코드를 사용하고있다 내 로그의 작은 출력 :

08-09-12 09:52:54 stdout  INFO  CheckCon: Checking Portal access. 
08-09-12 09:52:54 stdout  INFO  

08-09-12 09:52:54 stdout  INFO  CheckCon: Portal ping successful. 
08-09-12 09:52:54 stdout  INFO  

08-09-12 09:53:08 stderr  INFO  Bottle server starting up (using PasteServer())... 

08-09-12 09:53:08 stderr  INFO  Listening on http://0.0.0.0:8654/ 

08-09-12 09:53:08 stderr  INFO  Hit Ctrl-C to quit. 


08-09-12 09:53:08 stdout  INFO  URI: Generated https://***** 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  CheckCon: Checking Portal access. 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  serving on 0.0.0.0:8654 view at http://127.0.0.1:8654 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  CheckCon: Google ping successful. 
08-09-12 09:53:08 stdout  INFO  

이것은 파일에서 빈 stdout 행과 전체 빈 행을 모두 보는 방법입니다. 병 서버의 출력이 빈 줄이 아니라 각 줄 사이에 빈 줄이있는 것 같습니다.

누구든지이 문제를 일으키는 원인이 무엇인지 또는 어떻게 방지 할 수 있는지 알고 있습니까?

편집

: 그래서

수정 형식 지금 내 로그 \ : 나는 logging.info 내 모든 인쇄를 변경 제안에서

, 나는 여전히 병 및 붙여 넣기 서버가 정기적으로 인쇄를하고 문제가 format='%(asctime)s %(levelname)-4s: %(message)s' : 내가 추가 빈 줄을 볼 수있는에서

08-09-12 12:44:40 INFO: URI: Generated https://**** 
08-09-12 12:44:40 INFO: CheckCon: Checking Portal access. 
08-09-12 12:44:40 INFO: serving on 0.0.0.0:9002 view at http://127.0.0.1:9002 
08-09-12 12:44:40 INFO: 

08-09-12 12:44:40 INFO: CheckCon: Google ping successful. 
08-09-12 12:44:40 INFO: FullW: opening url: **** 
08-09-12 12:44:40 INFO: FullW: showing. 
08-09-12 12:44:40 INFO: LOOP: starting. 

이 때문에 빈 정보 라인의도 너무 가까이 이제 점점 ..

편집 출력을 명확히 : 흥미로운 비트 :

+++08-09-12 13:01:04 stdout  INFO  serving on 0.0.0.0:9002 view at  http://127.0.0.1:9002+++ 
+++08-09-12 13:01:04 stdout  INFO  
+++ 

최종 편집 :

은 MSG의 길이가 2 개 문자 아래에 있는지 확인하기 위해 내 쓰기를 변경하고, 그 빈 줄을 제거 .. 아직도 이유의 확실하지 않은 100 %.

def write(self, msg, level=logging.INFO): 
    if len(msg) < 2: 
     pass 
    else: 
     self.logger.log(level, msg) 
+0

게다가,'level ='매개 변수를'__init __()'에 두는 것이 좋습니다. 'write()'가 아닙니다. – glglgl

+0

죄송합니다. glglgl 무슨 뜻인지 이해가 안 되니? –

+0

명확성을 위해 형식이'+++ % (asctime) s (name) -12s % (levelname) -8s % (message) s +++'로 설정된 실행에서 어떻게 보이나요? – Deestan

답변

0

이것은 print의 작동 방식 때문입니다.

write() 메서드에 print (level, msg)이되도록 예제를 수정했습니다.

그것은 다음 날 보여줍니다

>>> x=LogFile("foo") 
>>> print >>x, "123\n321\n444", "321", "222", 
(20, '123\n321\n444') 
(20, ' ') 
(20, '321') 
(20, ' ') 
(20, '222') 
>>> print >>x, "123\n321\n444", "321", "222" 
(20, ' ') 
(20, '123\n321\n444') 
(20, ' ') 
(20, '321') 
(20, ' ') 
(20, '222') 
(20, '\n') 

그리고이 각이 logger 전화로 전송되는 호출하는 경우, 당신은 그들 각각에 대한 항목을 얻을에게.

이에 대처하기 위해 완전한 라인과 닫을 때만 logger.log()을 호출하는 종류의 버퍼링을 구현할 수 있습니다.

0

내가 생각할 수있는 것은 sys.stdout을 덮어 쓰므로 로깅 라인을 작성하는 실제 명령에 줄 바꿈이 추가됩니다 : sys.stdout.write("log text\n"). 로깅 모듈/메소드는 개행을 추가하므로 두 개의 개행을 얻을 수 있습니다.

그러나 완전히 빈 줄만 표시해야하며 빈 줄은 <date> <name> <level>이 아닙니다. 이는 다른 곳의 단일 sys.stdout.write("\n") 문으로 인해 발생할 수 있습니다.

내가 이것을 막기 위해 생각할 수있는 가장 간단한 방법은 msg에서 줄 바꿈을 제거하고 메시지가 비어 있는지 확인하는 것입니다. 가장 아름다운 것은 아니지만, 그게 효과가 있다면, 아마도 개행이 그 원인 일 수 있습니다 :

def write(self, msg, level=logging.INFO): 
    msg = msg.rstrip("\n") 
    if msg: 
     self.logger.log(level, msg) 
+0

그게 사실이라면 옳을 것입니다. 그러나 아아,'print'는 각 컴포넌트와 분리 된'''과''\ n ''을 분리하여 호출합니다. – glglgl

+2

처음 사용되는 파이썬 로깅을 사용하지 않는 것은 이상하게 보입니다. 이 경우 print 서술문을 사용하는 것만으로는 좋지 않습니다. – Evert

+1

유기적으로 성장한 응용 프로그램에서 이런 일이 발생할 수 있습니다 ... – glglgl

관련 문제