2011-05-06 2 views
1

나는 간단한 명령 행 프로그램을 파이썬으로 작성했습니다. 이 프로그램 로그는 다음과 같은 방식으로 구성 로깅 모듈을 사용하여 화면합니다 :다른 시스템에서 파이썬 로깅은 다른 형식/레벨을 보여줍니다.

logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(message)s') 

이상한 것은이를 그 원하는 형식으로 내 노트북에, 적절한 수준의 프로그램 로그 (INFO)를, 때 잠시 I 서버에서 프로그램을 실행하면 오류 및 경고 만 다른 형식으로 기록됩니다.

두 시스템 모두 가상 환경에서 Python 2.7을 실행하고 있습니다. 환경은 정확히 동일하지 않습니다.

일부 모듈이 내 구성을 변경한다고 생각합니다. 나는 왜 그것이 서버에서만 일어나는 지 이해하지 못한다. 그러나 어떤 방법이있어 어느 것을 찾을 수 있는가? 사전에

감사합니다,

답변

1

로깅의 API는 루트 로거에 이미 처리기가 구성된 경우 아무 것도 수행하지 않습니다 (문서화 된 것처럼). 서버의 다른 코드가 이미 루트 로거에 대한 일부 처리기를 구성했기 때문에 basicConfig() 호출이 무시 될 수 있습니다.

일반적으로 라이브러리 코드는 처리기를 추가하면 안됩니다. 이는 응용 프로그램 개발자의 책임입니다. 그러나 예를 들어 프레임 워크를 사용하여 웹 애플리케이션을 개발하면 프레임 워크가 이미 일부 핸들러를 구성했을 수 있습니다.

당신은 "서버에서"라고 말하지만 서비스 응용 프로그램에 대해 이야기하고 있는지 또는 서버가 될 수있는 시스템에서 유틸리티 스크립트를 실행 중인지 여부는 분명하지 않습니다. 여러분이 말했듯이, 가상 환경은 약간 다르므로, 그것들의 차이점은 힌트를 찾을 곳이 될 것입니다.

루트 로거에서 처리기를 구성하는 방법을 찾으려면 basicConfig() 또는 addHandler()의 관련 소스를 grep 할 수 있습니다.

f = logging.Formatter('%(levelname)-8s %(message)s') 
h = logging.StreamHandler() 
h.setFormatter(f) 
logging.getLogger().addHandler(h) 

을하지만, 다른 콘솔 핸들러는 루트 로거에 추가하는 경우이 여러 메시지가 발생할 수 있습니다 :

또는 명시 적으로 오히려 당신을 위해 그것을 할 basicConfig()에 의존하지 않고 핸들러를 추가 할 수 있습니다.

+0

도움 주셔서 감사합니다. – Hernan

0

당신이 특정 모듈을 생각하면, 코드를 동결 나 cx_Freeze, 또는 py2exe에를 사용해보십시오. 그러면 생성 파일과 실행 파일이 만들어지며 필요한 모듈이 시스템에있는 모듈에 종속되지 않게됩니다.

+0

제안 해 주셔서 감사합니다. 프로그램에서 가져온 하나의 모듈은 내 프로그램이 로깅 모듈을 구성하기 전에 서버에서서만 뭔가를 로깅하는 것 같습니다. 그럼 모든 로그는 내가 원하는 방식이 아니야. 내 프로그램에서 첫 번째 줄에서 로깅을 가져오고 구성합니다. 그러면 모든 것이 내가 원하는대로 작동합니다. – Hernan

0

파이썬 로깅 시스템 구성은 파이썬 프로세스에서 고유합니다. 누군가 프로세스의 로깅 구성을 변경하면이 프로세스에서 생성 된 모든 로그가이 구성을 따릅니다.

관련 문제