Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
企猫商务
frp
提交
899d6837
F
frp
项目概览
企猫商务
/
frp
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
frp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
899d6837
编写于
8月 23, 2016
作者:
F
fatedier
提交者:
GitHub
8月 23, 2016
浏览文件
操作
浏览文件
下载
差异文件
release v0.8.1
release v0.8.1
上级
e1ed6660
94c7f579
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
1004 addition
and
131 deletion
+1004
-131
Godeps/Godeps.json
Godeps/Godeps.json
+2
-2
src/cmd/frps/control.go
src/cmd/frps/control.go
+6
-0
src/utils/pcrypto/pcrypto.go
src/utils/pcrypto/pcrypto.go
+47
-15
src/utils/pcrypto/pcrypto_test.go
src/utils/pcrypto/pcrypto_test.go
+16
-1
vendor/github.com/astaxie/beego/logs/color.go
vendor/github.com/astaxie/beego/logs/color.go
+28
-0
vendor/github.com/astaxie/beego/logs/color_windows.go
vendor/github.com/astaxie/beego/logs/color_windows.go
+428
-0
vendor/github.com/astaxie/beego/logs/conn.go
vendor/github.com/astaxie/beego/logs/conn.go
+1
-1
vendor/github.com/astaxie/beego/logs/console.go
vendor/github.com/astaxie/beego/logs/console.go
+1
-1
vendor/github.com/astaxie/beego/logs/file.go
vendor/github.com/astaxie/beego/logs/file.go
+69
-25
vendor/github.com/astaxie/beego/logs/log.go
vendor/github.com/astaxie/beego/logs/log.go
+267
-56
vendor/github.com/astaxie/beego/logs/logger.go
vendor/github.com/astaxie/beego/logs/logger.go
+137
-28
vendor/github.com/astaxie/beego/logs/multifile.go
vendor/github.com/astaxie/beego/logs/multifile.go
+1
-1
vendor/github.com/astaxie/beego/logs/smtp.go
vendor/github.com/astaxie/beego/logs/smtp.go
+1
-1
未找到文件。
Godeps/Godeps.json
浏览文件 @
899d6837
...
...
@@ -8,8 +8,8 @@
"Deps"
:
[
{
"ImportPath"
:
"github.com/astaxie/beego/logs"
,
"Comment"
:
"v1.
6.1-5-g88c5dfa
"
,
"Rev"
:
"
88c5dfa6ead42e624c2e7d9e04eab6cb2d07412a
"
"Comment"
:
"v1.
7.0-7-gefbde1e
"
,
"Rev"
:
"
efbde1ee77517486eac03e814e01d724ddad18e6
"
},
{
"ImportPath"
:
"github.com/docopt/docopt-go"
,
...
...
src/cmd/frps/control.go
浏览文件 @
899d6837
...
...
@@ -21,6 +21,7 @@ import (
"time"
"github.com/fatedier/frp/src/models/consts"
"github.com/fatedier/frp/src/models/metric"
"github.com/fatedier/frp/src/models/msg"
"github.com/fatedier/frp/src/models/server"
"github.com/fatedier/frp/src/utils/conn"
...
...
@@ -228,6 +229,7 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string) {
}
else
if
req
.
PrivilegeKey
!=
privilegeKey
{
info
=
fmt
.
Sprintf
(
"ProxyName [%s], privilege mode authorization failed"
,
req
.
ProxyName
)
log
.
Warn
(
info
)
log
.
Debug
(
"PrivilegeKey [%s] and get [%s]"
,
privilegeKey
,
req
.
PrivilegeKey
)
return
}
}
else
{
...
...
@@ -240,6 +242,7 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string) {
}
else
if
req
.
AuthKey
!=
authKey
{
info
=
fmt
.
Sprintf
(
"ProxyName [%s], authorization failed"
,
req
.
ProxyName
)
log
.
Warn
(
info
)
log
.
Debug
(
"AuthKey [%s] and get [%s]"
,
authKey
,
req
.
AuthKey
)
return
}
}
...
...
@@ -298,6 +301,9 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string) {
return
}
// update metric's proxy status
metric
.
SetProxyInfo
(
s
.
Name
,
s
.
Type
,
s
.
BindAddr
,
s
.
UseEncryption
,
s
.
UseGzip
,
s
.
PrivilegeMode
,
s
.
CustomDomains
,
s
.
ListenPort
)
// start proxy and listen for user connections, no block
err
:=
s
.
Start
(
c
)
if
err
!=
nil
{
...
...
src/utils/pcrypto/pcrypto.go
浏览文件 @
899d6837
...
...
@@ -20,9 +20,10 @@ import (
"crypto/aes"
"crypto/cipher"
"crypto/md5"
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"io"
"io/ioutil"
)
...
...
@@ -33,35 +34,47 @@ type Pcrypto struct {
func
(
pc
*
Pcrypto
)
Init
(
key
[]
byte
)
error
{
var
err
error
pc
.
pkey
=
p
KCS7Padding
(
key
,
aes
.
BlockSize
)
pc
.
pkey
=
p
kKeyPadding
(
key
)
pc
.
paes
,
err
=
aes
.
NewCipher
(
pc
.
pkey
)
return
err
}
func
(
pc
*
Pcrypto
)
Encrypt
(
src
[]
byte
)
([]
byte
,
error
)
{
// aes
src
=
pKCS7Padding
(
src
,
aes
.
BlockSize
)
blockMode
:=
cipher
.
NewCBCEncrypter
(
pc
.
paes
,
pc
.
pkey
)
crypted
:=
make
([]
byte
,
len
(
src
))
blockMode
.
CryptBlocks
(
crypted
,
src
)
return
crypted
,
nil
src
=
pKCS5Padding
(
src
,
aes
.
BlockSize
)
ciphertext
:=
make
([]
byte
,
aes
.
BlockSize
+
len
(
src
))
// The IV needs to be unique, but not secure. Therefore it's common to
// include it at the beginning of the ciphertext.
iv
:=
ciphertext
[
:
aes
.
BlockSize
]
if
_
,
err
:=
io
.
ReadFull
(
rand
.
Reader
,
iv
);
err
!=
nil
{
return
nil
,
err
}
blockMode
:=
cipher
.
NewCBCEncrypter
(
pc
.
paes
,
iv
)
blockMode
.
CryptBlocks
(
ciphertext
[
aes
.
BlockSize
:
],
src
)
return
ciphertext
,
nil
}
func
(
pc
*
Pcrypto
)
Decrypt
(
str
[]
byte
)
([]
byte
,
error
)
{
// aes
decryptT
ext
,
err
:=
hex
.
DecodeString
(
fmt
.
Sprintf
(
"%x"
,
str
))
ciphert
ext
,
err
:=
hex
.
DecodeString
(
fmt
.
Sprintf
(
"%x"
,
str
))
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
decryptText
)
%
aes
.
BlockSize
!=
0
{
return
nil
,
errors
.
New
(
"crypto/cipher: ciphertext is not a multiple of the block size
"
)
if
len
(
ciphertext
)
<
aes
.
BlockSize
{
return
nil
,
fmt
.
Errorf
(
"ciphertext too short
"
)
}
iv
:=
ciphertext
[
:
aes
.
BlockSize
]
ciphertext
=
ciphertext
[
aes
.
BlockSize
:
]
blockMode
:=
cipher
.
NewCBCDecrypter
(
pc
.
paes
,
pc
.
pkey
)
if
len
(
ciphertext
)
%
aes
.
BlockSize
!=
0
{
return
nil
,
fmt
.
Errorf
(
"crypto/cipher: ciphertext is not a multiple of the block size"
)
}
blockMode
.
CryptBlocks
(
decryptText
,
decryptText
)
return
pKCS7UnPadding
(
decryptText
),
nil
blockMode
:=
cipher
.
NewCBCDecrypter
(
pc
.
paes
,
iv
)
blockMode
.
CryptBlocks
(
ciphertext
,
ciphertext
)
return
pKCS5UnPadding
(
ciphertext
),
nil
}
func
(
pc
*
Pcrypto
)
Compression
(
src
[]
byte
)
([]
byte
,
error
)
{
...
...
@@ -87,13 +100,32 @@ func (pc *Pcrypto) Decompression(src []byte) ([]byte, error) {
return
str
,
nil
}
func
pKCS7Padding
(
ciphertext
[]
byte
,
blockSize
int
)
[]
byte
{
func
pkKeyPadding
(
key
[]
byte
)
[]
byte
{
l
:=
len
(
key
)
if
l
==
16
||
l
==
24
||
l
==
32
{
return
key
}
if
l
<
16
{
return
append
(
key
,
bytes
.
Repeat
([]
byte
{
byte
(
0
)},
16
-
l
)
...
)
}
else
if
l
<
24
{
return
append
(
key
,
bytes
.
Repeat
([]
byte
{
byte
(
0
)},
24
-
l
)
...
)
}
else
if
l
<
32
{
return
append
(
key
,
bytes
.
Repeat
([]
byte
{
byte
(
0
)},
32
-
l
)
...
)
}
else
{
md5Ctx
:=
md5
.
New
()
md5Ctx
.
Write
(
key
)
md5Str
:=
md5Ctx
.
Sum
(
nil
)
return
[]
byte
(
hex
.
EncodeToString
(
md5Str
))
}
}
func
pKCS5Padding
(
ciphertext
[]
byte
,
blockSize
int
)
[]
byte
{
padding
:=
blockSize
-
len
(
ciphertext
)
%
blockSize
padtext
:=
bytes
.
Repeat
([]
byte
{
byte
(
padding
)},
padding
)
return
append
(
ciphertext
,
padtext
...
)
}
func
pKCS
7
UnPadding
(
origData
[]
byte
)
[]
byte
{
func
pKCS
5
UnPadding
(
origData
[]
byte
)
[]
byte
{
length
:=
len
(
origData
)
unpadding
:=
int
(
origData
[
length
-
1
])
return
origData
[
:
(
length
-
unpadding
)]
...
...
src/utils/pcrypto/pcrypto_test.go
浏览文件 @
899d6837
...
...
@@ -24,7 +24,7 @@ var (
func
init
()
{
pp
=
&
Pcrypto
{}
pp
.
Init
([]
byte
(
"
Hana
"
))
pp
.
Init
([]
byte
(
"
12234567890123451223456789012345321:wq
"
))
}
func
TestEncrypt
(
t
*
testing
.
T
)
{
...
...
@@ -60,3 +60,18 @@ func TestCompression(t *testing.T) {
t
.
Fatalf
(
"test compression error, from [%s] to [%s]"
,
testStr
,
string
(
res
))
}
}
func
BenchmarkEncrypt
(
b
*
testing
.
B
)
{
testStr
:=
"Test Encrypt!"
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
pp
.
Encrypt
([]
byte
(
testStr
))
}
}
func
BenchmarkDecrypt
(
b
*
testing
.
B
)
{
testStr
:=
"Test Encrypt!"
res
,
_
:=
pp
.
Encrypt
([]
byte
(
testStr
))
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
pp
.
Decrypt
([]
byte
(
res
))
}
}
vendor/github.com/astaxie/beego/logs/color.go
0 → 100644
浏览文件 @
899d6837
// Copyright 2014 beego Author. 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.
// +build !windows
package
logs
import
"io"
type
ansiColorWriter
struct
{
w
io
.
Writer
mode
outputMode
}
func
(
cw
*
ansiColorWriter
)
Write
(
p
[]
byte
)
(
int
,
error
)
{
return
cw
.
w
.
Write
(
p
)
}
vendor/github.com/astaxie/beego/logs/color_windows.go
0 → 100644
浏览文件 @
899d6837
// Copyright 2014 beego Author. 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.
// +build windows
package
logs
import
(
"bytes"
"io"
"strings"
"syscall"
"unsafe"
)
type
(
csiState
int
parseResult
int
)
const
(
outsideCsiCode
csiState
=
iota
firstCsiCode
secondCsiCode
)
const
(
noConsole
parseResult
=
iota
changedColor
unknown
)
type
ansiColorWriter
struct
{
w
io
.
Writer
mode
outputMode
state
csiState
paramStartBuf
bytes
.
Buffer
paramBuf
bytes
.
Buffer
}
const
(
firstCsiChar
byte
=
'\x1b'
secondeCsiChar
byte
=
'['
separatorChar
byte
=
';'
sgrCode
byte
=
'm'
)
const
(
foregroundBlue
=
uint16
(
0x0001
)
foregroundGreen
=
uint16
(
0x0002
)
foregroundRed
=
uint16
(
0x0004
)
foregroundIntensity
=
uint16
(
0x0008
)
backgroundBlue
=
uint16
(
0x0010
)
backgroundGreen
=
uint16
(
0x0020
)
backgroundRed
=
uint16
(
0x0040
)
backgroundIntensity
=
uint16
(
0x0080
)
underscore
=
uint16
(
0x8000
)
foregroundMask
=
foregroundBlue
|
foregroundGreen
|
foregroundRed
|
foregroundIntensity
backgroundMask
=
backgroundBlue
|
backgroundGreen
|
backgroundRed
|
backgroundIntensity
)
const
(
ansiReset
=
"0"
ansiIntensityOn
=
"1"
ansiIntensityOff
=
"21"
ansiUnderlineOn
=
"4"
ansiUnderlineOff
=
"24"
ansiBlinkOn
=
"5"
ansiBlinkOff
=
"25"
ansiForegroundBlack
=
"30"
ansiForegroundRed
=
"31"
ansiForegroundGreen
=
"32"
ansiForegroundYellow
=
"33"
ansiForegroundBlue
=
"34"
ansiForegroundMagenta
=
"35"
ansiForegroundCyan
=
"36"
ansiForegroundWhite
=
"37"
ansiForegroundDefault
=
"39"
ansiBackgroundBlack
=
"40"
ansiBackgroundRed
=
"41"
ansiBackgroundGreen
=
"42"
ansiBackgroundYellow
=
"43"
ansiBackgroundBlue
=
"44"
ansiBackgroundMagenta
=
"45"
ansiBackgroundCyan
=
"46"
ansiBackgroundWhite
=
"47"
ansiBackgroundDefault
=
"49"
ansiLightForegroundGray
=
"90"
ansiLightForegroundRed
=
"91"
ansiLightForegroundGreen
=
"92"
ansiLightForegroundYellow
=
"93"
ansiLightForegroundBlue
=
"94"
ansiLightForegroundMagenta
=
"95"
ansiLightForegroundCyan
=
"96"
ansiLightForegroundWhite
=
"97"
ansiLightBackgroundGray
=
"100"
ansiLightBackgroundRed
=
"101"
ansiLightBackgroundGreen
=
"102"
ansiLightBackgroundYellow
=
"103"
ansiLightBackgroundBlue
=
"104"
ansiLightBackgroundMagenta
=
"105"
ansiLightBackgroundCyan
=
"106"
ansiLightBackgroundWhite
=
"107"
)
type
drawType
int
const
(
foreground
drawType
=
iota
background
)
type
winColor
struct
{
code
uint16
drawType
drawType
}
var
colorMap
=
map
[
string
]
winColor
{
ansiForegroundBlack
:
{
0
,
foreground
},
ansiForegroundRed
:
{
foregroundRed
,
foreground
},
ansiForegroundGreen
:
{
foregroundGreen
,
foreground
},
ansiForegroundYellow
:
{
foregroundRed
|
foregroundGreen
,
foreground
},
ansiForegroundBlue
:
{
foregroundBlue
,
foreground
},
ansiForegroundMagenta
:
{
foregroundRed
|
foregroundBlue
,
foreground
},
ansiForegroundCyan
:
{
foregroundGreen
|
foregroundBlue
,
foreground
},
ansiForegroundWhite
:
{
foregroundRed
|
foregroundGreen
|
foregroundBlue
,
foreground
},
ansiForegroundDefault
:
{
foregroundRed
|
foregroundGreen
|
foregroundBlue
,
foreground
},
ansiBackgroundBlack
:
{
0
,
background
},
ansiBackgroundRed
:
{
backgroundRed
,
background
},
ansiBackgroundGreen
:
{
backgroundGreen
,
background
},
ansiBackgroundYellow
:
{
backgroundRed
|
backgroundGreen
,
background
},
ansiBackgroundBlue
:
{
backgroundBlue
,
background
},
ansiBackgroundMagenta
:
{
backgroundRed
|
backgroundBlue
,
background
},
ansiBackgroundCyan
:
{
backgroundGreen
|
backgroundBlue
,
background
},
ansiBackgroundWhite
:
{
backgroundRed
|
backgroundGreen
|
backgroundBlue
,
background
},
ansiBackgroundDefault
:
{
0
,
background
},
ansiLightForegroundGray
:
{
foregroundIntensity
,
foreground
},
ansiLightForegroundRed
:
{
foregroundIntensity
|
foregroundRed
,
foreground
},
ansiLightForegroundGreen
:
{
foregroundIntensity
|
foregroundGreen
,
foreground
},
ansiLightForegroundYellow
:
{
foregroundIntensity
|
foregroundRed
|
foregroundGreen
,
foreground
},
ansiLightForegroundBlue
:
{
foregroundIntensity
|
foregroundBlue
,
foreground
},
ansiLightForegroundMagenta
:
{
foregroundIntensity
|
foregroundRed
|
foregroundBlue
,
foreground
},
ansiLightForegroundCyan
:
{
foregroundIntensity
|
foregroundGreen
|
foregroundBlue
,
foreground
},
ansiLightForegroundWhite
:
{
foregroundIntensity
|
foregroundRed
|
foregroundGreen
|
foregroundBlue
,
foreground
},
ansiLightBackgroundGray
:
{
backgroundIntensity
,
background
},
ansiLightBackgroundRed
:
{
backgroundIntensity
|
backgroundRed
,
background
},
ansiLightBackgroundGreen
:
{
backgroundIntensity
|
backgroundGreen
,
background
},
ansiLightBackgroundYellow
:
{
backgroundIntensity
|
backgroundRed
|
backgroundGreen
,
background
},
ansiLightBackgroundBlue
:
{
backgroundIntensity
|
backgroundBlue
,
background
},
ansiLightBackgroundMagenta
:
{
backgroundIntensity
|
backgroundRed
|
backgroundBlue
,
background
},
ansiLightBackgroundCyan
:
{
backgroundIntensity
|
backgroundGreen
|
backgroundBlue
,
background
},
ansiLightBackgroundWhite
:
{
backgroundIntensity
|
backgroundRed
|
backgroundGreen
|
backgroundBlue
,
background
},
}
var
(
kernel32
=
syscall
.
NewLazyDLL
(
"kernel32.dll"
)
procSetConsoleTextAttribute
=
kernel32
.
NewProc
(
"SetConsoleTextAttribute"
)
procGetConsoleScreenBufferInfo
=
kernel32
.
NewProc
(
"GetConsoleScreenBufferInfo"
)
defaultAttr
*
textAttributes
)
func
init
()
{
screenInfo
:=
getConsoleScreenBufferInfo
(
uintptr
(
syscall
.
Stdout
))
if
screenInfo
!=
nil
{
colorMap
[
ansiForegroundDefault
]
=
winColor
{
screenInfo
.
WAttributes
&
(
foregroundRed
|
foregroundGreen
|
foregroundBlue
),
foreground
,
}
colorMap
[
ansiBackgroundDefault
]
=
winColor
{
screenInfo
.
WAttributes
&
(
backgroundRed
|
backgroundGreen
|
backgroundBlue
),
background
,
}
defaultAttr
=
convertTextAttr
(
screenInfo
.
WAttributes
)
}
}
type
coord
struct
{
X
,
Y
int16
}
type
smallRect
struct
{
Left
,
Top
,
Right
,
Bottom
int16
}
type
consoleScreenBufferInfo
struct
{
DwSize
coord
DwCursorPosition
coord
WAttributes
uint16
SrWindow
smallRect
DwMaximumWindowSize
coord
}
func
getConsoleScreenBufferInfo
(
hConsoleOutput
uintptr
)
*
consoleScreenBufferInfo
{
var
csbi
consoleScreenBufferInfo
ret
,
_
,
_
:=
procGetConsoleScreenBufferInfo
.
Call
(
hConsoleOutput
,
uintptr
(
unsafe
.
Pointer
(
&
csbi
)))
if
ret
==
0
{
return
nil
}
return
&
csbi
}
func
setConsoleTextAttribute
(
hConsoleOutput
uintptr
,
wAttributes
uint16
)
bool
{
ret
,
_
,
_
:=
procSetConsoleTextAttribute
.
Call
(
hConsoleOutput
,
uintptr
(
wAttributes
))
return
ret
!=
0
}
type
textAttributes
struct
{
foregroundColor
uint16
backgroundColor
uint16
foregroundIntensity
uint16
backgroundIntensity
uint16
underscore
uint16
otherAttributes
uint16
}
func
convertTextAttr
(
winAttr
uint16
)
*
textAttributes
{
fgColor
:=
winAttr
&
(
foregroundRed
|
foregroundGreen
|
foregroundBlue
)
bgColor
:=
winAttr
&
(
backgroundRed
|
backgroundGreen
|
backgroundBlue
)
fgIntensity
:=
winAttr
&
foregroundIntensity
bgIntensity
:=
winAttr
&
backgroundIntensity
underline
:=
winAttr
&
underscore
otherAttributes
:=
winAttr
&^
(
foregroundMask
|
backgroundMask
|
underscore
)
return
&
textAttributes
{
fgColor
,
bgColor
,
fgIntensity
,
bgIntensity
,
underline
,
otherAttributes
}
}
func
convertWinAttr
(
textAttr
*
textAttributes
)
uint16
{
var
winAttr
uint16
winAttr
|=
textAttr
.
foregroundColor
winAttr
|=
textAttr
.
backgroundColor
winAttr
|=
textAttr
.
foregroundIntensity
winAttr
|=
textAttr
.
backgroundIntensity
winAttr
|=
textAttr
.
underscore
winAttr
|=
textAttr
.
otherAttributes
return
winAttr
}
func
changeColor
(
param
[]
byte
)
parseResult
{
screenInfo
:=
getConsoleScreenBufferInfo
(
uintptr
(
syscall
.
Stdout
))
if
screenInfo
==
nil
{
return
noConsole
}
winAttr
:=
convertTextAttr
(
screenInfo
.
WAttributes
)
strParam
:=
string
(
param
)
if
len
(
strParam
)
<=
0
{
strParam
=
"0"
}
csiParam
:=
strings
.
Split
(
strParam
,
string
(
separatorChar
))
for
_
,
p
:=
range
csiParam
{
c
,
ok
:=
colorMap
[
p
]
switch
{
case
!
ok
:
switch
p
{
case
ansiReset
:
winAttr
.
foregroundColor
=
defaultAttr
.
foregroundColor
winAttr
.
backgroundColor
=
defaultAttr
.
backgroundColor
winAttr
.
foregroundIntensity
=
defaultAttr
.
foregroundIntensity
winAttr
.
backgroundIntensity
=
defaultAttr
.
backgroundIntensity
winAttr
.
underscore
=
0
winAttr
.
otherAttributes
=
0
case
ansiIntensityOn
:
winAttr
.
foregroundIntensity
=
foregroundIntensity
case
ansiIntensityOff
:
winAttr
.
foregroundIntensity
=
0
case
ansiUnderlineOn
:
winAttr
.
underscore
=
underscore
case
ansiUnderlineOff
:
winAttr
.
underscore
=
0
case
ansiBlinkOn
:
winAttr
.
backgroundIntensity
=
backgroundIntensity
case
ansiBlinkOff
:
winAttr
.
backgroundIntensity
=
0
default
:
// unknown code
}
case
c
.
drawType
==
foreground
:
winAttr
.
foregroundColor
=
c
.
code
case
c
.
drawType
==
background
:
winAttr
.
backgroundColor
=
c
.
code
}
}
winTextAttribute
:=
convertWinAttr
(
winAttr
)
setConsoleTextAttribute
(
uintptr
(
syscall
.
Stdout
),
winTextAttribute
)
return
changedColor
}
func
parseEscapeSequence
(
command
byte
,
param
[]
byte
)
parseResult
{
if
defaultAttr
==
nil
{
return
noConsole
}
switch
command
{
case
sgrCode
:
return
changeColor
(
param
)
default
:
return
unknown
}
}
func
(
cw
*
ansiColorWriter
)
flushBuffer
()
(
int
,
error
)
{
return
cw
.
flushTo
(
cw
.
w
)
}
func
(
cw
*
ansiColorWriter
)
resetBuffer
()
(
int
,
error
)
{
return
cw
.
flushTo
(
nil
)
}
func
(
cw
*
ansiColorWriter
)
flushTo
(
w
io
.
Writer
)
(
int
,
error
)
{
var
n1
,
n2
int
var
err
error
startBytes
:=
cw
.
paramStartBuf
.
Bytes
()
cw
.
paramStartBuf
.
Reset
()
if
w
!=
nil
{
n1
,
err
=
cw
.
w
.
Write
(
startBytes
)
if
err
!=
nil
{
return
n1
,
err
}
}
else
{
n1
=
len
(
startBytes
)
}
paramBytes
:=
cw
.
paramBuf
.
Bytes
()
cw
.
paramBuf
.
Reset
()
if
w
!=
nil
{
n2
,
err
=
cw
.
w
.
Write
(
paramBytes
)
if
err
!=
nil
{
return
n1
+
n2
,
err
}
}
else
{
n2
=
len
(
paramBytes
)
}
return
n1
+
n2
,
nil
}
func
isParameterChar
(
b
byte
)
bool
{
return
(
'0'
<=
b
&&
b
<=
'9'
)
||
b
==
separatorChar
}
func
(
cw
*
ansiColorWriter
)
Write
(
p
[]
byte
)
(
int
,
error
)
{
r
,
nw
,
first
,
last
:=
0
,
0
,
0
,
0
if
cw
.
mode
!=
DiscardNonColorEscSeq
{
cw
.
state
=
outsideCsiCode
cw
.
resetBuffer
()
}
var
err
error
for
i
,
ch
:=
range
p
{
switch
cw
.
state
{
case
outsideCsiCode
:
if
ch
==
firstCsiChar
{
cw
.
paramStartBuf
.
WriteByte
(
ch
)
cw
.
state
=
firstCsiCode
}
case
firstCsiCode
:
switch
ch
{
case
firstCsiChar
:
cw
.
paramStartBuf
.
WriteByte
(
ch
)
break
case
secondeCsiChar
:
cw
.
paramStartBuf
.
WriteByte
(
ch
)
cw
.
state
=
secondCsiCode
last
=
i
-
1
default
:
cw
.
resetBuffer
()
cw
.
state
=
outsideCsiCode
}
case
secondCsiCode
:
if
isParameterChar
(
ch
)
{
cw
.
paramBuf
.
WriteByte
(
ch
)
}
else
{
nw
,
err
=
cw
.
w
.
Write
(
p
[
first
:
last
])
r
+=
nw
if
err
!=
nil
{
return
r
,
err
}
first
=
i
+
1
result
:=
parseEscapeSequence
(
ch
,
cw
.
paramBuf
.
Bytes
())
if
result
==
noConsole
||
(
cw
.
mode
==
OutputNonColorEscSeq
&&
result
==
unknown
)
{
cw
.
paramBuf
.
WriteByte
(
ch
)
nw
,
err
:=
cw
.
flushBuffer
()
if
err
!=
nil
{
return
r
,
err
}
r
+=
nw
}
else
{
n
,
_
:=
cw
.
resetBuffer
()
// Add one more to the size of the buffer for the last ch
r
+=
n
+
1
}
cw
.
state
=
outsideCsiCode
}
default
:
cw
.
state
=
outsideCsiCode
}
}
if
cw
.
mode
!=
DiscardNonColorEscSeq
||
cw
.
state
==
outsideCsiCode
{
nw
,
err
=
cw
.
w
.
Write
(
p
[
first
:
])
r
+=
nw
}
return
r
,
err
}
vendor/github.com/astaxie/beego/logs/conn.go
浏览文件 @
899d6837
...
...
@@ -113,5 +113,5 @@ func (c *connWriter) needToConnectOnMsg() bool {
}
func
init
()
{
Register
(
"conn"
,
NewConn
)
Register
(
AdapterConn
,
NewConn
)
}
vendor/github.com/astaxie/beego/logs/console.go
浏览文件 @
899d6837
...
...
@@ -97,5 +97,5 @@ func (c *consoleWriter) Flush() {
}
func
init
()
{
Register
(
"console"
,
NewConsole
)
Register
(
AdapterConsole
,
NewConsole
)
}
vendor/github.com/astaxie/beego/logs/file.go
浏览文件 @
899d6837
...
...
@@ -22,6 +22,7 @@ import (
"io"
"os"
"path/filepath"
"strconv"
"strings"
"sync"
"time"
...
...
@@ -30,7 +31,7 @@ import (
// fileLogWriter implements LoggerInterface.
// It writes messages by lines limit, file size limit, or time frequency.
type
fileLogWriter
struct
{
sync
.
Mutex
// write log order by order and atomic incr maxLinesCurLines and maxSizeCurSize
sync
.
RW
Mutex
// write log order by order and atomic incr maxLinesCurLines and maxSizeCurSize
// The opened file
Filename
string
`json:"filename"`
fileWriter
*
os
.
File
...
...
@@ -47,12 +48,13 @@ type fileLogWriter struct {
Daily
bool
`json:"daily"`
MaxDays
int64
`json:"maxdays"`
dailyOpenDate
int
dailyOpenTime
time
.
Time
Rotate
bool
`json:"rotate"`
Level
int
`json:"level"`
Perm
os
.
FileMode
`json:"perm"`
Perm
string
`json:"perm"`
fileNameOnly
,
suffix
string
// like "project.log", project is fileNameOnly and .log is suffix
}
...
...
@@ -60,14 +62,11 @@ type fileLogWriter struct {
// newFileWriter create a FileLogWriter returning as LoggerInterface.
func
newFileWriter
()
Logger
{
w
:=
&
fileLogWriter
{
Filename
:
""
,
MaxLines
:
1000000
,
MaxSize
:
1
<<
28
,
//256 MB
Daily
:
true
,
MaxDays
:
7
,
Rotate
:
true
,
Level
:
LevelTrace
,
Perm
:
0660
,
Daily
:
true
,
MaxDays
:
7
,
Rotate
:
true
,
Level
:
LevelTrace
,
Perm
:
"0660"
,
}
return
w
}
...
...
@@ -77,11 +76,11 @@ func newFileWriter() Logger {
// {
// "filename":"logs/beego.log",
// "maxLines":10000,
// "maxsize":1
<<30
,
// "maxsize":1
024
,
// "daily":true,
// "maxDays":15,
// "rotate":true,
// "perm":
0600
// "perm":
"0600"
// }
func
(
w
*
fileLogWriter
)
Init
(
jsonConfig
string
)
error
{
err
:=
json
.
Unmarshal
([]
byte
(
jsonConfig
),
w
)
...
...
@@ -128,7 +127,9 @@ func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
h
,
d
:=
formatTimeHeader
(
when
)
msg
=
string
(
h
)
+
msg
+
"
\n
"
if
w
.
Rotate
{
w
.
RLock
()
if
w
.
needRotate
(
len
(
msg
),
d
)
{
w
.
RUnlock
()
w
.
Lock
()
if
w
.
needRotate
(
len
(
msg
),
d
)
{
if
err
:=
w
.
doRotate
(
when
);
err
!=
nil
{
...
...
@@ -136,6 +137,8 @@ func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
}
}
w
.
Unlock
()
}
else
{
w
.
RUnlock
()
}
}
...
...
@@ -151,7 +154,15 @@ func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
func
(
w
*
fileLogWriter
)
createLogFile
()
(
*
os
.
File
,
error
)
{
// Open the log file
fd
,
err
:=
os
.
OpenFile
(
w
.
Filename
,
os
.
O_WRONLY
|
os
.
O_APPEND
|
os
.
O_CREATE
,
w
.
Perm
)
perm
,
err
:=
strconv
.
ParseInt
(
w
.
Perm
,
8
,
64
)
if
err
!=
nil
{
return
nil
,
err
}
fd
,
err
:=
os
.
OpenFile
(
w
.
Filename
,
os
.
O_WRONLY
|
os
.
O_APPEND
|
os
.
O_CREATE
,
os
.
FileMode
(
perm
))
if
err
==
nil
{
// Make sure file perm is user set perm cause of `os.OpenFile` will obey umask
os
.
Chmod
(
w
.
Filename
,
os
.
FileMode
(
perm
))
}
return
fd
,
err
}
...
...
@@ -162,8 +173,12 @@ func (w *fileLogWriter) initFd() error {
return
fmt
.
Errorf
(
"get stat err: %s
\n
"
,
err
)
}
w
.
maxSizeCurSize
=
int
(
fInfo
.
Size
())
w
.
dailyOpenDate
=
time
.
Now
()
.
Day
()
w
.
dailyOpenTime
=
time
.
Now
()
w
.
dailyOpenDate
=
w
.
dailyOpenTime
.
Day
()
w
.
maxLinesCurLines
=
0
if
w
.
Daily
{
go
w
.
dailyRotate
(
w
.
dailyOpenTime
)
}
if
fInfo
.
Size
()
>
0
{
count
,
err
:=
w
.
lines
()
if
err
!=
nil
{
...
...
@@ -174,6 +189,22 @@ func (w *fileLogWriter) initFd() error {
return
nil
}
func
(
w
*
fileLogWriter
)
dailyRotate
(
openTime
time
.
Time
)
{
y
,
m
,
d
:=
openTime
.
Add
(
24
*
time
.
Hour
)
.
Date
()
nextDay
:=
time
.
Date
(
y
,
m
,
d
,
0
,
0
,
0
,
0
,
openTime
.
Location
())
tm
:=
time
.
NewTimer
(
time
.
Duration
(
nextDay
.
UnixNano
()
-
openTime
.
UnixNano
()
+
100
))
select
{
case
<-
tm
.
C
:
w
.
Lock
()
if
w
.
needRotate
(
0
,
time
.
Now
()
.
Day
())
{
if
err
:=
w
.
doRotate
(
time
.
Now
());
err
!=
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"FileLogWriter(%q): %s
\n
"
,
w
.
Filename
,
err
)
}
}
w
.
Unlock
()
}
}
func
(
w
*
fileLogWriter
)
lines
()
(
int
,
error
)
{
fd
,
err
:=
os
.
Open
(
w
.
Filename
)
if
err
!=
nil
{
...
...
@@ -204,22 +235,29 @@ func (w *fileLogWriter) lines() (int, error) {
// DoRotate means it need to write file in new file.
// new file name like xx.2013-01-01.log (daily) or xx.001.log (by line or size)
func
(
w
*
fileLogWriter
)
doRotate
(
logTime
time
.
Time
)
error
{
_
,
err
:=
os
.
Lstat
(
w
.
Filename
)
if
err
!=
nil
{
return
err
}
// file exists
// Find the next available number
num
:=
1
fName
:=
""
_
,
err
:=
os
.
Lstat
(
w
.
Filename
)
if
err
!=
nil
{
//even if the file is not exist or other ,we should RESTART the logger
goto
RESTART_LOGGER
}
if
w
.
MaxLines
>
0
||
w
.
MaxSize
>
0
{
for
;
err
==
nil
&&
num
<=
999
;
num
++
{
fName
=
w
.
fileNameOnly
+
fmt
.
Sprintf
(
".%s.%03d%s"
,
logTime
.
Format
(
"2006-01-02"
),
num
,
w
.
suffix
)
_
,
err
=
os
.
Lstat
(
fName
)
}
}
else
{
fName
=
fmt
.
Sprintf
(
"%s.%s%s"
,
w
.
fileNameOnly
,
log
Time
.
Format
(
"2006-01-02"
),
w
.
suffix
)
fName
=
fmt
.
Sprintf
(
"%s.%s%s"
,
w
.
fileNameOnly
,
w
.
dailyOpen
Time
.
Format
(
"2006-01-02"
),
w
.
suffix
)
_
,
err
=
os
.
Lstat
(
fName
)
for
;
err
==
nil
&&
num
<=
999
;
num
++
{
fName
=
w
.
fileNameOnly
+
fmt
.
Sprintf
(
".%s.%03d%s"
,
w
.
dailyOpenTime
.
Format
(
"2006-01-02"
),
num
,
w
.
suffix
)
_
,
err
=
os
.
Lstat
(
fName
)
}
}
// return error if the last file checked still existed
if
err
==
nil
{
...
...
@@ -231,16 +269,18 @@ func (w *fileLogWriter) doRotate(logTime time.Time) error {
// Rename the file to its new found name
// even if occurs error,we MUST guarantee to restart new logger
renameErr
:
=
os
.
Rename
(
w
.
Filename
,
fName
)
err
=
os
.
Rename
(
w
.
Filename
,
fName
)
// re-start logger
RESTART_LOGGER
:
startLoggerErr
:=
w
.
startLogger
()
go
w
.
deleteOldLog
()
if
startLoggerErr
!=
nil
{
return
fmt
.
Errorf
(
"Rotate StartLogger: %s
\n
"
,
startLoggerErr
)
}
if
renameE
rr
!=
nil
{
return
fmt
.
Errorf
(
"Rotate: %s
\n
"
,
renameE
rr
)
if
e
rr
!=
nil
{
return
fmt
.
Errorf
(
"Rotate: %s
\n
"
,
e
rr
)
}
return
nil
...
...
@@ -255,8 +295,12 @@ func (w *fileLogWriter) deleteOldLog() {
}
}()
if
!
info
.
IsDir
()
&&
info
.
ModTime
()
.
Unix
()
<
(
time
.
Now
()
.
Unix
()
-
60
*
60
*
24
*
w
.
MaxDays
)
{
if
strings
.
HasPrefix
(
filepath
.
Base
(
path
),
w
.
fileNameOnly
)
&&
if
info
==
nil
{
return
}
if
!
info
.
IsDir
()
&&
info
.
ModTime
()
.
Add
(
24
*
time
.
Hour
*
time
.
Duration
(
w
.
MaxDays
))
.
Before
(
time
.
Now
())
{
if
strings
.
HasPrefix
(
filepath
.
Base
(
path
),
filepath
.
Base
(
w
.
fileNameOnly
))
&&
strings
.
HasSuffix
(
filepath
.
Base
(
path
),
w
.
suffix
)
{
os
.
Remove
(
path
)
}
...
...
@@ -278,5 +322,5 @@ func (w *fileLogWriter) Flush() {
}
func
init
()
{
Register
(
"file"
,
newFileWriter
)
Register
(
AdapterFile
,
newFileWriter
)
}
vendor/github.com/astaxie/beego/logs/log.go
浏览文件 @
899d6837
...
...
@@ -35,10 +35,12 @@ package logs
import
(
"fmt"
"log"
"os"
"path"
"runtime"
"strconv"
"strings"
"sync"
"time"
)
...
...
@@ -55,16 +57,28 @@ const (
LevelDebug
)
// Legacy loglevel constants to ensure backwards compatibility.
//
// Deprecated: will be removed in 1.5.0.
// levelLogLogger is defined to implement log.Logger
// the real log level will be LevelEmergency
const
levelLoggerImpl
=
-
1
// Name for adapter with beego official support
const
(
AdapterConsole
=
"console"
AdapterFile
=
"file"
AdapterMultiFile
=
"multifile"
AdapterMail
=
"stmp"
AdapterConn
=
"conn"
AdapterEs
=
"es"
)
// Legacy log level constants to ensure backwards compatibility.
const
(
LevelInfo
=
LevelInformational
LevelTrace
=
LevelDebug
LevelWarn
=
LevelWarning
)
type
loggerType
func
()
Logger
type
newLoggerFunc
func
()
Logger
// Logger defines the behavior of a log provider.
type
Logger
interface
{
...
...
@@ -74,12 +88,13 @@ type Logger interface {
Flush
()
}
var
adapters
=
make
(
map
[
string
]
loggerType
)
var
adapters
=
make
(
map
[
string
]
newLoggerFunc
)
var
levelPrefix
=
[
LevelDebug
+
1
]
string
{
"[M] "
,
"[A] "
,
"[C] "
,
"[E] "
,
"[W] "
,
"[N] "
,
"[I] "
,
"[D] "
}
// Register makes a log provide available by the provided name.
// If Register is called twice with the same name or if driver is nil,
// it panics.
func
Register
(
name
string
,
log
loggerType
)
{
func
Register
(
name
string
,
log
newLoggerFunc
)
{
if
log
==
nil
{
panic
(
"logs: Register provide is nil"
)
}
...
...
@@ -94,15 +109,19 @@ func Register(name string, log loggerType) {
type
BeeLogger
struct
{
lock
sync
.
Mutex
level
int
init
bool
enableFuncCallDepth
bool
loggerFuncCallDepth
int
asynchronous
bool
msgChanLen
int64
msgChan
chan
*
logMsg
signalChan
chan
string
wg
sync
.
WaitGroup
outputs
[]
*
nameLogger
}
const
defaultAsyncMsgLen
=
1e3
type
nameLogger
struct
{
Logger
name
string
...
...
@@ -119,18 +138,31 @@ var logMsgPool *sync.Pool
// NewLogger returns a new BeeLogger.
// channelLen means the number of messages in chan(used where asynchronous is true).
// if the buffering chan is full, logger adapters write to file or other way.
func
NewLogger
(
channelLen
int64
)
*
BeeLogger
{
func
NewLogger
(
channelLen
s
...
int64
)
*
BeeLogger
{
bl
:=
new
(
BeeLogger
)
bl
.
level
=
LevelDebug
bl
.
loggerFuncCallDepth
=
2
bl
.
msgChan
=
make
(
chan
*
logMsg
,
channelLen
)
bl
.
msgChanLen
=
append
(
channelLens
,
0
)[
0
]
if
bl
.
msgChanLen
<=
0
{
bl
.
msgChanLen
=
defaultAsyncMsgLen
}
bl
.
signalChan
=
make
(
chan
string
,
1
)
bl
.
setLogger
(
AdapterConsole
)
return
bl
}
// Async set the log to asynchronous and start the goroutine
func
(
bl
*
BeeLogger
)
Async
()
*
BeeLogger
{
func
(
bl
*
BeeLogger
)
Async
(
msgLen
...
int64
)
*
BeeLogger
{
bl
.
lock
.
Lock
()
defer
bl
.
lock
.
Unlock
()
if
bl
.
asynchronous
{
return
bl
}
bl
.
asynchronous
=
true
if
len
(
msgLen
)
>
0
&&
msgLen
[
0
]
>
0
{
bl
.
msgChanLen
=
msgLen
[
0
]
}
bl
.
msgChan
=
make
(
chan
*
logMsg
,
bl
.
msgChanLen
)
logMsgPool
=
&
sync
.
Pool
{
New
:
func
()
interface
{}
{
return
&
logMsg
{}
...
...
@@ -143,10 +175,8 @@ func (bl *BeeLogger) Async() *BeeLogger {
// SetLogger provides a given logger adapter into BeeLogger with config string.
// config need to be correct JSON as string: {"interval":360}.
func
(
bl
*
BeeLogger
)
SetLogger
(
adapterName
string
,
config
string
)
error
{
bl
.
lock
.
Lock
()
defer
bl
.
lock
.
Unlock
()
func
(
bl
*
BeeLogger
)
setLogger
(
adapterName
string
,
configs
...
string
)
error
{
config
:=
append
(
configs
,
"{}"
)[
0
]
for
_
,
l
:=
range
bl
.
outputs
{
if
l
.
name
==
adapterName
{
return
fmt
.
Errorf
(
"logs: duplicate adaptername %q (you have set this logger before)"
,
adapterName
)
...
...
@@ -168,6 +198,18 @@ func (bl *BeeLogger) SetLogger(adapterName string, config string) error {
return
nil
}
// SetLogger provides a given logger adapter into BeeLogger with config string.
// config need to be correct JSON as string: {"interval":360}.
func
(
bl
*
BeeLogger
)
SetLogger
(
adapterName
string
,
configs
...
string
)
error
{
bl
.
lock
.
Lock
()
defer
bl
.
lock
.
Unlock
()
if
!
bl
.
init
{
bl
.
outputs
=
[]
*
nameLogger
{}
bl
.
init
=
true
}
return
bl
.
setLogger
(
adapterName
,
configs
...
)
}
// DelLogger remove a logger adapter in BeeLogger.
func
(
bl
*
BeeLogger
)
DelLogger
(
adapterName
string
)
error
{
bl
.
lock
.
Lock
()
...
...
@@ -196,7 +238,37 @@ func (bl *BeeLogger) writeToLoggers(when time.Time, msg string, level int) {
}
}
func
(
bl
*
BeeLogger
)
writeMsg
(
logLevel
int
,
msg
string
)
error
{
func
(
bl
*
BeeLogger
)
Write
(
p
[]
byte
)
(
n
int
,
err
error
)
{
if
len
(
p
)
==
0
{
return
0
,
nil
}
// writeMsg will always add a '\n' character
if
p
[
len
(
p
)
-
1
]
==
'\n'
{
p
=
p
[
0
:
len
(
p
)
-
1
]
}
// set levelLoggerImpl to ensure all log message will be write out
err
=
bl
.
writeMsg
(
levelLoggerImpl
,
string
(
p
))
if
err
==
nil
{
return
len
(
p
),
err
}
return
0
,
err
}
func
(
bl
*
BeeLogger
)
writeMsg
(
logLevel
int
,
msg
string
,
v
...
interface
{})
error
{
if
!
bl
.
init
{
bl
.
lock
.
Lock
()
bl
.
setLogger
(
AdapterConsole
)
bl
.
lock
.
Unlock
()
}
if
logLevel
==
levelLoggerImpl
{
// set to emergency to ensure all log will be print out correctly
logLevel
=
LevelEmergency
}
else
{
msg
=
levelPrefix
[
logLevel
]
+
msg
}
if
len
(
v
)
>
0
{
msg
=
fmt
.
Sprintf
(
msg
,
v
...
)
}
when
:=
time
.
Now
()
if
bl
.
enableFuncCallDepth
{
_
,
file
,
line
,
ok
:=
runtime
.
Caller
(
bl
.
loggerFuncCallDepth
)
...
...
@@ -205,7 +277,7 @@ func (bl *BeeLogger) writeMsg(logLevel int, msg string) error {
line
=
0
}
_
,
filename
:=
path
.
Split
(
file
)
msg
=
"["
+
filename
+
":"
+
strconv
.
FormatInt
(
int64
(
line
),
10
)
+
"]"
+
msg
msg
=
"["
+
filename
+
":"
+
strconv
.
FormatInt
(
int64
(
line
),
10
)
+
"]
"
+
msg
}
if
bl
.
asynchronous
{
lm
:=
logMsgPool
.
Get
()
.
(
*
logMsg
)
...
...
@@ -273,8 +345,7 @@ func (bl *BeeLogger) Emergency(format string, v ...interface{}) {
if
LevelEmergency
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[M] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelEmergency
,
msg
)
bl
.
writeMsg
(
LevelEmergency
,
format
,
v
...
)
}
// Alert Log ALERT level message.
...
...
@@ -282,8 +353,7 @@ func (bl *BeeLogger) Alert(format string, v ...interface{}) {
if
LevelAlert
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[A] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelAlert
,
msg
)
bl
.
writeMsg
(
LevelAlert
,
format
,
v
...
)
}
// Critical Log CRITICAL level message.
...
...
@@ -291,8 +361,7 @@ func (bl *BeeLogger) Critical(format string, v ...interface{}) {
if
LevelCritical
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[C] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelCritical
,
msg
)
bl
.
writeMsg
(
LevelCritical
,
format
,
v
...
)
}
// Error Log ERROR level message.
...
...
@@ -300,17 +369,12 @@ func (bl *BeeLogger) Error(format string, v ...interface{}) {
if
LevelError
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[E] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelError
,
msg
)
bl
.
writeMsg
(
LevelError
,
format
,
v
...
)
}
// Warning Log WARNING level message.
func
(
bl
*
BeeLogger
)
Warning
(
format
string
,
v
...
interface
{})
{
if
LevelWarning
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[W] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelWarning
,
msg
)
bl
.
Warn
(
format
,
v
...
)
}
// Notice Log NOTICE level message.
...
...
@@ -318,17 +382,12 @@ func (bl *BeeLogger) Notice(format string, v ...interface{}) {
if
LevelNotice
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[N] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelNotice
,
msg
)
bl
.
writeMsg
(
LevelNotice
,
format
,
v
...
)
}
// Informational Log INFORMATIONAL level message.
func
(
bl
*
BeeLogger
)
Informational
(
format
string
,
v
...
interface
{})
{
if
LevelInformational
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[I] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelInformational
,
msg
)
bl
.
Info
(
format
,
v
...
)
}
// Debug Log DEBUG level message.
...
...
@@ -336,38 +395,31 @@ func (bl *BeeLogger) Debug(format string, v ...interface{}) {
if
LevelDebug
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[D] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelDebug
,
msg
)
bl
.
writeMsg
(
LevelDebug
,
format
,
v
...
)
}
// Warn Log WARN level message.
// compatibility alias for Warning()
func
(
bl
*
BeeLogger
)
Warn
(
format
string
,
v
...
interface
{})
{
if
LevelWarn
ing
>
bl
.
level
{
if
LevelWarn
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[W] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelWarning
,
msg
)
bl
.
writeMsg
(
LevelWarn
,
format
,
v
...
)
}
// Info Log INFO level message.
// compatibility alias for Informational()
func
(
bl
*
BeeLogger
)
Info
(
format
string
,
v
...
interface
{})
{
if
LevelInfo
rmational
>
bl
.
level
{
if
LevelInfo
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[I] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelInformational
,
msg
)
bl
.
writeMsg
(
LevelInfo
,
format
,
v
...
)
}
// Trace Log TRACE level message.
// compatibility alias for Debug()
func
(
bl
*
BeeLogger
)
Trace
(
format
string
,
v
...
interface
{})
{
if
LevelDebug
>
bl
.
level
{
return
}
msg
:=
fmt
.
Sprintf
(
"[D] "
+
format
,
v
...
)
bl
.
writeMsg
(
LevelDebug
,
msg
)
bl
.
Debug
(
format
,
v
...
)
}
// Flush flush all chan data.
...
...
@@ -386,6 +438,7 @@ func (bl *BeeLogger) Close() {
if
bl
.
asynchronous
{
bl
.
signalChan
<-
"close"
bl
.
wg
.
Wait
()
close
(
bl
.
msgChan
)
}
else
{
bl
.
flush
()
for
_
,
l
:=
range
bl
.
outputs
{
...
...
@@ -393,7 +446,6 @@ func (bl *BeeLogger) Close() {
}
bl
.
outputs
=
nil
}
close
(
bl
.
msgChan
)
close
(
bl
.
signalChan
)
}
...
...
@@ -407,16 +459,175 @@ func (bl *BeeLogger) Reset() {
}
func
(
bl
*
BeeLogger
)
flush
()
{
for
{
if
len
(
bl
.
msgChan
)
>
0
{
bm
:=
<-
bl
.
msgChan
bl
.
writeToLoggers
(
bm
.
when
,
bm
.
msg
,
bm
.
level
)
logMsgPool
.
Put
(
bm
)
continue
if
bl
.
asynchronous
{
for
{
if
len
(
bl
.
msgChan
)
>
0
{
bm
:=
<-
bl
.
msgChan
bl
.
writeToLoggers
(
bm
.
when
,
bm
.
msg
,
bm
.
level
)
logMsgPool
.
Put
(
bm
)
continue
}
break
}
break
}
for
_
,
l
:=
range
bl
.
outputs
{
l
.
Flush
()
}
}
// beeLogger references the used application logger.
var
beeLogger
*
BeeLogger
=
NewLogger
()
// GetLogger returns the default BeeLogger
func
GetBeeLogger
()
*
BeeLogger
{
return
beeLogger
}
var
beeLoggerMap
=
struct
{
sync
.
RWMutex
logs
map
[
string
]
*
log
.
Logger
}{
logs
:
map
[
string
]
*
log
.
Logger
{},
}
// GetLogger returns the default BeeLogger
func
GetLogger
(
prefixes
...
string
)
*
log
.
Logger
{
prefix
:=
append
(
prefixes
,
""
)[
0
]
if
prefix
!=
""
{
prefix
=
fmt
.
Sprintf
(
`[%s] `
,
strings
.
ToUpper
(
prefix
))
}
beeLoggerMap
.
RLock
()
l
,
ok
:=
beeLoggerMap
.
logs
[
prefix
]
if
ok
{
beeLoggerMap
.
RUnlock
()
return
l
}
beeLoggerMap
.
RUnlock
()
beeLoggerMap
.
Lock
()
defer
beeLoggerMap
.
Unlock
()
l
,
ok
=
beeLoggerMap
.
logs
[
prefix
]
if
!
ok
{
l
=
log
.
New
(
beeLogger
,
prefix
,
0
)
beeLoggerMap
.
logs
[
prefix
]
=
l
}
return
l
}
// Reset will remove all the adapter
func
Reset
()
{
beeLogger
.
Reset
()
}
func
Async
(
msgLen
...
int64
)
*
BeeLogger
{
return
beeLogger
.
Async
(
msgLen
...
)
}
// SetLevel sets the global log level used by the simple logger.
func
SetLevel
(
l
int
)
{
beeLogger
.
SetLevel
(
l
)
}
// EnableFuncCallDepth enable log funcCallDepth
func
EnableFuncCallDepth
(
b
bool
)
{
beeLogger
.
enableFuncCallDepth
=
b
}
// SetLogFuncCall set the CallDepth, default is 3
func
SetLogFuncCall
(
b
bool
)
{
beeLogger
.
EnableFuncCallDepth
(
b
)
beeLogger
.
SetLogFuncCallDepth
(
3
)
}
// SetLogFuncCallDepth set log funcCallDepth
func
SetLogFuncCallDepth
(
d
int
)
{
beeLogger
.
loggerFuncCallDepth
=
d
}
// SetLogger sets a new logger.
func
SetLogger
(
adapter
string
,
config
...
string
)
error
{
err
:=
beeLogger
.
SetLogger
(
adapter
,
config
...
)
if
err
!=
nil
{
return
err
}
return
nil
}
// Emergency logs a message at emergency level.
func
Emergency
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Emergency
(
formatLog
(
f
,
v
...
))
}
// Alert logs a message at alert level.
func
Alert
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Alert
(
formatLog
(
f
,
v
...
))
}
// Critical logs a message at critical level.
func
Critical
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Critical
(
formatLog
(
f
,
v
...
))
}
// Error logs a message at error level.
func
Error
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Error
(
formatLog
(
f
,
v
...
))
}
// Warning logs a message at warning level.
func
Warning
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Warn
(
formatLog
(
f
,
v
...
))
}
// Warn compatibility alias for Warning()
func
Warn
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Warn
(
formatLog
(
f
,
v
...
))
}
// Notice logs a message at notice level.
func
Notice
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Notice
(
formatLog
(
f
,
v
...
))
}
// Informational logs a message at info level.
func
Informational
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Info
(
formatLog
(
f
,
v
...
))
}
// Info compatibility alias for Warning()
func
Info
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Info
(
formatLog
(
f
,
v
...
))
}
// Debug logs a message at debug level.
func
Debug
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Debug
(
formatLog
(
f
,
v
...
))
}
// Trace logs a message at trace level.
// compatibility alias for Warning()
func
Trace
(
f
interface
{},
v
...
interface
{})
{
beeLogger
.
Trace
(
formatLog
(
f
,
v
...
))
}
func
formatLog
(
f
interface
{},
v
...
interface
{})
string
{
var
msg
string
switch
f
.
(
type
)
{
case
string
:
msg
=
f
.
(
string
)
if
len
(
v
)
==
0
{
return
msg
}
if
strings
.
Contains
(
msg
,
"%"
)
&&
!
strings
.
Contains
(
msg
,
"%%"
)
{
//format string
}
else
{
//do not contain format char
msg
+=
strings
.
Repeat
(
" %v"
,
len
(
v
))
}
default
:
msg
=
fmt
.
Sprint
(
f
)
if
len
(
v
)
==
0
{
return
msg
}
msg
+=
strings
.
Repeat
(
" %v"
,
len
(
v
))
}
return
fmt
.
Sprintf
(
msg
,
v
...
)
}
vendor/github.com/astaxie/beego/logs/logger.go
浏览文件 @
899d6837
...
...
@@ -15,7 +15,9 @@
package
logs
import
(
"fmt"
"io"
"os"
"sync"
"time"
)
...
...
@@ -36,44 +38,151 @@ func (lg *logWriter) println(when time.Time, msg string) {
lg
.
Unlock
()
}
type
outputMode
int
// DiscardNonColorEscSeq supports the divided color escape sequence.
// But non-color escape sequence is not output.
// Please use the OutputNonColorEscSeq If you want to output a non-color
// escape sequences such as ncurses. However, it does not support the divided
// color escape sequence.
const
(
_
outputMode
=
iota
DiscardNonColorEscSeq
OutputNonColorEscSeq
)
// NewAnsiColorWriter creates and initializes a new ansiColorWriter
// using io.Writer w as its initial contents.
// In the console of Windows, which change the foreground and background
// colors of the text by the escape sequence.
// In the console of other systems, which writes to w all text.
func
NewAnsiColorWriter
(
w
io
.
Writer
)
io
.
Writer
{
return
NewModeAnsiColorWriter
(
w
,
DiscardNonColorEscSeq
)
}
// NewModeAnsiColorWriter create and initializes a new ansiColorWriter
// by specifying the outputMode.
func
NewModeAnsiColorWriter
(
w
io
.
Writer
,
mode
outputMode
)
io
.
Writer
{
if
_
,
ok
:=
w
.
(
*
ansiColorWriter
);
!
ok
{
return
&
ansiColorWriter
{
w
:
w
,
mode
:
mode
,
}
}
return
w
}
const
(
y1
=
`0123456789`
y2
=
`0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789`
y3
=
`0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999`
y4
=
`0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789`
mo1
=
`000000000111`
mo2
=
`123456789012`
d1
=
`0000000001111111111222222222233`
d2
=
`1234567890123456789012345678901`
h1
=
`000000000011111111112222`
h2
=
`012345678901234567890123`
mi1
=
`000000000011111111112222222222333333333344444444445555555555`
mi2
=
`012345678901234567890123456789012345678901234567890123456789`
s1
=
`000000000011111111112222222222333333333344444444445555555555`
s2
=
`012345678901234567890123456789012345678901234567890123456789`
)
func
formatTimeHeader
(
when
time
.
Time
)
([]
byte
,
int
)
{
y
,
mo
,
d
:=
when
.
Date
()
h
,
mi
,
s
:=
when
.
Clock
()
//len(
2006/01/02 15:03:04)==19
//len(
"2006/01/02 15:04:05 ")==20
var
buf
[
20
]
byte
t
:=
3
for
y
>=
10
{
p
:=
y
/
10
buf
[
t
]
=
byte
(
'0'
+
y
-
p
*
10
)
y
=
p
t
--
}
buf
[
0
]
=
byte
(
'0'
+
y
)
buf
[
0
]
=
y1
[
y
/
1000
%
10
]
buf
[
1
]
=
y2
[
y
/
100
]
buf
[
2
]
=
y3
[
y
-
y
/
100
*
100
]
buf
[
3
]
=
y4
[
y
-
y
/
100
*
100
]
buf
[
4
]
=
'/'
if
mo
>
9
{
buf
[
5
]
=
'1'
buf
[
6
]
=
byte
(
'0'
+
mo
-
9
)
}
else
{
buf
[
5
]
=
'0'
buf
[
6
]
=
byte
(
'0'
+
mo
)
}
buf
[
5
]
=
mo1
[
mo
-
1
]
buf
[
6
]
=
mo2
[
mo
-
1
]
buf
[
7
]
=
'/'
t
=
d
/
10
buf
[
8
]
=
byte
(
'0'
+
t
)
buf
[
9
]
=
byte
(
'0'
+
d
-
t
*
10
)
buf
[
8
]
=
d1
[
d
-
1
]
buf
[
9
]
=
d2
[
d
-
1
]
buf
[
10
]
=
' '
t
=
h
/
10
buf
[
11
]
=
byte
(
'0'
+
t
)
buf
[
12
]
=
byte
(
'0'
+
h
-
t
*
10
)
buf
[
11
]
=
h1
[
h
]
buf
[
12
]
=
h2
[
h
]
buf
[
13
]
=
':'
t
=
mi
/
10
buf
[
14
]
=
byte
(
'0'
+
t
)
buf
[
15
]
=
byte
(
'0'
+
mi
-
t
*
10
)
buf
[
14
]
=
mi1
[
mi
]
buf
[
15
]
=
mi2
[
mi
]
buf
[
16
]
=
':'
t
=
s
/
10
buf
[
17
]
=
byte
(
'0'
+
t
)
buf
[
18
]
=
byte
(
'0'
+
s
-
t
*
10
)
buf
[
17
]
=
s1
[
s
]
buf
[
18
]
=
s2
[
s
]
buf
[
19
]
=
' '
return
buf
[
0
:
],
d
}
var
(
green
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
50
,
109
})
white
=
string
([]
byte
{
27
,
91
,
57
,
48
,
59
,
52
,
55
,
109
})
yellow
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
51
,
109
})
red
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
49
,
109
})
blue
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
52
,
109
})
magenta
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
53
,
109
})
cyan
=
string
([]
byte
{
27
,
91
,
57
,
55
,
59
,
52
,
54
,
109
})
w32Green
=
string
([]
byte
{
27
,
91
,
52
,
50
,
109
})
w32White
=
string
([]
byte
{
27
,
91
,
52
,
55
,
109
})
w32Yellow
=
string
([]
byte
{
27
,
91
,
52
,
51
,
109
})
w32Red
=
string
([]
byte
{
27
,
91
,
52
,
49
,
109
})
w32Blue
=
string
([]
byte
{
27
,
91
,
52
,
52
,
109
})
w32Magenta
=
string
([]
byte
{
27
,
91
,
52
,
53
,
109
})
w32Cyan
=
string
([]
byte
{
27
,
91
,
52
,
54
,
109
})
reset
=
string
([]
byte
{
27
,
91
,
48
,
109
})
)
func
ColorByStatus
(
cond
bool
,
code
int
)
string
{
switch
{
case
code
>=
200
&&
code
<
300
:
return
map
[
bool
]
string
{
true
:
green
,
false
:
w32Green
}[
cond
]
case
code
>=
300
&&
code
<
400
:
return
map
[
bool
]
string
{
true
:
white
,
false
:
w32White
}[
cond
]
case
code
>=
400
&&
code
<
500
:
return
map
[
bool
]
string
{
true
:
yellow
,
false
:
w32Yellow
}[
cond
]
default
:
return
map
[
bool
]
string
{
true
:
red
,
false
:
w32Red
}[
cond
]
}
}
func
ColorByMethod
(
cond
bool
,
method
string
)
string
{
switch
method
{
case
"GET"
:
return
map
[
bool
]
string
{
true
:
blue
,
false
:
w32Blue
}[
cond
]
case
"POST"
:
return
map
[
bool
]
string
{
true
:
cyan
,
false
:
w32Cyan
}[
cond
]
case
"PUT"
:
return
map
[
bool
]
string
{
true
:
yellow
,
false
:
w32Yellow
}[
cond
]
case
"DELETE"
:
return
map
[
bool
]
string
{
true
:
red
,
false
:
w32Red
}[
cond
]
case
"PATCH"
:
return
map
[
bool
]
string
{
true
:
green
,
false
:
w32Green
}[
cond
]
case
"HEAD"
:
return
map
[
bool
]
string
{
true
:
magenta
,
false
:
w32Magenta
}[
cond
]
case
"OPTIONS"
:
return
map
[
bool
]
string
{
true
:
white
,
false
:
w32White
}[
cond
]
default
:
return
reset
}
}
// Guard Mutex to guarantee atomicity of W32Debug(string) function
var
mu
sync
.
Mutex
// Helper method to output colored logs in Windows terminals
func
W32Debug
(
msg
string
)
{
mu
.
Lock
()
defer
mu
.
Unlock
()
current
:=
time
.
Now
()
w
:=
NewAnsiColorWriter
(
os
.
Stdout
)
fmt
.
Fprintf
(
w
,
"[beego] %v %s
\n
"
,
current
.
Format
(
"2006/01/02 - 15:04:05"
),
msg
)
}
vendor/github.com/astaxie/beego/logs/multifile.go
浏览文件 @
899d6837
...
...
@@ -112,5 +112,5 @@ func newFilesWriter() Logger {
}
func
init
()
{
Register
(
"multifile"
,
newFilesWriter
)
Register
(
AdapterMultiFile
,
newFilesWriter
)
}
vendor/github.com/astaxie/beego/logs/smtp.go
浏览文件 @
899d6837
...
...
@@ -156,5 +156,5 @@ func (s *SMTPWriter) Destroy() {
}
func
init
()
{
Register
(
"smtp"
,
newSMTPWriter
)
Register
(
AdapterMail
,
newSMTPWriter
)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录