2013-07-22 4 views
2

나는 꼬인 서버가 있습니다. 그것은 플러그인과 함께 실행됩니다. 요청에 따라 각 항목마다 고유 한 접두어를 작성하고 싶습니다.꼬임. 각 요청에 대해 로그에 고유 한 접두어를 쓰는 방법

이것은 user1이 요청할 때 로그 레코드 앞에 접두사가 붙을 고유 문자열을 생성한다는 것을 의미합니다 (이 요청에만 해당). user2가 요청을하면 로그에 대한 레코드의 또 다른 고유 한 접두어가됩니다.

나는 로그 관측기 로거이어야한다고 생각하지만 사용자 요청간에 레코드를 그룹화하는 방법은 무엇입니까?

답변

6

이 질문에 대한 몇 가지 부분이 있습니다.

먼저 쉬운 부분 - 로그 이벤트에 사용자 지정 접두사를 부여하는 방법은 무엇입니까? 물론 이것에 대해 여러 가지 방법이 있습니다. 아주 단순한 작업을 수행 할 수 있습니다.

from twisted.python.log import msg 

def myLog(message): 
    msg("my prefix" + message) 

즉, 원하는 접두어로 로그 메시지 앞에 접두사를 붙이십시오. 로그 메시지를 엉망으로 만들고, 접두어 텍스트를 로그 메시지와 섞어서 뒤집기가 힘들 기 때문에 (로그 된 메시지가 다른 시스템에서 왔고 어떤 접두사도 갖지 않는 것으로 생각하십시오. 그러나 당신은 어떻게 말할 것입니까?).

그래서 대신, 로그 이벤트의 또 다른 핵심 사용할 수있는 접두사를 사용하여 :

from twisted.python.log import msg 

def myLog(message): 
    msg(message, system="my prefix") 

이 일종의 (정확히, 충분히 가까이) 등의보고 방출되는 로그 이벤트의 원인이됩니다 :

{"message": message, "system": "my prefix"} 

"시스템"키는 특별한 경우입니다. 그것은 트위스트의 기본 파일 로그 관찰자에 의해 인식과 그 내용이 파일에 기록 된 로그 메시지에서 종료된다

2013-07-23 06:25:35-0400 [my prefix] message 

당신은 당신의 "시스템"키를 공동으로 선택하고 싶지 않을 수도 있습니다 사용자 기반 정보. 결국 시스템은 아마도 HTTP 서버와 관련이 있습니다. 사용자가 시스템이 아닙니다.

from twisted.python.log import msg 

def myLog(message): 
    msg(message, userIdentifier="alice") 

userIdentifier는 트위스트와 함께 제공되는 파일 로그 관찰자에 의해 무시됩니다,하지만 당신이 그것에 관심을 지불 자신의 관찰자를 작성할 수 있습니다

당신은 당신이 비록 원하는 msg 다른 키워드 인수를 전달할 수 있습니다 . 예를 들면 :

이 당신에게 로그 이벤트의 특별한 종류를 통지하고, 일반 파일 쓰기 논리로에 보내기 전에 자신의 텍스트를 수정하는 관찰자를 제공
from twisted.python.log import FileLogObserver, textFromEventDict, addObserver 

class MyObserver(FileLogObserver): 
    def emit(self, event): 
     text = textFromEventDict(event) 
     if text and event.get("userIdentifier"): 
      adjusted = event.copy() 
      adjusted["message"] = "(%s) %s" % (event["userIdentifier"], text) 
      FileLogObserver.emit(self, adjusted) 

addObserver(MyObserver(...).emit) 

. 방금 간단한 텍스트 형식으로 작성했지만 이제는 각 사용자의 이벤트를 전용 로그 파일에 작성하거나 구문 분석하기가 더 쉬운 구조화 된 로그 형식을 사용하는 것과 같은 작업을 수행 할 수 있습니다.

이 방법이 지금까지 유용했지만 실제로 특정 사용자 이벤트를 특정 로그 이벤트에 적용하는 데 도움이되지는 않습니다. 지금까지 모든 사용자는 "alice"입니다.

먼저 사용자를 다양화할 수있는 방법을 알아 보겠습니다.한 가지 방법은 매개 변수를 userIdentifier 만드는 것입니다 : 물론

from twisted.python.log import msg 

def myLog(message, userIdentifier): 
    msg(message, userIdentifier=userIdentifier) 

, myLog 이제 좀 바보 보인다. msg으로 전화하면됩니다. 아마도 당신은 이보다 약간 더 자동적 인 것을 원할 것입니다. 당신이 그것을 통과 유지하지 않아도 당신은 호출에서 사용자 ID를 위로 마무리 할 수 ​​

from functools import partial 

from twisted.python.log import msg 

aliceLog = partial(msg, userIdentifier="alice") 

지금 당신은 aliceLog("login")을 수행하여 앨리스에 대한 이벤트를 기록 할 수 있습니다. 아직 사용자 이름을 모르기 때문에 이것을 최상위 레벨로 정의하고 싶지는 않을 것입니다. 아마도 여러 명의 사용자가있을 것입니다. 다행히도 언제든지 쉽게 만들 수 있습니다.

지금은 남겨두고 사용자를 식별하는 방법을 고려해 보겠습니다.

많은 방법이 있으므로 단지 request.getUser()이 적합하다고 가정 할 것입니다. 이것을 실제로 사용하고 싶은 다른 메커니즘으로 바꾸십시오.

이제이 정보를 추적해야합니다. 한 가지 간단한 접근법은 사용자와 관련된 이벤트를 기록하려는 코드에 인수로 전달하는 것입니다. 사용자에게 관련된 이벤트를 기록하려는 코드가 실제로 어떤 사용자가 행동하는지 파악해야하므로 실제로는 부담이되지 않기를 바랍니다.

이것은 꼬인 웹의 약간 털이 많은 영역에 들어갑니다. 순회 시스템 (즉, getChild)은 매우 유연하며 사용 방법에 따라 궁극적 인 소비자에게 정보를 전달하는 방식이 매우 다양 할 수 있습니다.

이렇게하는 한 가지 방법은 투명한 IResource 래퍼를 사용하는 것입니다. 여기서 아이디어는 세그먼트를 소비하지 않고 요청을 검사하고 사용자 식별자와 같은 유용한 상태를 만드는 IResource를 계층 구조에 삽입하는 것입니다. 예 :

from twisted.web.resource import IResource 
from twisted.python.components import proxyForInterface 

class GiveChildrenUserInfo(proxyForInterface(IResource)): 
    def getChild(self, request, segment): 
     child = self.original.getChild(request, segment) 
     child.setUser(request.getUser()) 
     return GiveChildrenUserInfo(child) 

rootResource = GiveChildrenUserInfo(actualRootResource) 
... 

이 점에 유의하십시오. 첫째, 모든 리소스가 이제 구현되어야하는 setUser 메서드를 만들었습니다. 이 요청은 사용자가 요청에서 가져온 모든 리소스에서 호출됩니다. 이제 이러한 리소스는 해당 사용자 정보를 사용할 수 있습니다. 예를 들어 msg(message, userIdentifier=user)을 호출하거나 위에서 설명한 것처럼 partial을 사용하여 로그 도우퍼를 정의 할 수 있습니다.

로깅과 관련하여 여기에서 다룰 내용이 아직 많이 있지만, 시작해서 가능한 방향을 보여주기에 충분할 것으로 기대됩니다.

+0

진, 감사합니다. +1. –