이것은 로그 수준 있는 응용 프로그램을 사용하여 필 콘피그 재시작하기 없이 변경할 수 있다. 일부 다른 방법을 통해 이뤄질 수 없는 경우 필 콘피그 동일한 결과를 얻을 수 있는가?
업데이트: 이는 내가 원하는 시스템 관리자를 실행 중인 응용 프로그램에 대한 서버의 설정 파일 이름 변경 될 수 시간 동안 실행하십시오 애플리케이션마다 및 변경하십시오 로그 레벨을 무중단으로. 그는 당시 업그레이드됨 I& 주벤트 작업 중 하나로, ve 추가되든지 # 39 내 코드를 사용하는 파일 구성용 변경되는지 inotify 답을 선택할 수 있습니다.
'은' 필 콘피그 설정하시려면 메커니즘을 기반으로 로그 수준 당신꺼에요 파일입니다. 언제든지 해당 프로그램에서 동적으로 변경할 수 있습니다.
매입옵션 ['오스트라벨 ()'] (http://docs.python.org/2/library/logging.html # 조지 g. 로게리스틀벨) 를 보려는 변경하십시오 레벨이네 로깅합니다 로깅하기 객체에는 보통 그렇게 you&; d # 39 의 root:
logging.getLogger().setLevel(logging.DEBUG)
그것은 분명 '필 콘피그 ()' 을 사용할 수 있지만, 즉석에서 간단한 변경을 위한 프로그램 방식 변경 로깅하기 구성 # 39 에 제안된 마르테인 Pieters& 외곽진입 있다. 답변이 적당합니다. 심지어 로깅하기 소켓 서버 구성 '는 말을 듣고' / ' () api 를 사용하여 변경 사항을 스토프리스텐링 ()' 로 문서화했습니다 [here] [1]. 특정 포트를 사용하는 afaq 로깅하기 듣고,
t = logging.config.listen(PORT_NUMBER)
t.start()
수신 및 중지되기를 호출하십시오
logging.config.stopListening()
서버에 데이터를 보낼 수 사용할 수 있습니다. (예:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', PORT_NUMBER))
with open(CONFIG_FILE) as f:
data_to_send = f.read()
s.send(struct.pack('>L', len(data_to_send)))
s.send(data_to_send)
s.close()
[1]: http://docs.python.org/2/howto/logging-cookbook.html # 구성 서버 (예:
# 39 의 sfinken& 오토메이티드 에서 확대 및 Starman& # 39 의 후속 주석문입니다, 특정 유형의 처리기에서 타겟으로의 우스푸스터 확인할 수 있습니다 - 예를 들면 다음과 같습니다.
"' 가져오기의 로깅하기 로그기록기 = 조지 g. 제로거 () 에 대한 처리기에서 로거스핸들러스: 만약 이신스턴스 (처리기에서 mm_mail_doc. (조지 g. 스트레타 핸들러 ())): 한들리스틀벨 (로긴g.드버그) 로거스드버그 (& # 39, 디버그입니다 로깅하기 enabled& # 39;) "'
이 싸움은 너희는너희가 찾고 있다.
import logging
logging.getLogger().setLevel(logging.INFO)
참고로 ' ()' 라는 제러거 인수 없이 스크립트루트 되돌려줍니다 로거에.
난 결국 inotify 는 파일 쓰기 작업을 확인하기 위해 사용하는 정착 및 주벤트 그러니까말이야 변경된 후 파일 및 설정 후 각 로그기록기 나는 구성용 따라 갈 수 있는 수준.
import gevent
import gevent_inotifyx as inotify
from gevent.queue import Queue
class FileChangeEventProducer(gevent.Greenlet):
def __init__(self, fd, queue):
gevent.Greenlet.__init__(self)
self.fd = fd
self.queue = queue
def _run(self):
while True:
events = inotify.get_events(self.fd)
for event in events:
self.queue.put(event)
gevent.sleep(0)
class FileChangeEventConsumer(gevent.Greenlet):
def __init__(self, queue, callBack):
gevent.Greenlet.__init__(self)
self.queue = queue
self.callback = callBack
def _run(self):
while True:
_ = self.queue.get()
self.callback()
gevent.sleep(0)
class GeventManagedFileChangeNotifier:
def __init__(self, fileLocation, callBack):
self.fileLocation = fileLocation
self.callBack = callBack
self.queue = Queue()
self.fd = inotify.init()
self.wd = inotify.add_watch(self.fd, self.fileLocation, inotify.IN_CLOSE_WRITE)
def start(self):
producer = FileChangeEventProducer(self.fd, self.queue)
producer.start()
consumer = FileChangeEventConsumer(self.queue, self.callBack)
consumer.start()
return (producer, consumer)
위의 코드는 아래와 같은 사용될,
def _setUpLoggingConfigFileChangeNotifier(self):
loggingFileNameWithFullPath = self._getFullPathForLoggingConfig()
self.gFsNotifier = GeventManagedFileChangeNotifier(loggingFileNameWithFullPath, self._onLogConfigChanged)
self.fsEventProducer, self.fsEventConsumer = self.gFsNotifier.start()
def _onLogConfigChanged(self):
self.rootLogger.info('Log file config has changed - examining the changes')
newLoggingConfig = Config(self.resourcesDirectory, [self.loggingConfigFileName]).config.get('LOG')
self.logHandler.onLoggingConfigChanged(newLoggingConfig)
일단 나는 내가 할 수 있는 새로운 로그 파일 구성용 적절한 수준의 로깅하기 에서 각 로거의 와이어 구성용. 답변 및 싶어서 공유할 경우 이 기능을 사용하여 주벤트 누군가 하는 것이 도움이 됩니다.
애플리케이션 (앱) 을 따라 먼저 찾아야 하는 길을 따라 해당 파일 로그 수준 또는 재설정됨 리로드하지 İç 구성 파일 실행 중에.
타이머 약간만이라도 쉽게 사용할 수 있습니다. 이를 위해 비동기 프레임워크입니다 스레팅 사용하거나 또는 원하는 대로 할 경우 사용. 그들은 보통 이를 구현하는).
스레딩 사용. 타이머:
import threading
import time
def reset_level():
# you can reload your own config file or use logging.config.fileConfig here
print 'Something else'
pass
t = threading.Timer(10, reset_level)
t.start()
while True:
# your app code
print 'Test'
time.sleep(2)
출력:
Test
Test
Test
Test
Test
Something else
Test
Test
업데이트: 이 솔루션을 제안한 dbasyb 마르테인 피터르스.