Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
f2ab351e
Commit
f2ab351e
authored
Jan 25, 2016
by
Felix Lange
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2136 from fjl/glog-prefix
logger/glog: improve vmodule
parents
6e6931ef
e4d79485
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
112 additions
and
92 deletions
+112
-92
glog.go
logger/glog/glog.go
+58
-36
glog_test.go
logger/glog/glog_test.go
+36
-15
api.go
node/api.go
+5
-0
admin.go
rpc/api/admin.go
+0
-12
admin_args.go
rpc/api/admin_args.go
+0
-22
admin_js.go
rpc/api/admin_js.go
+0
-6
debug_js.go
rpc/api/debug_js.go
+13
-1
No files found.
logger/glog/glog.go
View file @
f2ab351e
...
@@ -63,11 +63,17 @@
...
@@ -63,11 +63,17 @@
// Enable V-leveled logging at the specified level.
// Enable V-leveled logging at the specified level.
// -vmodule=""
// -vmodule=""
// The syntax of the argument is a comma-separated list of pattern=N,
// The syntax of the argument is a comma-separated list of pattern=N,
// where pattern is a literal file name (minus the ".go" suffix) or
// where pattern is a literal file name or "glob" pattern matching
// "glob" pattern and N is a V level. For instance,
// and N is a V level. For instance,
// -vmodule=gopher*=3
// sets the V level to 3 in all Go files whose names begin "gopher".
//
//
// -vmodule=gopher.go=3
// sets the V level to 3 in all Go files named "gopher.go".
//
// -vmodule=foo=3
// sets V to 3 in all files of any packages whose import path ends in "foo".
//
// -vmodule=foo/*=3
// sets V to 3 in all files of any packages whose import path contains "foo".
package
glog
package
glog
import
(
import
(
...
@@ -78,7 +84,7 @@ import (
...
@@ -78,7 +84,7 @@ import (
"io"
"io"
stdLog
"log"
stdLog
"log"
"os"
"os"
"
path/filepath
"
"
regexp
"
"runtime"
"runtime"
"strconv"
"strconv"
"strings"
"strings"
...
@@ -113,11 +119,30 @@ var severityName = []string{
...
@@ -113,11 +119,30 @@ var severityName = []string{
fatalLog
:
"FATAL"
,
fatalLog
:
"FATAL"
,
}
}
// these path prefixes are trimmed for display, but not when
// matching vmodule filters.
var
trimPrefixes
=
[]
string
{
"/github.com/ethereum/go-ethereum"
,
"/github.com/ethereum/ethash"
,
}
func
trimToImportPath
(
file
string
)
string
{
if
root
:=
strings
.
LastIndex
(
file
,
"src/"
);
root
!=
0
{
file
=
file
[
root
+
3
:
]
}
return
file
}
// SetV sets the global verbosity level
// SetV sets the global verbosity level
func
SetV
(
v
int
)
{
func
SetV
(
v
int
)
{
logging
.
verbosity
.
set
(
Level
(
v
))
logging
.
verbosity
.
set
(
Level
(
v
))
}
}
// SetVmodule sets the global verbosity patterns.
func
SetVmodule
(
pat
string
)
error
{
return
logging
.
vmodule
.
Set
(
pat
)
}
// SetToStderr sets the global output style
// SetToStderr sets the global output style
func
SetToStderr
(
toStderr
bool
)
{
func
SetToStderr
(
toStderr
bool
)
{
logging
.
toStderr
=
toStderr
logging
.
toStderr
=
toStderr
...
@@ -261,21 +286,10 @@ type moduleSpec struct {
...
@@ -261,21 +286,10 @@ type moduleSpec struct {
// modulePat contains a filter for the -vmodule flag.
// modulePat contains a filter for the -vmodule flag.
// It holds a verbosity level and a file pattern to match.
// It holds a verbosity level and a file pattern to match.
type
modulePat
struct
{
type
modulePat
struct
{
pattern
string
pattern
*
regexp
.
Regexp
literal
bool
// The pattern is a literal string
level
Level
level
Level
}
}
// match reports whether the file matches the pattern. It uses a string
// comparison if the pattern contains no metacharacters.
func
(
m
*
modulePat
)
match
(
file
string
)
bool
{
if
m
.
literal
{
return
file
==
m
.
pattern
}
match
,
_
:=
filepath
.
Match
(
m
.
pattern
,
file
)
return
match
}
func
(
m
*
moduleSpec
)
String
()
string
{
func
(
m
*
moduleSpec
)
String
()
string
{
// Lock because the type is not atomic. TODO: clean this up.
// Lock because the type is not atomic. TODO: clean this up.
logging
.
mu
.
Lock
()
logging
.
mu
.
Lock
()
...
@@ -322,7 +336,8 @@ func (m *moduleSpec) Set(value string) error {
...
@@ -322,7 +336,8 @@ func (m *moduleSpec) Set(value string) error {
continue
// Ignore. It's harmless but no point in paying the overhead.
continue
// Ignore. It's harmless but no point in paying the overhead.
}
}
// TODO: check syntax of filter?
// TODO: check syntax of filter?
filter
=
append
(
filter
,
modulePat
{
pattern
,
isLiteral
(
pattern
),
Level
(
v
)})
re
,
_
:=
compileModulePattern
(
pattern
)
filter
=
append
(
filter
,
modulePat
{
re
,
Level
(
v
)})
}
}
logging
.
mu
.
Lock
()
logging
.
mu
.
Lock
()
defer
logging
.
mu
.
Unlock
()
defer
logging
.
mu
.
Unlock
()
...
@@ -330,10 +345,21 @@ func (m *moduleSpec) Set(value string) error {
...
@@ -330,10 +345,21 @@ func (m *moduleSpec) Set(value string) error {
return
nil
return
nil
}
}
// isLiteral reports whether the pattern is a literal string, that is, has no metacharacters
// compiles a vmodule pattern to a regular expression.
// that require filepath.Match to be called to match the pattern.
func
compileModulePattern
(
pat
string
)
(
*
regexp
.
Regexp
,
error
)
{
func
isLiteral
(
pattern
string
)
bool
{
re
:=
".*"
return
!
strings
.
ContainsAny
(
pattern
,
`\*?[]`
)
for
_
,
comp
:=
range
strings
.
Split
(
pat
,
"/"
)
{
if
comp
==
"*"
{
re
+=
"(/.*)?"
}
else
if
comp
!=
""
{
// TODO: maybe return error if comp contains *
re
+=
"/"
+
regexp
.
QuoteMeta
(
comp
)
}
}
if
!
strings
.
HasSuffix
(
pat
,
".go"
)
{
re
+=
"/[^/]+
\\
.go"
}
return
regexp
.
Compile
(
re
+
"$"
)
}
}
// traceLocation represents the setting of the -log_backtrace_at flag.
// traceLocation represents the setting of the -log_backtrace_at flag.
...
@@ -556,10 +582,14 @@ func (l *loggingT) header(s severity, depth int) (*buffer, string, int) {
...
@@ -556,10 +582,14 @@ func (l *loggingT) header(s severity, depth int) (*buffer, string, int) {
file
=
"???"
file
=
"???"
line
=
1
line
=
1
}
else
{
}
else
{
slash
:=
strings
.
LastIndex
(
file
,
"/"
)
file
=
trimToImportPath
(
file
)
if
slash
>=
0
{
for
_
,
p
:=
range
trimPrefixes
{
file
=
file
[
slash
+
1
:
]
if
strings
.
HasPrefix
(
file
,
p
)
{
file
=
file
[
len
(
p
)
:
]
break
}
}
}
file
=
file
[
1
:
]
// drop '/'
}
}
return
l
.
formatHeader
(
s
,
file
,
line
),
file
,
line
return
l
.
formatHeader
(
s
,
file
,
line
),
file
,
line
}
}
...
@@ -592,9 +622,7 @@ func (l *loggingT) formatHeader(s severity, file string, line int) *buffer {
...
@@ -592,9 +622,7 @@ func (l *loggingT) formatHeader(s severity, file string, line int) *buffer {
buf
.
tmp
[
14
]
=
'.'
buf
.
tmp
[
14
]
=
'.'
buf
.
nDigits
(
6
,
15
,
now
.
Nanosecond
()
/
1000
,
'0'
)
buf
.
nDigits
(
6
,
15
,
now
.
Nanosecond
()
/
1000
,
'0'
)
buf
.
tmp
[
21
]
=
' '
buf
.
tmp
[
21
]
=
' '
buf
.
nDigits
(
7
,
22
,
pid
,
' '
)
// TODO: should be TID
buf
.
Write
(
buf
.
tmp
[
:
22
])
buf
.
tmp
[
29
]
=
' '
buf
.
Write
(
buf
.
tmp
[
:
30
])
buf
.
WriteString
(
file
)
buf
.
WriteString
(
file
)
buf
.
tmp
[
0
]
=
':'
buf
.
tmp
[
0
]
=
':'
n
:=
buf
.
someDigits
(
1
,
line
)
n
:=
buf
.
someDigits
(
1
,
line
)
...
@@ -976,15 +1004,9 @@ func (lb logBridge) Write(b []byte) (n int, err error) {
...
@@ -976,15 +1004,9 @@ func (lb logBridge) Write(b []byte) (n int, err error) {
func
(
l
*
loggingT
)
setV
(
pc
uintptr
)
Level
{
func
(
l
*
loggingT
)
setV
(
pc
uintptr
)
Level
{
fn
:=
runtime
.
FuncForPC
(
pc
)
fn
:=
runtime
.
FuncForPC
(
pc
)
file
,
_
:=
fn
.
FileLine
(
pc
)
file
,
_
:=
fn
.
FileLine
(
pc
)
// The file is something like /a/b/c/d.go. We want just the d.
file
=
trimToImportPath
(
file
)
if
strings
.
HasSuffix
(
file
,
".go"
)
{
file
=
file
[
:
len
(
file
)
-
3
]
}
if
slash
:=
strings
.
LastIndex
(
file
,
"/"
);
slash
>=
0
{
file
=
file
[
slash
+
1
:
]
}
for
_
,
filter
:=
range
l
.
vmodule
.
filter
{
for
_
,
filter
:=
range
l
.
vmodule
.
filter
{
if
filter
.
match
(
file
)
{
if
filter
.
pattern
.
MatchString
(
file
)
{
l
.
vmap
[
pc
]
=
filter
.
level
l
.
vmap
[
pc
]
=
filter
.
level
return
filter
.
level
return
filter
.
level
}
}
...
...
logger/glog/glog_test.go
View file @
f2ab351e
...
@@ -180,7 +180,7 @@ func TestHeader(t *testing.T) {
...
@@ -180,7 +180,7 @@ func TestHeader(t *testing.T) {
pid
=
1234
pid
=
1234
Info
(
"test"
)
Info
(
"test"
)
var
line
int
var
line
int
format
:=
"I0102 15:04:05.067890
1234
glog_test.go:%d] test
\n
"
format
:=
"I0102 15:04:05.067890
logger/glog/
glog_test.go:%d] test
\n
"
n
,
err
:=
fmt
.
Sscanf
(
contents
(
infoLog
),
format
,
&
line
)
n
,
err
:=
fmt
.
Sscanf
(
contents
(
infoLog
),
format
,
&
line
)
if
n
!=
1
||
err
!=
nil
{
if
n
!=
1
||
err
!=
nil
{
t
.
Errorf
(
"log format error: %d elements, error %s:
\n
%s"
,
n
,
err
,
contents
(
infoLog
))
t
.
Errorf
(
"log format error: %d elements, error %s:
\n
%s"
,
n
,
err
,
contents
(
infoLog
))
...
@@ -253,7 +253,7 @@ func TestV(t *testing.T) {
...
@@ -253,7 +253,7 @@ func TestV(t *testing.T) {
func
TestVmoduleOn
(
t
*
testing
.
T
)
{
func
TestVmoduleOn
(
t
*
testing
.
T
)
{
setFlags
()
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
defer
logging
.
swap
(
logging
.
newBuffers
())
logging
.
vmodule
.
Set
(
"glog_test=2"
)
logging
.
vmodule
.
Set
(
"glog_test
.go
=2"
)
defer
logging
.
vmodule
.
Set
(
""
)
defer
logging
.
vmodule
.
Set
(
""
)
if
!
V
(
1
)
{
if
!
V
(
1
)
{
t
.
Error
(
"V not enabled for 1"
)
t
.
Error
(
"V not enabled for 1"
)
...
@@ -290,22 +290,43 @@ func TestVmoduleOff(t *testing.T) {
...
@@ -290,22 +290,43 @@ func TestVmoduleOff(t *testing.T) {
}
}
}
}
var
patternTests
=
[]
struct
{
input
,
want
string
}{
{
"foo/bar/x.go"
,
".*/foo/bar/x
\\
.go$"
},
{
"foo/*/x.go"
,
".*/foo(/.*)?/x
\\
.go$"
},
{
"foo/*"
,
".*/foo(/.*)?/[^/]+
\\
.go$"
},
}
func
TestCompileModulePattern
(
t
*
testing
.
T
)
{
for
_
,
test
:=
range
patternTests
{
re
,
err
:=
compileModulePattern
(
test
.
input
)
if
err
!=
nil
{
t
.
Fatalf
(
"%s: %v"
,
err
)
}
if
re
.
String
()
!=
test
.
want
{
t
.
Errorf
(
"mismatch for %q: got %q, want %q"
,
test
.
input
,
re
.
String
(),
test
.
want
)
}
}
}
// vGlobs are patterns that match/don't match this file at V=2.
// vGlobs are patterns that match/don't match this file at V=2.
var
vGlobs
=
map
[
string
]
bool
{
var
vGlobs
=
map
[
string
]
bool
{
// Easy to test the numeric match here.
// Easy to test the numeric match here.
"glog_test=1"
:
false
,
// If -vmodule sets V to 1, V(2) will fail.
"glog_test.go=1"
:
false
,
// If -vmodule sets V to 1, V(2) will fail.
"glog_test=2"
:
true
,
"glog_test.go=2"
:
true
,
"glog_test=3"
:
true
,
// If -vmodule sets V to 1, V(3) will succeed.
"glog_test.go=3"
:
true
,
// If -vmodule sets V to 1, V(3) will succeed.
// These all use 2 and check the patterns. All are true.
"*=2"
:
true
,
// Import path prefix matching
"?l*=2"
:
true
,
"logger/glog=1"
:
false
,
"????_*=2"
:
true
,
"logger/glog=2"
:
true
,
"??[mno]?_*t=2"
:
true
,
"logger/glog=3"
:
true
,
// These all use 2 and check the patterns. All are false.
"*x=2"
:
false
,
// Import path glob matching
"m*=2"
:
false
,
"logger/*=1"
:
false
,
"??_*=2"
:
false
,
"logger/*=2"
:
true
,
"?[abc]?_*t=2"
:
false
,
"logger/*=3"
:
true
,
// These all use 2 and check the patterns.
"*=2"
:
true
,
}
}
// Test that vmodule globbing works as advertised.
// Test that vmodule globbing works as advertised.
...
...
node/api.go
View file @
f2ab351e
...
@@ -138,6 +138,11 @@ func (api *PrivateDebugAPI) Verbosity(level int) {
...
@@ -138,6 +138,11 @@ func (api *PrivateDebugAPI) Verbosity(level int) {
glog
.
SetV
(
level
)
glog
.
SetV
(
level
)
}
}
// Vmodule updates the node's logging verbosity pattern.
func
(
api
*
PrivateDebugAPI
)
Vmodule
(
pattern
string
)
error
{
return
glog
.
SetVmodule
(
pattern
)
}
// PublicDebugAPI is the collection of debugging related API methods exposed over
// PublicDebugAPI is the collection of debugging related API methods exposed over
// both secure and unsecure RPC channels.
// both secure and unsecure RPC channels.
type
PublicDebugAPI
struct
{
type
PublicDebugAPI
struct
{
...
...
rpc/api/admin.go
View file @
f2ab351e
...
@@ -31,7 +31,6 @@ import (
...
@@ -31,7 +31,6 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rlp"
...
@@ -55,7 +54,6 @@ var (
...
@@ -55,7 +54,6 @@ var (
"admin_nodeInfo"
:
(
*
adminApi
)
.
NodeInfo
,
"admin_nodeInfo"
:
(
*
adminApi
)
.
NodeInfo
,
"admin_exportChain"
:
(
*
adminApi
)
.
ExportChain
,
"admin_exportChain"
:
(
*
adminApi
)
.
ExportChain
,
"admin_importChain"
:
(
*
adminApi
)
.
ImportChain
,
"admin_importChain"
:
(
*
adminApi
)
.
ImportChain
,
"admin_verbosity"
:
(
*
adminApi
)
.
Verbosity
,
"admin_setSolc"
:
(
*
adminApi
)
.
SetSolc
,
"admin_setSolc"
:
(
*
adminApi
)
.
SetSolc
,
"admin_datadir"
:
(
*
adminApi
)
.
DataDir
,
"admin_datadir"
:
(
*
adminApi
)
.
DataDir
,
"admin_startRPC"
:
(
*
adminApi
)
.
StartRPC
,
"admin_startRPC"
:
(
*
adminApi
)
.
StartRPC
,
...
@@ -225,16 +223,6 @@ func (self *adminApi) ExportChain(req *shared.Request) (interface{}, error) {
...
@@ -225,16 +223,6 @@ func (self *adminApi) ExportChain(req *shared.Request) (interface{}, error) {
return
true
,
nil
return
true
,
nil
}
}
func
(
self
*
adminApi
)
Verbosity
(
req
*
shared
.
Request
)
(
interface
{},
error
)
{
args
:=
new
(
VerbosityArgs
)
if
err
:=
self
.
coder
.
Decode
(
req
.
Params
,
&
args
);
err
!=
nil
{
return
nil
,
shared
.
NewDecodeParamError
(
err
.
Error
())
}
glog
.
SetV
(
args
.
Level
)
return
true
,
nil
}
func
(
self
*
adminApi
)
SetSolc
(
req
*
shared
.
Request
)
(
interface
{},
error
)
{
func
(
self
*
adminApi
)
SetSolc
(
req
*
shared
.
Request
)
(
interface
{},
error
)
{
args
:=
new
(
SetSolcArgs
)
args
:=
new
(
SetSolcArgs
)
if
err
:=
self
.
coder
.
Decode
(
req
.
Params
,
&
args
);
err
!=
nil
{
if
err
:=
self
.
coder
.
Decode
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
rpc/api/admin_args.go
View file @
f2ab351e
...
@@ -69,28 +69,6 @@ func (args *ImportExportChainArgs) UnmarshalJSON(b []byte) (err error) {
...
@@ -69,28 +69,6 @@ func (args *ImportExportChainArgs) UnmarshalJSON(b []byte) (err error) {
return
nil
return
nil
}
}
type
VerbosityArgs
struct
{
Level
int
}
func
(
args
*
VerbosityArgs
)
UnmarshalJSON
(
b
[]
byte
)
(
err
error
)
{
var
obj
[]
interface
{}
if
err
:=
json
.
Unmarshal
(
b
,
&
obj
);
err
!=
nil
{
return
shared
.
NewDecodeParamError
(
err
.
Error
())
}
if
len
(
obj
)
!=
1
{
return
shared
.
NewDecodeParamError
(
"Expected enode as argument"
)
}
level
,
err
:=
numString
(
obj
[
0
])
if
err
==
nil
{
args
.
Level
=
int
(
level
.
Int64
())
}
return
nil
}
type
SetSolcArgs
struct
{
type
SetSolcArgs
struct
{
Path
string
Path
string
}
}
...
...
rpc/api/admin_js.go
View file @
f2ab351e
...
@@ -45,12 +45,6 @@ web3._extend({
...
@@ -45,12 +45,6 @@ web3._extend({
params: 2,
params: 2,
inputFormatter: [null, null]
inputFormatter: [null, null]
}),
}),
new web3._extend.Method({
name: 'verbosity',
call: 'admin_verbosity',
params: 1,
inputFormatter: [web3._extend.utils.fromDecimal]
}),
new web3._extend.Method({
new web3._extend.Method({
name: 'setSolc',
name: 'setSolc',
call: 'admin_setSolc',
call: 'admin_setSolc',
...
...
rpc/api/debug_js.go
View file @
f2ab351e
...
@@ -62,7 +62,19 @@ web3._extend({
...
@@ -62,7 +62,19 @@ web3._extend({
call: 'debug_metrics',
call: 'debug_metrics',
params: 1,
params: 1,
inputFormatter: [null]
inputFormatter: [null]
})
}),
new web3._extend.Method({
name: 'verbosity',
call: 'debug_verbosity',
params: 1,
inputFormatter: [web3._extend.utils.fromDecimal]
}),
new web3._extend.Method({
name: 'vmodule',
call: 'debug_vmodule',
params: 1,
inputFormatter: [null]
}),
],
],
properties:
properties:
[
[
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment