66package main
77
88import (
9- "fmt"
109 "os"
11- "path/filepath"
1210
1311 "decred.org/dcrwallet/v3/chain"
1412 "decred.org/dcrwallet/v3/internal/loader"
13+ "decred.org/dcrwallet/v3/internal/loggers"
1514 "decred.org/dcrwallet/v3/internal/rpc/jsonrpc"
1615 "decred.org/dcrwallet/v3/internal/rpc/rpcserver"
1716 "decred.org/dcrwallet/v3/internal/vsp"
@@ -22,98 +21,36 @@ import (
2221 "decred.org/dcrwallet/v3/wallet/udb"
2322 "github.com/decred/dcrd/connmgr/v3"
2423 "github.com/decred/slog"
25- "github.com/jrick/logrotate/rotator"
2624)
2725
28- // logWriter implements an io.Writer that outputs to both standard output and
29- // the write-end pipe of an initialized log rotator.
30- type logWriter struct {}
31-
32- func (logWriter ) Write (p []byte ) (n int , err error ) {
33- os .Stdout .Write (p )
34- if logRotator != nil {
35- logRotator .Write (p )
36- }
37- return len (p ), nil
38- }
39-
40- // Loggers per subsystem. A single backend logger is created and all subsytem
41- // loggers created from it will write to the backend. When adding new
42- // subsystems, add the subsystem logger variable here and to the
43- // subsystemLoggers map.
44- //
45- // Loggers can not be used before the log rotator has been initialized with a
46- // log file. This must be performed early during application startup by calling
47- // initLogRotator.
48- var (
49- // backendLog is the logging backend used to create all subsystem loggers.
50- // The backend must not be used before the log rotator has been initialized,
51- // or data races and/or nil pointer dereferences will occur.
52- backendLog = slog .NewBackend (logWriter {})
53-
54- // logRotator is one of the logging outputs. It should be closed on
55- // application shutdown.
56- logRotator * rotator.Rotator
57-
58- log = backendLog .Logger ("DCRW" )
59- loaderLog = backendLog .Logger ("LODR" )
60- walletLog = backendLog .Logger ("WLLT" )
61- tkbyLog = backendLog .Logger ("TKBY" )
62- syncLog = backendLog .Logger ("SYNC" )
63- grpcLog = backendLog .Logger ("GRPC" )
64- jsonrpcLog = backendLog .Logger ("RPCS" )
65- cmgrLog = backendLog .Logger ("CMGR" )
66- vspcLog = backendLog .Logger ("VSPC" )
67- )
26+ var log = loggers .MainLog
6827
6928// Initialize package-global logger variables.
7029func init () {
71- loader .UseLogger (loaderLog )
72- wallet .UseLogger (walletLog )
73- udb .UseLogger (walletLog )
74- ticketbuyer .UseLogger (tkbyLog )
75- chain .UseLogger (syncLog )
76- spv .UseLogger (syncLog )
77- p2p .UseLogger (syncLog )
78- rpcserver .UseLogger (grpcLog )
79- jsonrpc .UseLogger (jsonrpcLog )
80- connmgr .UseLogger (cmgrLog )
81- vsp .UseLogger (vspcLog )
30+ loader .UseLogger (loggers . LoaderLog )
31+ wallet .UseLogger (loggers . WalletLog )
32+ udb .UseLogger (loggers . WalletLog )
33+ ticketbuyer .UseLogger (loggers . TkbyLog )
34+ chain .UseLogger (loggers . SyncLog )
35+ spv .UseLogger (loggers . SyncLog )
36+ p2p .UseLogger (loggers . SyncLog )
37+ rpcserver .UseLogger (loggers . GrpcLog )
38+ jsonrpc .UseLogger (loggers . JsonrpcLog )
39+ connmgr .UseLogger (loggers . CmgrLog )
40+ vsp .UseLogger (loggers . VspcLog )
8241}
8342
8443// subsystemLoggers maps each subsystem identifier to its associated logger.
8544var subsystemLoggers = map [string ]slog.Logger {
86- "DCRW" : log ,
87- "LODR" : loaderLog ,
88- "WLLT" : walletLog ,
89- "TKBY" : tkbyLog ,
90- "SYNC" : syncLog ,
91- "GRPC" : grpcLog ,
92- "RPCS" : jsonrpcLog ,
93- "CMGR" : cmgrLog ,
94- "VSPC" : vspcLog ,
95- }
96-
97- // initLogRotator initializes the logging rotater to write logs to logFile and
98- // create roll files in the same directory. logSize is the size in KiB after
99- // which a log file will be rotated and compressed.
100- //
101- // This function must be called before the package-global log rotater variables
102- // are used.
103- func initLogRotator (logFile string , logSize int64 ) {
104- logDir , _ := filepath .Split (logFile )
105- err := os .MkdirAll (logDir , 0700 )
106- if err != nil {
107- fmt .Fprintf (os .Stderr , "failed to create log directory: %v\n " , err )
108- os .Exit (1 )
109- }
110- r , err := rotator .New (logFile , logSize , false , 0 )
111- if err != nil {
112- fmt .Fprintf (os .Stderr , "failed to create file rotator: %v\n " , err )
113- os .Exit (1 )
114- }
115-
116- logRotator = r
45+ "DCRW" : loggers .MainLog ,
46+ "LODR" : loggers .LoaderLog ,
47+ "WLLT" : loggers .WalletLog ,
48+ "TKBY" : loggers .TkbyLog ,
49+ "SYNC" : loggers .SyncLog ,
50+ "GRPC" : loggers .GrpcLog ,
51+ "RPCS" : loggers .JsonrpcLog ,
52+ "CMGR" : loggers .CmgrLog ,
53+ "VSPC" : loggers .VspcLog ,
11754}
11855
11956// setLogLevel sets the logging level for provided subsystem. Invalid
@@ -147,6 +84,6 @@ func setLogLevels(logLevel string) {
14784func fatalf (format string , args ... interface {}) {
14885 log .Errorf (format , args ... )
14986 os .Stdout .Sync ()
150- logRotator . Close ()
87+ loggers . CloseLogRotator ()
15188 os .Exit (1 )
15289}
0 commit comments