Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
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
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
381ac432
Commit
381ac432
authored
Jun 24, 2014
by
Tim Hockin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bump(github.com/golang/glog): d1c4472bf2efd3826f2b5bdcc02d8416798d678c
parent
b2a7d197
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
501 additions
and
0 deletions
+501
-0
LICENSE
third_party/src/github.com/golang/glog/LICENSE
+0
-0
README
third_party/src/github.com/golang/glog/README
+44
-0
glog.go
third_party/src/github.com/golang/glog/glog.go
+0
-0
glog_file.go
third_party/src/github.com/golang/glog/glog_file.go
+124
-0
glog_test.go
third_party/src/github.com/golang/glog/glog_test.go
+333
-0
No files found.
third_party/src/github.com/golang/glog/LICENSE
0 → 100644
View file @
381ac432
This diff is collapsed.
Click to expand it.
third_party/src/github.com/golang/glog/README
0 → 100644
View file @
381ac432
glog
====
Leveled execution logs for Go.
This is an efficient pure Go implementation of leveled logs in the
manner of the open source C++ package
http://code.google.com/p/google-glog
By binding methods to booleans it is possible to use the log package
without paying the expense of evaluating the arguments to the log.
Through the -vmodule flag, the package also provides fine-grained
control over logging at the file level.
The comment from glog.go introduces the ideas:
Package glog implements logging analogous to the Google-internal
C++ INFO/ERROR/V setup. It provides functions Info, Warning,
Error, Fatal, plus formatting variants such as Infof. It
also provides V-style logging controlled by the -v and
-vmodule=file=2 flags.
Basic examples:
glog.Info("Prepare to repel boarders")
glog.Fatalf("Initialization failed: %s", err)
See the documentation for the V function for an explanation
of these examples:
if glog.V(2) {
glog.Info("Starting transaction...")
}
glog.V(2).Infoln("Processed", nItems, "elements")
The repository contains an open source version of the log package
used inside Google. The master copy of the source lives inside
Google, not here. The code in this repo is for export only and is not itself
under development. Feature requests will be ignored.
Send bug reports to golang-nuts@googlegroups.com.
third_party/src/github.com/golang/glog/glog.go
0 → 100644
View file @
381ac432
This diff is collapsed.
Click to expand it.
third_party/src/github.com/golang/glog/glog_file.go
0 → 100644
View file @
381ac432
// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
//
// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// File I/O for logs.
package
glog
import
(
"errors"
"flag"
"fmt"
"os"
"os/user"
"path/filepath"
"strings"
"sync"
"time"
)
// MaxSize is the maximum size of a log file in bytes.
var
MaxSize
uint64
=
1024
*
1024
*
1800
// logDirs lists the candidate directories for new log files.
var
logDirs
[]
string
// If non-empty, overrides the choice of directory in which to write logs.
// See createLogDirs for the full list of possible destinations.
var
logDir
=
flag
.
String
(
"log_dir"
,
""
,
"If non-empty, write log files in this directory"
)
func
createLogDirs
()
{
if
*
logDir
!=
""
{
logDirs
=
append
(
logDirs
,
*
logDir
)
}
logDirs
=
append
(
logDirs
,
os
.
TempDir
())
}
var
(
pid
=
os
.
Getpid
()
program
=
filepath
.
Base
(
os
.
Args
[
0
])
host
=
"unknownhost"
userName
=
"unknownuser"
)
func
init
()
{
h
,
err
:=
os
.
Hostname
()
if
err
==
nil
{
host
=
shortHostname
(
h
)
}
current
,
err
:=
user
.
Current
()
if
err
==
nil
{
userName
=
current
.
Username
}
// Sanitize userName since it may contain filepath separators on Windows.
userName
=
strings
.
Replace
(
userName
,
`\`
,
"_"
,
-
1
)
}
// shortHostname returns its argument, truncating at the first period.
// For instance, given "www.google.com" it returns "www".
func
shortHostname
(
hostname
string
)
string
{
if
i
:=
strings
.
Index
(
hostname
,
"."
);
i
>=
0
{
return
hostname
[
:
i
]
}
return
hostname
}
// logName returns a new log file name containing tag, with start time t, and
// the name for the symlink for tag.
func
logName
(
tag
string
,
t
time
.
Time
)
(
name
,
link
string
)
{
name
=
fmt
.
Sprintf
(
"%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d"
,
program
,
host
,
userName
,
tag
,
t
.
Year
(),
t
.
Month
(),
t
.
Day
(),
t
.
Hour
(),
t
.
Minute
(),
t
.
Second
(),
pid
)
return
name
,
program
+
"."
+
tag
}
var
onceLogDirs
sync
.
Once
// create creates a new log file and returns the file and its filename, which
// contains tag ("INFO", "FATAL", etc.) and t. If the file is created
// successfully, create also attempts to update the symlink for that tag, ignoring
// errors.
func
create
(
tag
string
,
t
time
.
Time
)
(
f
*
os
.
File
,
filename
string
,
err
error
)
{
onceLogDirs
.
Do
(
createLogDirs
)
if
len
(
logDirs
)
==
0
{
return
nil
,
""
,
errors
.
New
(
"log: no log dirs"
)
}
name
,
link
:=
logName
(
tag
,
t
)
var
lastErr
error
for
_
,
dir
:=
range
logDirs
{
fname
:=
filepath
.
Join
(
dir
,
name
)
f
,
err
:=
os
.
Create
(
fname
)
if
err
==
nil
{
symlink
:=
filepath
.
Join
(
dir
,
link
)
os
.
Remove
(
symlink
)
// ignore err
os
.
Symlink
(
name
,
symlink
)
// ignore err
return
f
,
fname
,
nil
}
lastErr
=
err
}
return
nil
,
""
,
fmt
.
Errorf
(
"log: cannot create log: %v"
,
lastErr
)
}
third_party/src/github.com/golang/glog/glog_test.go
0 → 100644
View file @
381ac432
// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
//
// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
glog
import
(
"bytes"
"fmt"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
)
// Test that shortHostname works as advertised.
func
TestShortHostname
(
t
*
testing
.
T
)
{
for
hostname
,
expect
:=
range
map
[
string
]
string
{
""
:
""
,
"host"
:
"host"
,
"host.google.com"
:
"host"
,
}
{
if
got
:=
shortHostname
(
hostname
);
expect
!=
got
{
t
.
Errorf
(
"shortHostname(%q): expected %q, got %q"
,
hostname
,
expect
,
got
)
}
}
}
// flushBuffer wraps a bytes.Buffer to satisfy flushSyncWriter.
type
flushBuffer
struct
{
bytes
.
Buffer
}
func
(
f
*
flushBuffer
)
Flush
()
error
{
return
nil
}
func
(
f
*
flushBuffer
)
Sync
()
error
{
return
nil
}
// swap sets the log writers and returns the old array.
func
(
l
*
loggingT
)
swap
(
writers
[
numSeverity
]
flushSyncWriter
)
(
old
[
numSeverity
]
flushSyncWriter
)
{
l
.
mu
.
Lock
()
defer
l
.
mu
.
Unlock
()
old
=
l
.
file
for
i
,
w
:=
range
writers
{
logging
.
file
[
i
]
=
w
}
return
}
// newBuffers sets the log writers to all new byte buffers and returns the old array.
func
(
l
*
loggingT
)
newBuffers
()
[
numSeverity
]
flushSyncWriter
{
return
l
.
swap
([
numSeverity
]
flushSyncWriter
{
new
(
flushBuffer
),
new
(
flushBuffer
),
new
(
flushBuffer
),
new
(
flushBuffer
)})
}
// contents returns the specified log value as a string.
func
contents
(
s
severity
)
string
{
return
logging
.
file
[
s
]
.
(
*
flushBuffer
)
.
String
()
}
// contains reports whether the string is contained in the log.
func
contains
(
s
severity
,
str
string
,
t
*
testing
.
T
)
bool
{
return
strings
.
Contains
(
contents
(
s
),
str
)
}
// setFlags configures the logging flags how the test expects them.
func
setFlags
()
{
logging
.
toStderr
=
false
}
// Test that Info works as advertised.
func
TestInfo
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
Info
(
"test"
)
if
!
contains
(
infoLog
,
"I"
,
t
)
{
t
.
Errorf
(
"Info has wrong character: %q"
,
contents
(
infoLog
))
}
if
!
contains
(
infoLog
,
"test"
,
t
)
{
t
.
Error
(
"Info failed"
)
}
}
// Test that the header has the correct format.
func
TestHeader
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
defer
func
(
previous
func
()
time
.
Time
)
{
timeNow
=
previous
}(
timeNow
)
timeNow
=
func
()
time
.
Time
{
return
time
.
Date
(
2006
,
1
,
2
,
15
,
4
,
5
,
.678901e9
,
time
.
Local
)
}
Info
(
"test"
)
var
line
,
pid
int
n
,
err
:=
fmt
.
Sscanf
(
contents
(
infoLog
),
"I0102 15:04:05.678901 %d glog_test.go:%d] test
\n
"
,
&
pid
,
&
line
)
if
n
!=
2
||
err
!=
nil
{
t
.
Errorf
(
"log format error: %d elements, error %s:
\n
%s"
,
n
,
err
,
contents
(
infoLog
))
}
}
// Test that an Error log goes to Warning and Info.
// Even in the Info log, the source character will be E, so the data should
// all be identical.
func
TestError
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
Error
(
"test"
)
if
!
contains
(
errorLog
,
"E"
,
t
)
{
t
.
Errorf
(
"Error has wrong character: %q"
,
contents
(
errorLog
))
}
if
!
contains
(
errorLog
,
"test"
,
t
)
{
t
.
Error
(
"Error failed"
)
}
str
:=
contents
(
errorLog
)
if
!
contains
(
warningLog
,
str
,
t
)
{
t
.
Error
(
"Warning failed"
)
}
if
!
contains
(
infoLog
,
str
,
t
)
{
t
.
Error
(
"Info failed"
)
}
}
// Test that a Warning log goes to Info.
// Even in the Info log, the source character will be W, so the data should
// all be identical.
func
TestWarning
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
Warning
(
"test"
)
if
!
contains
(
warningLog
,
"W"
,
t
)
{
t
.
Errorf
(
"Warning has wrong character: %q"
,
contents
(
warningLog
))
}
if
!
contains
(
warningLog
,
"test"
,
t
)
{
t
.
Error
(
"Warning failed"
)
}
str
:=
contents
(
warningLog
)
if
!
contains
(
infoLog
,
str
,
t
)
{
t
.
Error
(
"Info failed"
)
}
}
// Test that a V log goes to Info.
func
TestV
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
logging
.
verbosity
.
Set
(
"2"
)
defer
logging
.
verbosity
.
Set
(
"0"
)
V
(
2
)
.
Info
(
"test"
)
if
!
contains
(
infoLog
,
"I"
,
t
)
{
t
.
Errorf
(
"Info has wrong character: %q"
,
contents
(
infoLog
))
}
if
!
contains
(
infoLog
,
"test"
,
t
)
{
t
.
Error
(
"Info failed"
)
}
}
// Test that a vmodule enables a log in this file.
func
TestVmoduleOn
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
logging
.
vmodule
.
Set
(
"glog_test=2"
)
defer
logging
.
vmodule
.
Set
(
""
)
if
!
V
(
1
)
{
t
.
Error
(
"V not enabled for 1"
)
}
if
!
V
(
2
)
{
t
.
Error
(
"V not enabled for 2"
)
}
if
V
(
3
)
{
t
.
Error
(
"V enabled for 3"
)
}
V
(
2
)
.
Info
(
"test"
)
if
!
contains
(
infoLog
,
"I"
,
t
)
{
t
.
Errorf
(
"Info has wrong character: %q"
,
contents
(
infoLog
))
}
if
!
contains
(
infoLog
,
"test"
,
t
)
{
t
.
Error
(
"Info failed"
)
}
}
// Test that a vmodule of another file does not enable a log in this file.
func
TestVmoduleOff
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
logging
.
vmodule
.
Set
(
"notthisfile=2"
)
defer
logging
.
vmodule
.
Set
(
""
)
for
i
:=
1
;
i
<=
3
;
i
++
{
if
V
(
Level
(
i
))
{
t
.
Errorf
(
"V enabled for %d"
,
i
)
}
}
V
(
2
)
.
Info
(
"test"
)
if
contents
(
infoLog
)
!=
""
{
t
.
Error
(
"V logged incorrectly"
)
}
}
// vGlobs are patterns that match/don't match this file at V=2.
var
vGlobs
=
map
[
string
]
bool
{
// Easy to test the numeric match here.
"glog_test=1"
:
false
,
// If -vmodule sets V to 1, V(2) will fail.
"glog_test=2"
:
true
,
"glog_test=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
,
"?l*=2"
:
true
,
"????_*=2"
:
true
,
"??[mno]?_*t=2"
:
true
,
// These all use 2 and check the patterns. All are false.
"*x=2"
:
false
,
"m*=2"
:
false
,
"??_*=2"
:
false
,
"?[abc]?_*t=2"
:
false
,
}
// Test that vmodule globbing works as advertised.
func
testVmoduleGlob
(
pat
string
,
match
bool
,
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
defer
logging
.
vmodule
.
Set
(
""
)
logging
.
vmodule
.
Set
(
pat
)
if
V
(
2
)
!=
Verbose
(
match
)
{
t
.
Errorf
(
"incorrect match for %q: got %t expected %t"
,
pat
,
V
(
2
),
match
)
}
}
// Test that a vmodule globbing works as advertised.
func
TestVmoduleGlob
(
t
*
testing
.
T
)
{
for
glob
,
match
:=
range
vGlobs
{
testVmoduleGlob
(
glob
,
match
,
t
)
}
}
func
TestRollover
(
t
*
testing
.
T
)
{
setFlags
()
var
err
error
defer
func
(
previous
func
(
error
))
{
logExitFunc
=
previous
}(
logExitFunc
)
logExitFunc
=
func
(
e
error
)
{
err
=
e
}
defer
func
(
previous
uint64
)
{
MaxSize
=
previous
}(
MaxSize
)
MaxSize
=
512
Info
(
"x"
)
// Be sure we have a file.
info
,
ok
:=
logging
.
file
[
infoLog
]
.
(
*
syncBuffer
)
if
!
ok
{
t
.
Fatal
(
"info wasn't created"
)
}
if
err
!=
nil
{
t
.
Fatalf
(
"info has initial error: %v"
,
err
)
}
fname0
:=
info
.
file
.
Name
()
Info
(
strings
.
Repeat
(
"x"
,
int
(
MaxSize
)))
// force a rollover
if
err
!=
nil
{
t
.
Fatalf
(
"info has error after big write: %v"
,
err
)
}
// Make sure the next log file gets a file name with a different
// time stamp.
//
// TODO: determine whether we need to support subsecond log
// rotation. C++ does not appear to handle this case (nor does it
// handle Daylight Savings Time properly).
time
.
Sleep
(
1
*
time
.
Second
)
Info
(
"x"
)
// create a new file
if
err
!=
nil
{
t
.
Fatalf
(
"error after rotation: %v"
,
err
)
}
fname1
:=
info
.
file
.
Name
()
if
fname0
==
fname1
{
t
.
Errorf
(
"info.f.Name did not change: %v"
,
fname0
)
}
if
info
.
nbytes
>=
MaxSize
{
t
.
Errorf
(
"file size was not reset: %d"
,
info
.
nbytes
)
}
}
func
TestLogBacktraceAt
(
t
*
testing
.
T
)
{
setFlags
()
defer
logging
.
swap
(
logging
.
newBuffers
())
// The peculiar style of this code simplifies line counting and maintenance of the
// tracing block below.
var
infoLine
string
setTraceLocation
:=
func
(
file
string
,
line
int
,
ok
bool
,
delta
int
)
{
if
!
ok
{
t
.
Fatal
(
"could not get file:line"
)
}
_
,
file
=
filepath
.
Split
(
file
)
infoLine
=
fmt
.
Sprintf
(
"%s:%d"
,
file
,
line
+
delta
)
err
:=
logging
.
traceLocation
.
Set
(
infoLine
)
if
err
!=
nil
{
t
.
Fatal
(
"error setting log_backtrace_at: "
,
err
)
}
}
{
// Start of tracing block. These lines know about each other's relative position.
_
,
file
,
line
,
ok
:=
runtime
.
Caller
(
0
)
setTraceLocation
(
file
,
line
,
ok
,
+
2
)
// Two lines between Caller and Info calls.
Info
(
"we want a stack trace here"
)
}
numAppearances
:=
strings
.
Count
(
contents
(
infoLog
),
infoLine
)
if
numAppearances
<
2
{
// Need 2 appearances, one in the log header and one in the trace:
// log_test.go:281: I0511 16:36:06.952398 02238 log_test.go:280] we want a stack trace here
// ...
// github.com/glog/glog_test.go:280 (0x41ba91)
// ...
// We could be more precise but that would require knowing the details
// of the traceback format, which may not be dependable.
t
.
Fatal
(
"got no trace back; log is "
,
contents
(
infoLog
))
}
}
func
BenchmarkHeader
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
logging
.
putBuffer
(
logging
.
header
(
infoLog
))
}
}
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