Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 015582c

Browse files
Aleksandar LikicGerrit Code Review
authored andcommitted
Merge "[FAB-7113] Init default logger when not set"
2 parents e5f4954 + ce72cd1 commit 015582c

File tree

14 files changed

+236
-181
lines changed

14 files changed

+236
-181
lines changed

api/apilogging/logger.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ type Logger interface {
5151
Errorln(args ...interface{})
5252
}
5353

54+
// TODO: Leveler allows log levels to be enabled or disabled
55+
//type Leveler interface {
56+
// SetLevel(module string, level Level)
57+
// GetLevel(module string) Level
58+
// IsEnabledFor(module string, level Level) bool
59+
// LogLevel(level string) (Level, error)
60+
//}
61+
5462
// Level defines all available log levels for log messages.
5563
type Level int
5664

@@ -63,7 +71,8 @@ const (
6371
DEBUG
6472
)
6573

66-
//LoggingProvider - logging provider factory
67-
type LoggingProvider interface {
74+
// LoggerProvider is a factory for module loggers
75+
// TODO: should this be renamed to LoggerFactory?
76+
type LoggerProvider interface {
6877
GetLogger(module string) Logger
6978
}

def/fabapi/fabapi.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package fabapi
1010
import (
1111
"github.com/hyperledger/fabric-sdk-go/api/apiconfig"
1212
"github.com/hyperledger/fabric-sdk-go/api/apifabclient"
13+
"github.com/hyperledger/fabric-sdk-go/api/apilogging"
1314
"github.com/hyperledger/fabric-sdk-go/api/apitxn"
1415

1516
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
@@ -28,18 +29,19 @@ import (
2829
type Options struct {
2930
// Quick access options
3031
ConfigFile string
31-
//OrgID string // TODO: separate into context options
3232

3333
// Options for default providers
3434
ConfigOpts opt.ConfigOpts
3535
StateStoreOpts opt.StateStoreOpts
3636

37-
// Factory methods to create clients and providers
37+
// Factories to create clients and providers
3838
ProviderFactory context.SDKProviderFactory
3939
ContextFactory context.OrgClientFactory
4040
SessionFactory context.SessionClientFactory
4141

42-
// TODO extract hard-coded logger
42+
// Factories for creating package-level utilities (keep this to a minimum)
43+
// TODO: Should the logger actually be in ProviderFactory
44+
LoggerFactory apilogging.LoggerProvider
4345
}
4446

4547
// FabricSDK provides access (and context) to clients being managed by the SDK
@@ -90,10 +92,11 @@ func NewSDK(options Options) (*FabricSDK, error) {
9092
Options: options,
9193
}
9294

93-
//Initialize logging provider with default logging provider if not yet initialized
94-
if !logging.IsLoggerInitialized() {
95-
logging.InitLogger(deflogger.GetLoggingProvider())
95+
// Initialize logging provider with default logging provider (if needed)
96+
if sdk.LoggerFactory == nil {
97+
sdk.LoggerFactory = deflogger.LoggerProvider()
9698
}
99+
logging.InitLogger(sdk.LoggerFactory)
97100

98101
// Initialize default factories (if needed)
99102
if sdk.ProviderFactory == nil {

def/fabapi/singleton_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// +build testing
2+
3+
/*
4+
Copyright SecureKey Technologies Inc. All Rights Reserved.
5+
6+
SPDX-License-Identifier: Apache-2.0
7+
*/
8+
9+
package fabapi
10+
11+
import (
12+
"testing"
13+
14+
"github.com/hyperledger/fabric-sdk-go/api/apilogging"
15+
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
16+
"github.com/hyperledger/fabric-sdk-go/pkg/logging/deflogger"
17+
)
18+
19+
func TestDefLoggerFactory(t *testing.T) {
20+
// Cleanup logging singleton
21+
logging.UnsafeReset()
22+
23+
// create SDK with default logger
24+
setup := Options{
25+
ConfigFile: "../../test/fixtures/config/config_test.yaml",
26+
}
27+
28+
_, err := NewSDK(setup)
29+
if err != nil {
30+
t.Fatalf("Error initializing SDK: %s", err)
31+
}
32+
33+
const moduleName = "mymodule"
34+
l1, err := logging.GetLogger(moduleName)
35+
if err != nil {
36+
t.Fatal("Unexpected error getting logger")
37+
}
38+
39+
// output a log message to force initializatin
40+
l1.Info("message")
41+
42+
// ensure that the logger cannot be overridden
43+
// (initializing a new logger should have no effect)
44+
lf := NewMockLoggerFactory()
45+
logging.InitLogger(lf)
46+
47+
l2, err := logging.GetLogger(moduleName)
48+
if err != nil {
49+
t.Fatal("Unexpected error getting logger")
50+
}
51+
52+
// output a log message to force initializatin
53+
l2.Info("message")
54+
55+
if lf.ActiveModules[moduleName] {
56+
t.Fatal("Unexpected logger factory is set")
57+
}
58+
}
59+
60+
func TestOptLoggerFactory(t *testing.T) {
61+
// Cleanup logging singleton
62+
logging.UnsafeReset()
63+
64+
lf := NewMockLoggerFactory()
65+
66+
setup := Options{
67+
ConfigFile: "../../test/fixtures/config/config_test.yaml",
68+
LoggerFactory: lf,
69+
}
70+
71+
_, err := NewSDK(setup)
72+
if err != nil {
73+
t.Fatalf("Error initializing SDK: %s", err)
74+
}
75+
76+
const moduleName = "mymodule"
77+
l, err := logging.GetLogger(moduleName)
78+
if err != nil {
79+
t.Fatal("Unexpected error getting logger")
80+
}
81+
82+
// output a log message to force initializatin
83+
l.Info("message")
84+
85+
if !lf.ActiveModules[moduleName] {
86+
t.Fatal("Unexpected logger factory is set")
87+
}
88+
}
89+
90+
// MockLoggerFactory records the modules that have loggers
91+
type MockLoggerFactory struct {
92+
ActiveModules map[string]bool
93+
logger apilogging.LoggerProvider
94+
}
95+
96+
func NewMockLoggerFactory() *MockLoggerFactory {
97+
lf := MockLoggerFactory{}
98+
lf.ActiveModules = make(map[string]bool)
99+
lf.logger = deflogger.LoggerProvider()
100+
101+
return &lf
102+
}
103+
104+
func (lf *MockLoggerFactory) GetLogger(module string) apilogging.Logger {
105+
lf.ActiveModules[module] = true
106+
return lf.logger.GetLogger(module)
107+
}

pkg/config/config.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ import (
2626
"github.com/hyperledger/fabric-sdk-go/pkg/config/urlutil"
2727
"github.com/hyperledger/fabric-sdk-go/pkg/errors"
2828
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
29+
lu "github.com/hyperledger/fabric-sdk-go/pkg/logging/utils"
2930
)
3031

31-
var logger = logging.NewLogger("fabric_sdk_go")
32+
var logger = logging.NewLogger(logModule)
3233

3334
const (
3435
cmdRoot = "fabric_sdk"
36+
logModule = "fabric_sdk_go"
3537
defaultTimeout = time.Second * 5
3638
)
3739

@@ -77,16 +79,16 @@ func InitConfigWithCmdRoot(configFile string, cmdRootPrefix string) (*Config, er
7779
loggingLevelString := myViper.GetString("client.logging.level")
7880
logLevel := apilogging.INFO
7981
if loggingLevelString != "" {
80-
logger.Infof("fabric_sdk_go Logging level from the config: %v", loggingLevelString)
82+
logger.Debugf("%s logging level from the config: %v", logModule, loggingLevelString)
8183
var err error
8284
logLevel, err = logging.LogLevel(loggingLevelString)
8385
if err != nil {
8486
panic(err)
8587
}
8688
}
87-
logging.SetLevel("fabric_sdk_go", logLevel)
89+
logging.SetLevel(logModule, logLevel)
8890

89-
logger.Infof("fabric_sdk_go Logging level is finally set to: %s", logging.GetLevel("fabric_sdk_go"))
91+
logger.Infof("%s logging level is set to: %s", logModule, lu.LogLevelString(logging.GetLevel(logModule)))
9092
return &Config{tlsCertPool: x509.NewCertPool(), configViper: myViper}, nil
9193
}
9294

pkg/cryptosuite/bccsp/cryptosuiteimpl_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,10 @@ import (
1313

1414
"strings"
1515

16-
"os"
17-
1816
"github.com/golang/mock/gomock"
1917
"github.com/hyperledger/fabric-sdk-go/api/apiconfig/mocks"
2018
"github.com/hyperledger/fabric-sdk-go/api/apicryptosuite"
2119
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp"
22-
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
23-
"github.com/hyperledger/fabric-sdk-go/pkg/logging/deflogger"
2420
"github.com/hyperledger/fabric-sdk-go/pkg/logging/utils"
2521
)
2622

@@ -35,15 +31,6 @@ const (
3531
keyGen = "-keygent"
3632
)
3733

38-
// TestMain Load testing config
39-
func TestMain(m *testing.M) {
40-
if !logging.IsLoggerInitialized() {
41-
logging.InitLogger(deflogger.GetLoggingProvider())
42-
}
43-
44-
os.Exit(m.Run())
45-
}
46-
4734
func TestCryptoSuite(t *testing.T) {
4835

4936
//Get BCCSP implementation

pkg/cryptosuite/cryptosuite_test.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ SPDX-License-Identifier: Apache-2.0
77
package cryptosuite
88

99
import (
10-
"os"
1110
"testing"
1211

1312
"sync/atomic"
1413

15-
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
16-
"github.com/hyperledger/fabric-sdk-go/pkg/logging/deflogger"
1714
"github.com/hyperledger/fabric-sdk-go/pkg/logging/utils"
1815

1916
"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/bccsp/factory"
@@ -28,15 +25,6 @@ const (
2825
InvalidDefSuiteSetErrorMsg = "attempting to set invalid default suite"
2926
)
3027

31-
// TestMain Load testing config
32-
func TestMain(m *testing.M) {
33-
if !logging.IsLoggerInitialized() {
34-
logging.InitLogger(deflogger.GetLoggingProvider())
35-
}
36-
37-
os.Exit(m.Run())
38-
}
39-
4028
func TestGetDefault(t *testing.T) {
4129

4230
//At the beginning default suite is nil if no attempts have been made to set or get one

pkg/fabric-ca-client/fabricca_test.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import (
2424
"github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite"
2525
cryptosuiteimpl "github.com/hyperledger/fabric-sdk-go/pkg/cryptosuite/bccsp"
2626
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-ca-client/mocks"
27-
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
28-
"github.com/hyperledger/fabric-sdk-go/pkg/logging/deflogger"
2927
)
3028

3129
var configImp config.Config
@@ -36,9 +34,6 @@ var wrongCAServerURL = "http://localhost:8091"
3634

3735
// TestMain Load testing config
3836
func TestMain(m *testing.M) {
39-
if !logging.IsLoggerInitialized() {
40-
logging.InitLogger(deflogger.GetLoggingProvider())
41-
}
4237
configImp = mocks.NewMockConfig(caServerURL)
4338
cryptoSuiteProvider, _ = cryptosuiteimpl.GetSuiteByConfig(configImp)
4439
if cryptoSuiteProvider == nil {

pkg/logging/deflogger/defaultlogger.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ func (p *loggingProvider) GetLogger(module string) apilogging.Logger {
3535
return &Logger{logger: newLogger, module: module}
3636
}
3737

38-
//GetLoggingProvider returns logging provider for SDK logger
39-
func GetLoggingProvider() apilogging.LoggingProvider {
38+
//LoggerProvider returns logging provider for SDK logger
39+
func LoggerProvider() apilogging.LoggerProvider {
4040
return &loggingProvider{}
4141
}
4242

pkg/logging/deflogger/defaultlogger_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestDefaultLoggingWithCallerInfo(t *testing.T) {
2626

2727
func testDefaultLogging(t *testing.T) {
2828

29-
logger := GetLoggingProvider().GetLogger(moduleName)
29+
logger := LoggerProvider().GetLogger(moduleName)
3030

3131
//change the output to buffer
3232
var buf bytes.Buffer
@@ -86,7 +86,7 @@ func testDefaultLogging(t *testing.T) {
8686
func TestDefaultLoggingPanic(t *testing.T) {
8787

8888
//Reset custom logger, need default one
89-
logger := GetLoggingProvider().GetLogger(moduleName)
89+
logger := LoggerProvider().GetLogger(moduleName)
9090
//change the output to buffer
9191
var buf bytes.Buffer
9292
logger.(*Logger).ChangeOutput(&buf)

0 commit comments

Comments
 (0)