Logging Control
Overview
peer
응용 프로그램 및 shim
인터페이스에서 체인 코드 로깅은 github.com/op/go-logging
패키지에서 제공하는 기능을 사용하여 프로그래밍 됩니다. 이 패키지는
- 메시지의 심각도를 기반으로 로깅 제어
- 메시지를 생성하는 소프트웨어 모듈을 기반으로 한 로깅 제어
- 메시지의 심각도를 기반으로 한 다양한 pretty-printing 옵션
모든 로그는 현재 stderr
로 이동되며 pretty-printing은 현재 수정되었습니다. 그러나 심각도 별 로깅의 전역 및 모듈 수준 제어는 사용자와 개발자 모두에게 제공됩니다. 현재 각 심각도 수준에서 제공되는 정보 유형에 대한 형식화 된 규칙은 없지만 버그 보고서를 제출할 때 개발자는 전체 로그를 DEBUG 수준으로 보고 싶어 할 수 있습니다.
pretty-printing 로그에서 로깅 수준은 색상과 4 자리 코드로 표시됩니다 (예 : ERROR에 ERRO, DEBU에 DEBUG 등). 로깅 컨텍스트에서 모듈 은 임의의 이름 (문자열)입니다. 개발자가 관련 메시지 그룹에 제공합니다. 아래의 예에서, "peer", "rest"및 "main"로깅 모듈은 로그를 생성합니다.
16:47:09.634 [peer] GetLocalAddress -> INFO 033 Auto detected peer address: 9.3.158.178:7051 16:47:09.635 [rest] StartOpenchainRESTServer -> INFO 035 Initializing the REST service... 16:47:09.635 [main] serve -> INFO 036 Starting peer with id=name:"vp1" , network id=dev, address=9.3.158.178:7051, discovery.rootnode=, validator=true
런타임에 임의의 수의 로깅 모듈을 생성할 수 있으므로 모듈의 "마스터 목록"이 없고 로깅 제어 구조가 로깅 모듈이 실제로 존재하는지 또는 존재하는지 여부를 확인할 수 없습니다. 또한 로깅 모듈 시스템은 계층 구조 또는 와일드 카드를 이해하지 못합니다. 코드에서 "foo/bar"와 같은 모듈 이름을 볼 수 있지만 로깅 시스템은 플랫 문자열만 볼 수 있습니다. "foo/bar"는 어떤 식 으로든 "foo"와 관련이 있거나 "foo/*"가 foo의 모든 "하위 모듈"을 나타낼 수 있다는 것을 이해하지 못합니다.
peer
peer
명령의 로깅 수준은 --logging-level
플래그를 사용하여 각 호출에 대해 명령 줄에서 제어 할 수 있습니다 ( 예 :
peer node start --logging-level=debug
각 개별 peer
하위 명령의 기본 로깅 레벨은 core.yaml 파일에서 설정할 수도 있습니다. 예를 들어, 키 logging.node
는 node
서브 커맨드의 기본 레벨을 설정합니다. 이 파일의 주석은 환경 변수를 사용하여 다양한 방법으로 로깅 수준을 재정의하는 방법을 설명합니다.
로깅 심각도 수준은 다음에서 선택된 대/소문자를 구분하지 않는 문자열을 사용하여 지정됩니다.
CRITICAL | ERROR | WARNING | NOTICE | INFO | DEBUG
peer
의 전체 로깅 수준 사양은 다음과 같습니다.
[<module>[,<module>...]=]<level>[:[<module>[,<module>...]=]<level>...]
로깅 레벨 자체가 전체 기본값으로 간주됩니다. 그렇지 않으면 모듈의 개별 또는 그룹에 대한 재정의는 다음을 사용하여 지정할 수 있습니다.
<module>[,<module>...]=<level>
구문. 사양 예 ( --logging-level
, 환경 변수 및 core.yaml 설정 모두에 유효 ) :
info - Set default to INFO warning:main,db=debug:chaincode=info - Default WARNING; Override for main,db,chaincode chaincode=info:main=debug:db=debug:warning - Same as above
Go chaincodes
체인 코드 애플리케이션 내에서 로그하는 표준 메커니즘은 피어를 통해 각 체인 코드 인스턴스에 노출된 로깅 전송과 통합하는 것입니다. chaincode shim
패키지는 체인 코드가 로그를 형식화하고 shim
로그와 일관되게 인터리브되는 로깅 객체를 생성하고 관리할 수 있게 해주는 API를 제공합니다.
독자적으로 실행되는 프로그램처럼, 사용자 제공 체인 코드는 기술적으로 stdout/stderr에 출력을 생성할 수도 있습니다. 자연적으로 "devmode"에 유용하지만 일반적으로 프로덕션 네트워크에서는 이러한 채널이 손상되어 악성 코드의 악용을 방지합니다. 그러나 CORE_VM_DOCKER_ATTACHSTDOUT = true 구성 옵션을 통해 피어가 관리하는 컨테이너 (예 : "netmode")의 경우에도 이 출력을 피어 단위로 활성화 할 수 있습니다.
일단 활성화되면, 각 체인 코드는 해당 컨테이너 ID에 의해 자체 로깅 채널을 수신하게됩니다. stdout 또는 stderr에 기록된 출력은 각 행별로 피어의 로그와 통합됩니다. 프로덕션 환경에서 이를 활성화하는 것은 권장되지 않습니다.
API
NewLogger(name string) *ChaincodeLogger
- 체인 코드에서 사용할 로깅 개체 만들기 (c *ChaincodeLogger) SetLevel(level LoggingLevel)
- 로거의 로깅 수준 설정
(c *ChaincodeLogger) IsEnabledFor(level LoggingLevel) bool
- 지정된 레벨에서 로그가 생성되면 true를 반환합니다.
LogLevel(levelString string) (LoggingLevel, error)
- 문자열을 LoggingLevel
로 변환하십시오.
LoggingLevel
은 열거 형의 멤버입니다.
LogDebug, LogInfo, LogNotice, LogWarning, LogError, LogCritical
대/소문자를 구별하지 않는 버전의 문자열을 전달하여 직접 사용할 수 있습니다.
DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL
LogLevel
API.
다양한 심각도 수준의 형식화 된 로깅은 함수에 의해 제공됩니다.
(c *ChaincodeLogger) Debug(args ...interface{}) (c *ChaincodeLogger) Info(args ...interface{}) (c *ChaincodeLogger) Notice(args ...interface{}) (c *ChaincodeLogger) Warning(args ...interface{}) (c *ChaincodeLogger) Error(args ...interface{}) (c *ChaincodeLogger) Critical(args ...interface{}) (c *ChaincodeLogger) Debugf(format string, args ...interface{}) (c *ChaincodeLogger) Infof(format string, args ...interface{}) (c *ChaincodeLogger) Noticef(format string, args ...interface{}) (c *ChaincodeLogger) Warningf(format string, args ...interface{}) (c *ChaincodeLogger) Errorf(format string, args ...interface{}) (c *ChaincodeLogger) Criticalf(format string, args ...interface{})
f
형식의 로깅 API는 로그의 형식을 정확하게 제어합니다. 비 f
형식의 API는 현재 인수의 출력 표현 사이에 공백을 삽입하고 임의로 사용할 형식을 선택합니다.
현재 구현에서 shim
및 ChaincodeLogger
에 의해 생성된 로그에는 타임 스탬프가 지정 되고 로거 이름 및 심각도 수준이 표시되며 stderr
에 기록됩니다. 로깅 레벨 컨트롤은 현재 ChaincodeLogger
가 생성 될 때 제공된 이름을 기반으로 합니다. 모호함을 피하기 위해 모든 ChaincodeLogger
에는 "shim" 이외의 고유한 이름을 지정 해야합니다. 로거 이름 은 로거에 의해 작성된 모든 로그 메시지에 나타납니다. shim
은 "심"으로 기록됩니다.
Go 언어 체인 코드는 SetLoggingLevel
API를 통해 체인 코드 shim
인터페이스의 로깅 수준을 제어 할 수도 있습니다.
SetLoggingLevel(LoggingLevel level)
- 심의 로깅 수준 제어
shim의 기본 로깅 수준은 LogDebug
입니다.
다음은 체인 코드가 LogInfo
레벨에서 로깅하는 개인 로깅 오브젝트를 작성하는 방법과 환경 변수를 기반으로 shim
이 제공하는 로깅의 양을 제어 하는 간단한 예제입니다.
var logger = shim.NewLogger("myChaincode")
func main() {
logger.SetLevel(shim.LogInfo)
logLevel, _ := shim.LogLevel(os.Getenv("SHIM_LOGGING_LEVEL"))
shim.SetLoggingLevel(logLevel)
...
}
출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/logging-control.html