Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
e0a36fb6
Commit
e0a36fb6
authored
Mar 26, 2016
by
miraclesu
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into feature/orm_auto
parents
8f70df6c
85a9b054
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
413 additions
and
168 deletions
+413
-168
admin.go
admin.go
+3
-2
app.go
app.go
+14
-14
redis_test.go
cache/redis/redis_test.go
+1
-2
ssdb_test.go
cache/ssdb/ssdb_test.go
+2
-1
config.go
config.go
+4
-3
input_test.go
context/input_test.go
+1
-1
output.go
context/output.go
+7
-0
filter_test.go
filter_test.go
+0
-6
hooks.go
hooks.go
+2
-1
log.go
log.go
+15
-20
conn.go
logs/conn.go
+1
-1
console.go
logs/console.go
+1
-1
es.go
logs/es/es.go
+1
-1
file.go
logs/file.go
+1
-1
log.go
logs/log.go
+238
-56
multifile.go
logs/multifile.go
+1
-1
smtp.go
logs/smtp.go
+1
-1
migration.go
migration/migration.go
+17
-17
db_postgres.go
orm/db_postgres.go
+9
-7
models_test.go
orm/models_test.go
+5
-0
orm.go
orm/orm.go
+8
-1
orm_test.go
orm/orm_test.go
+25
-0
parser.go
parser.go
+3
-2
router.go
router.go
+9
-8
router_test.go
router_test.go
+6
-5
sess_mysql.go
session/mysql/sess_mysql.go
+0
-1
sess_file.go
session/sess_file.go
+7
-5
session.go
session/session.go
+18
-0
staticfile.go
staticfile.go
+3
-2
template.go
template.go
+5
-4
captcha.go
utils/captcha/captcha.go
+4
-3
controller.go
utils/pagination/controller.go
+1
-1
No files found.
admin.go
View file @
e0a36fb6
...
...
@@ -24,6 +24,7 @@ import (
"time"
"github.com/astaxie/beego/grace"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/toolbox"
"github.com/astaxie/beego/utils"
)
...
...
@@ -410,7 +411,7 @@ func (admin *adminApp) Run() {
for
p
,
f
:=
range
admin
.
routers
{
http
.
Handle
(
p
,
f
)
}
BeeLogger
.
Info
(
"Admin server Running on %s"
,
addr
)
logs
.
Info
(
"Admin server Running on %s"
,
addr
)
var
err
error
if
BConfig
.
Listen
.
Graceful
{
...
...
@@ -419,6 +420,6 @@ func (admin *adminApp) Run() {
err
=
http
.
ListenAndServe
(
addr
,
nil
)
}
if
err
!=
nil
{
BeeLogger
.
Critical
(
"Admin ListenAndServe: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
logs
.
Critical
(
"Admin ListenAndServe: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
}
}
app.go
View file @
e0a36fb6
...
...
@@ -16,7 +16,6 @@ package beego
import
(
"fmt"
"log"
"net"
"net/http"
"net/http/fcgi"
...
...
@@ -25,6 +24,7 @@ import (
"time"
"github.com/astaxie/beego/grace"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/utils"
)
...
...
@@ -69,9 +69,9 @@ func (app *App) Run() {
if
BConfig
.
Listen
.
EnableFcgi
{
if
BConfig
.
Listen
.
EnableStdIo
{
if
err
=
fcgi
.
Serve
(
nil
,
app
.
Handlers
);
err
==
nil
{
// standard I/O
BeeLogger
.
Info
(
"Use FCGI via standard I/O"
)
logs
.
Info
(
"Use FCGI via standard I/O"
)
}
else
{
BeeLogger
.
Critical
(
"Cannot use FCGI via standard I/O"
,
err
)
logs
.
Critical
(
"Cannot use FCGI via standard I/O"
,
err
)
}
return
}
...
...
@@ -85,10 +85,10 @@ func (app *App) Run() {
l
,
err
=
net
.
Listen
(
"tcp"
,
addr
)
}
if
err
!=
nil
{
BeeLogger
.
Critical
(
"Listen: "
,
err
)
logs
.
Critical
(
"Listen: "
,
err
)
}
if
err
=
fcgi
.
Serve
(
l
,
app
.
Handlers
);
err
!=
nil
{
BeeLogger
.
Critical
(
"fcgi.Serve: "
,
err
)
logs
.
Critical
(
"fcgi.Serve: "
,
err
)
}
return
}
...
...
@@ -96,7 +96,7 @@ func (app *App) Run() {
app
.
Server
.
Handler
=
app
.
Handlers
app
.
Server
.
ReadTimeout
=
time
.
Duration
(
BConfig
.
Listen
.
ServerTimeOut
)
*
time
.
Second
app
.
Server
.
WriteTimeout
=
time
.
Duration
(
BConfig
.
Listen
.
ServerTimeOut
)
*
time
.
Second
app
.
Server
.
ErrorLog
=
log
.
New
(
BeeLogger
,
""
,
0
)
app
.
Server
.
ErrorLog
=
log
s
.
GetLogger
(
"HTTP"
)
// run graceful mode
if
BConfig
.
Listen
.
Graceful
{
...
...
@@ -113,7 +113,7 @@ func (app *App) Run() {
server
.
Server
.
ReadTimeout
=
app
.
Server
.
ReadTimeout
server
.
Server
.
WriteTimeout
=
app
.
Server
.
WriteTimeout
if
err
:=
server
.
ListenAndServeTLS
(
BConfig
.
Listen
.
HTTPSCertFile
,
BConfig
.
Listen
.
HTTPSKeyFile
);
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServeTLS: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
logs
.
Critical
(
"ListenAndServeTLS: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
...
...
@@ -128,7 +128,7 @@ func (app *App) Run() {
server
.
Network
=
"tcp4"
}
if
err
:=
server
.
ListenAndServe
();
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServe: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
logs
.
Critical
(
"ListenAndServe: "
,
err
,
fmt
.
Sprintf
(
"%d"
,
os
.
Getpid
()))
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
...
...
@@ -146,9 +146,9 @@ func (app *App) Run() {
if
BConfig
.
Listen
.
HTTPSPort
!=
0
{
app
.
Server
.
Addr
=
fmt
.
Sprintf
(
"%s:%d"
,
BConfig
.
Listen
.
HTTPSAddr
,
BConfig
.
Listen
.
HTTPSPort
)
}
BeeLogger
.
Info
(
"https server Running on %s"
,
app
.
Server
.
Addr
)
logs
.
Info
(
"https server Running on %s"
,
app
.
Server
.
Addr
)
if
err
:=
app
.
Server
.
ListenAndServeTLS
(
BConfig
.
Listen
.
HTTPSCertFile
,
BConfig
.
Listen
.
HTTPSKeyFile
);
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServeTLS: "
,
err
)
logs
.
Critical
(
"ListenAndServeTLS: "
,
err
)
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
...
...
@@ -157,24 +157,24 @@ func (app *App) Run() {
if
BConfig
.
Listen
.
EnableHTTP
{
go
func
()
{
app
.
Server
.
Addr
=
addr
BeeLogger
.
Info
(
"http server Running on %s"
,
app
.
Server
.
Addr
)
logs
.
Info
(
"http server Running on %s"
,
app
.
Server
.
Addr
)
if
BConfig
.
Listen
.
ListenTCP4
{
ln
,
err
:=
net
.
Listen
(
"tcp4"
,
app
.
Server
.
Addr
)
if
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServe: "
,
err
)
logs
.
Critical
(
"ListenAndServe: "
,
err
)
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
return
}
if
err
=
app
.
Server
.
Serve
(
ln
);
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServe: "
,
err
)
logs
.
Critical
(
"ListenAndServe: "
,
err
)
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
return
}
}
else
{
if
err
:=
app
.
Server
.
ListenAndServe
();
err
!=
nil
{
BeeLogger
.
Critical
(
"ListenAndServe: "
,
err
)
logs
.
Critical
(
"ListenAndServe: "
,
err
)
time
.
Sleep
(
100
*
time
.
Microsecond
)
endRunning
<-
true
}
...
...
cache/redis/redis_test.go
View file @
e0a36fb6
...
...
@@ -18,9 +18,8 @@ import (
"testing"
"time"
"github.com/garyburd/redigo/redis"
"github.com/astaxie/beego/cache"
"github.com/garyburd/redigo/redis"
)
func
TestRedisCache
(
t
*
testing
.
T
)
{
...
...
cache/ssdb/ssdb_test.go
View file @
e0a36fb6
package
ssdb
import
(
"github.com/astaxie/beego/cache"
"strconv"
"testing"
"time"
"github.com/astaxie/beego/cache"
)
func
TestSsdbcacheCache
(
t
*
testing
.
T
)
{
...
...
config.go
View file @
e0a36fb6
...
...
@@ -21,6 +21,7 @@ import (
"strings"
"github.com/astaxie/beego/config"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/session"
"github.com/astaxie/beego/utils"
)
...
...
@@ -293,14 +294,14 @@ func parseConfig(appConfigPath string) (err error) {
}
//init log
BeeLogger
.
Reset
()
logs
.
Reset
()
for
adaptor
,
config
:=
range
BConfig
.
Log
.
Outputs
{
err
=
BeeLogger
.
SetLogger
(
adaptor
,
config
)
err
=
logs
.
SetLogger
(
adaptor
,
config
)
if
err
!=
nil
{
fmt
.
Printf
(
"%s with the config `%s` got err:%s
\n
"
,
adaptor
,
config
,
err
)
}
}
SetLogFuncCall
(
BConfig
.
Log
.
FileLineNum
)
logs
.
SetLogFuncCall
(
BConfig
.
Log
.
FileLineNum
)
return
nil
}
...
...
context/input_test.go
View file @
e0a36fb6
...
...
@@ -100,7 +100,7 @@ func TestSubDomain(t *testing.T) {
/* TODO Fix this
r, _ = http.NewRequest("GET", "http://127.0.0.1/", nil)
beegoInput.Request = r
beegoInput.
Context.
Request = r
if beegoInput.SubDomains() != "" {
t.Fatal("Subdomain parse error, got " + beegoInput.SubDomains())
}
...
...
context/output.go
View file @
e0a36fb6
...
...
@@ -24,6 +24,7 @@ import (
"io"
"mime"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
...
...
@@ -237,6 +238,12 @@ func (output *BeegoOutput) XML(data interface{}, hasIndent bool) error {
// Download forces response for download file.
// it prepares the download response header automatically.
func
(
output
*
BeegoOutput
)
Download
(
file
string
,
filename
...
string
)
{
// check get file error, file not found or other error.
if
_
,
err
:=
os
.
Stat
(
file
);
err
!=
nil
{
http
.
ServeFile
(
output
.
Context
.
ResponseWriter
,
output
.
Context
.
Request
,
file
)
return
}
output
.
Header
(
"Content-Description"
,
"File Transfer"
)
output
.
Header
(
"Content-Type"
,
"application/octet-stream"
)
if
len
(
filename
)
>
0
&&
filename
[
0
]
!=
""
{
...
...
filter_test.go
View file @
e0a36fb6
...
...
@@ -20,14 +20,8 @@ import (
"testing"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
)
func
init
()
{
BeeLogger
=
logs
.
NewLogger
(
10000
)
BeeLogger
.
SetLogger
(
"console"
,
""
)
}
var
FilterUser
=
func
(
ctx
*
context
.
Context
)
{
ctx
.
Output
.
Body
([]
byte
(
"i am "
+
ctx
.
Input
.
Param
(
":last"
)
+
ctx
.
Input
.
Param
(
":first"
)))
}
...
...
hooks.go
View file @
e0a36fb6
...
...
@@ -7,6 +7,7 @@ import (
"path/filepath"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/session"
)
...
...
@@ -71,7 +72,7 @@ func registerSession() error {
func
registerTemplate
()
error
{
if
err
:=
BuildTemplate
(
BConfig
.
WebConfig
.
ViewsPath
);
err
!=
nil
{
if
BConfig
.
RunMode
==
DEV
{
Warn
(
err
)
logs
.
Warn
(
err
)
}
return
err
}
...
...
log.go
View file @
e0a36fb6
...
...
@@ -33,82 +33,77 @@ const (
)
// BeeLogger references the used application logger.
var
BeeLogger
=
logs
.
NewLogger
(
100
)
var
BeeLogger
=
logs
.
GetBeeLogger
(
)
// SetLevel sets the global log level used by the simple logger.
func
SetLevel
(
l
int
)
{
BeeLogger
.
SetLevel
(
l
)
logs
.
SetLevel
(
l
)
}
// SetLogFuncCall set the CallDepth, default is 3
func
SetLogFuncCall
(
b
bool
)
{
BeeLogger
.
EnableFuncCallDepth
(
b
)
BeeLogger
.
SetLogFuncCallDepth
(
3
)
logs
.
SetLogFuncCall
(
b
)
}
// SetLogger sets a new logger.
func
SetLogger
(
adaptername
string
,
config
string
)
error
{
err
:=
BeeLogger
.
SetLogger
(
adaptername
,
config
)
if
err
!=
nil
{
return
err
}
return
nil
return
logs
.
SetLogger
(
adaptername
,
config
)
}
// Emergency logs a message at emergency level.
func
Emergency
(
v
...
interface
{})
{
BeeLogger
.
Emergency
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Emergency
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Alert logs a message at alert level.
func
Alert
(
v
...
interface
{})
{
BeeLogger
.
Alert
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Alert
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Critical logs a message at critical level.
func
Critical
(
v
...
interface
{})
{
BeeLogger
.
Critical
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Critical
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Error logs a message at error level.
func
Error
(
v
...
interface
{})
{
BeeLogger
.
Error
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Error
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Warning logs a message at warning level.
func
Warning
(
v
...
interface
{})
{
BeeLogger
.
Warning
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Warning
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Warn compatibility alias for Warning()
func
Warn
(
v
...
interface
{})
{
BeeLogger
.
Warn
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Warn
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Notice logs a message at notice level.
func
Notice
(
v
...
interface
{})
{
BeeLogger
.
Notice
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Notice
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Informational logs a message at info level.
func
Informational
(
v
...
interface
{})
{
BeeLogger
.
Informational
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Informational
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Info compatibility alias for Warning()
func
Info
(
v
...
interface
{})
{
BeeLogger
.
Info
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Info
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Debug logs a message at debug level.
func
Debug
(
v
...
interface
{})
{
BeeLogger
.
Debug
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Debug
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
// Trace logs a message at trace level.
// compatibility alias for Warning()
func
Trace
(
v
...
interface
{})
{
BeeLogger
.
Trace
(
generateFmtStr
(
len
(
v
)),
v
...
)
logs
.
Trace
(
generateFmtStr
(
len
(
v
)),
v
...
)
}
func
generateFmtStr
(
n
int
)
string
{
...
...
logs/conn.go
View file @
e0a36fb6
...
...
@@ -113,5 +113,5 @@ func (c *connWriter) needToConnectOnMsg() bool {
}
func
init
()
{
Register
(
"conn"
,
NewConn
)
Register
(
AdapterConn
,
NewConn
)
}
logs/console.go
View file @
e0a36fb6
...
...
@@ -97,5 +97,5 @@ func (c *consoleWriter) Flush() {
}
func
init
()
{
Register
(
"console"
,
NewConsole
)
Register
(
AdapterConsole
,
NewConsole
)
}
logs/es/es.go
View file @
e0a36fb6
...
...
@@ -76,5 +76,5 @@ func (el *esLogger) Flush() {
}
func
init
()
{
logs
.
Register
(
"es"
,
NewES
)
logs
.
Register
(
logs
.
AdapterEs
,
NewES
)
}
logs/file.go
View file @
e0a36fb6
...
...
@@ -282,5 +282,5 @@ func (w *fileLogWriter) Flush() {
}
func
init
()
{
Register
(
"file"
,
newFileWriter
)
Register
(
AdapterFile
,
newFileWriter
)
}
logs/log.go
View file @
e0a36fb6
...
...
@@ -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,28 @@ 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
{
bl
.
lock
.
Lock
()
defer
bl
.
lock
.
Unlock
()
if
bl
.
asynchronous
{
return
bl
}
bl
.
asynchronous
=
true
bl
.
msgChan
=
make
(
chan
*
logMsg
,
bl
.
msgChanLen
)
logMsgPool
=
&
sync
.
Pool
{
New
:
func
()
interface
{}
{
return
&
logMsg
{}
...
...
@@ -143,10 +172,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 +195,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
()
...
...
@@ -204,15 +243,29 @@ func (bl *BeeLogger) Write(p []byte) (n int, err error) {
if
p
[
len
(
p
)
-
1
]
==
'\n'
{
p
=
p
[
0
:
len
(
p
)
-
1
]
}
// set
LevelCritica
l to ensure all log message will be write out
err
=
bl
.
writeMsg
(
LevelCritica
l
,
string
(
p
))
// set
levelLoggerImp
l to ensure all log message will be write out
err
=
bl
.
writeMsg
(
levelLoggerImp
l
,
string
(
p
))
if
err
==
nil
{
return
len
(
p
),
err
}
return
0
,
err
}
func
(
bl
*
BeeLogger
)
writeMsg
(
logLevel
int
,
msg
string
)
error
{
func
(
bl
*
BeeLogger
)
writeMsg
(
logLevel
int
,
msg
string
,
v
...
interface
{})
error
{
if
!
beeLogger
.
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
)
...
...
@@ -289,8 +342,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.
...
...
@@ -298,8 +350,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.
...
...
@@ -307,8 +358,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.
...
...
@@ -316,17 +366,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.
...
...
@@ -334,17 +379,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.
...
...
@@ -352,38 +392,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.
...
...
@@ -402,6 +435,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
{
...
...
@@ -409,7 +443,6 @@ func (bl *BeeLogger) Close() {
}
bl
.
outputs
=
nil
}
close
(
bl
.
msgChan
)
close
(
bl
.
signalChan
)
}
...
...
@@ -423,16 +456,165 @@ 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
()
*
BeeLogger
{
return
beeLogger
.
Async
()
}
// SetLevel sets the global log level used by the simple logger.
func
SetLevel
(
l
int
)
{
beeLogger
.
SetLevel
(
l
)
}
// SetLogFuncCall set the CallDepth, default is 3
func
SetLogFuncCall
(
b
bool
)
{
beeLogger
.
EnableFuncCallDepth
(
b
)
beeLogger
.
SetLogFuncCallDepth
(
3
)
}
// 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
...
)
}
logs/multifile.go
View file @
e0a36fb6
...
...
@@ -112,5 +112,5 @@ func newFilesWriter() Logger {
}
func
init
()
{
Register
(
"multifile"
,
newFilesWriter
)
Register
(
AdapterMultiFile
,
newFilesWriter
)
}
logs/smtp.go
View file @
e0a36fb6
...
...
@@ -156,5 +156,5 @@ func (s *SMTPWriter) Destroy() {
}
func
init
()
{
Register
(
"smtp"
,
newSMTPWriter
)
Register
(
AdapterMail
,
newSMTPWriter
)
}
migration/migration.go
View file @
e0a36fb6
...
...
@@ -33,7 +33,7 @@ import (
"strings"
"time"
"github.com/astaxie/beego"
"github.com/astaxie/beego
/logs
"
"github.com/astaxie/beego/orm"
)
...
...
@@ -90,7 +90,7 @@ func (m *Migration) Reset() {
func
(
m
*
Migration
)
Exec
(
name
,
status
string
)
error
{
o
:=
orm
.
NewOrm
()
for
_
,
s
:=
range
m
.
sqls
{
beego
.
Info
(
"exec sql:"
,
s
)
logs
.
Info
(
"exec sql:"
,
s
)
r
:=
o
.
Raw
(
s
)
_
,
err
:=
r
.
Exec
()
if
err
!=
nil
{
...
...
@@ -144,20 +144,20 @@ func Upgrade(lasttime int64) error {
i
:=
0
for
_
,
v
:=
range
sm
{
if
v
.
created
>
lasttime
{
beego
.
Info
(
"start upgrade"
,
v
.
name
)
logs
.
Info
(
"start upgrade"
,
v
.
name
)
v
.
m
.
Reset
()
v
.
m
.
Up
()
err
:=
v
.
m
.
Exec
(
v
.
name
,
"up"
)
if
err
!=
nil
{
beego
.
Error
(
"execute error:"
,
err
)
logs
.
Error
(
"execute error:"
,
err
)
time
.
Sleep
(
2
*
time
.
Second
)
return
err
}
beego
.
Info
(
"end upgrade:"
,
v
.
name
)
logs
.
Info
(
"end upgrade:"
,
v
.
name
)
i
++
}
}
beego
.
Info
(
"total success upgrade:"
,
i
,
" migration"
)
logs
.
Info
(
"total success upgrade:"
,
i
,
" migration"
)
time
.
Sleep
(
2
*
time
.
Second
)
return
nil
}
...
...
@@ -165,20 +165,20 @@ func Upgrade(lasttime int64) error {
// Rollback rollback the migration by the name
func
Rollback
(
name
string
)
error
{
if
v
,
ok
:=
migrationMap
[
name
];
ok
{
beego
.
Info
(
"start rollback"
)
logs
.
Info
(
"start rollback"
)
v
.
Reset
()
v
.
Down
()
err
:=
v
.
Exec
(
name
,
"down"
)
if
err
!=
nil
{
beego
.
Error
(
"execute error:"
,
err
)
logs
.
Error
(
"execute error:"
,
err
)
time
.
Sleep
(
2
*
time
.
Second
)
return
err
}
beego
.
Info
(
"end rollback"
)
logs
.
Info
(
"end rollback"
)
time
.
Sleep
(
2
*
time
.
Second
)
return
nil
}
beego
.
Error
(
"not exist the migrationMap name:"
+
name
)
logs
.
Error
(
"not exist the migrationMap name:"
+
name
)
time
.
Sleep
(
2
*
time
.
Second
)
return
errors
.
New
(
"not exist the migrationMap name:"
+
name
)
}
...
...
@@ -191,23 +191,23 @@ func Reset() error {
for
j
:=
len
(
sm
)
-
1
;
j
>=
0
;
j
--
{
v
:=
sm
[
j
]
if
isRollBack
(
v
.
name
)
{
beego
.
Info
(
"skip the"
,
v
.
name
)
logs
.
Info
(
"skip the"
,
v
.
name
)
time
.
Sleep
(
1
*
time
.
Second
)
continue
}
beego
.
Info
(
"start reset:"
,
v
.
name
)
logs
.
Info
(
"start reset:"
,
v
.
name
)
v
.
m
.
Reset
()
v
.
m
.
Down
()
err
:=
v
.
m
.
Exec
(
v
.
name
,
"down"
)
if
err
!=
nil
{
beego
.
Error
(
"execute error:"
,
err
)
logs
.
Error
(
"execute error:"
,
err
)
time
.
Sleep
(
2
*
time
.
Second
)
return
err
}
i
++
beego
.
Info
(
"end reset:"
,
v
.
name
)
logs
.
Info
(
"end reset:"
,
v
.
name
)
}
beego
.
Info
(
"total success reset:"
,
i
,
" migration"
)
logs
.
Info
(
"total success reset:"
,
i
,
" migration"
)
time
.
Sleep
(
2
*
time
.
Second
)
return
nil
}
...
...
@@ -216,7 +216,7 @@ func Reset() error {
func
Refresh
()
error
{
err
:=
Reset
()
if
err
!=
nil
{
beego
.
Error
(
"execute error:"
,
err
)
logs
.
Error
(
"execute error:"
,
err
)
time
.
Sleep
(
2
*
time
.
Second
)
return
err
}
...
...
@@ -265,7 +265,7 @@ func isRollBack(name string) bool {
var
maps
[]
orm
.
Params
num
,
err
:=
o
.
Raw
(
"select * from migrations where `name` = ? order by id_migration desc"
,
name
)
.
Values
(
&
maps
)
if
err
!=
nil
{
beego
.
Info
(
"get name has error"
,
err
)
logs
.
Info
(
"get name has error"
,
err
)
return
false
}
if
num
<=
0
{
...
...
orm/db_postgres.go
View file @
e0a36fb6
...
...
@@ -123,14 +123,16 @@ func (d *dbBasePostgres) ReplaceMarks(query *string) {
}
// make returning sql support for postgresql.
func
(
d
*
dbBasePostgres
)
HasReturningID
(
mi
*
modelInfo
,
query
*
string
)
(
has
bool
)
{
if
mi
.
fields
.
pk
.
auto
{
if
query
!=
nil
{
*
query
=
fmt
.
Sprintf
(
`%s RETURNING "%s"`
,
*
query
,
mi
.
fields
.
pk
.
column
)
}
has
=
true
func
(
d
*
dbBasePostgres
)
HasReturningID
(
mi
*
modelInfo
,
query
*
string
)
bool
{
fi
:=
mi
.
fields
.
pk
if
fi
.
fieldType
&
IsPositiveIntegerField
==
0
&&
fi
.
fieldType
&
IsIntegerField
==
0
{
return
false
}
if
query
!=
nil
{
*
query
=
fmt
.
Sprintf
(
`%s RETURNING "%s"`
,
*
query
,
fi
.
column
)
}
return
return
true
}
// show table sql for postgresql.
...
...
orm/models_test.go
View file @
e0a36fb6
...
...
@@ -392,6 +392,11 @@ type IntegerPk struct {
Value
string
}
type
UintPk
struct
{
Id
uint32
`orm:"pk"`
Name
string
}
var
DBARGS
=
struct
{
Driver
string
Source
string
...
...
orm/orm.go
View file @
e0a36fb6
...
...
@@ -140,7 +140,14 @@ func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, i
return
(
err
==
nil
),
id
,
err
}
return
false
,
ind
.
FieldByIndex
(
mi
.
fields
.
pk
.
fieldIndex
)
.
Int
(),
err
id
,
vid
:=
int64
(
0
),
ind
.
FieldByIndex
(
mi
.
fields
.
pk
.
fieldIndex
)
if
mi
.
fields
.
pk
.
fieldType
&
IsPositiveIntegerField
>
0
{
id
=
int64
(
vid
.
Uint
())
}
else
{
id
=
vid
.
Int
()
}
return
false
,
id
,
err
}
// insert model data to database
...
...
orm/orm_test.go
View file @
e0a36fb6
...
...
@@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) {
RegisterModel
(
new
(
InLine
))
RegisterModel
(
new
(
InLineOneToOne
))
RegisterModel
(
new
(
IntegerPk
))
RegisterModel
(
new
(
UintPk
))
err
:=
RunSyncdb
(
"default"
,
true
,
Debug
)
throwFail
(
t
,
err
)
...
...
@@ -213,6 +214,7 @@ func TestRegisterModels(t *testing.T) {
RegisterModel
(
new
(
InLine
))
RegisterModel
(
new
(
InLineOneToOne
))
RegisterModel
(
new
(
IntegerPk
))
RegisterModel
(
new
(
UintPk
))
BootStrap
()
...
...
@@ -2034,3 +2036,26 @@ func TestInsertAuto(t *testing.T) {
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
id
,
sid
))
}
func
TestUintPk
(
t
*
testing
.
T
)
{
name
:=
"go"
u
:=
&
UintPk
{
Id
:
8
,
Name
:
name
,
}
created
,
pk
,
err
:=
dORM
.
ReadOrCreate
(
u
,
"Id"
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
created
,
true
))
throwFail
(
t
,
AssertIs
(
u
.
Name
,
name
))
nu
:=
&
UintPk
{
Id
:
8
}
created
,
pk
,
err
=
dORM
.
ReadOrCreate
(
nu
,
"Id"
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
created
,
false
))
throwFail
(
t
,
AssertIs
(
nu
.
Id
,
u
.
Id
))
throwFail
(
t
,
AssertIs
(
pk
,
u
.
Id
))
throwFail
(
t
,
AssertIs
(
nu
.
Name
,
name
))
dORM
.
Delete
(
u
)
}
parser.go
View file @
e0a36fb6
...
...
@@ -27,6 +27,7 @@ import (
"sort"
"strings"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/utils"
)
...
...
@@ -58,7 +59,7 @@ func parserPkg(pkgRealpath, pkgpath string) error {
rep
:=
strings
.
NewReplacer
(
"/"
,
"_"
,
"."
,
"_"
)
commentFilename
=
coomentPrefix
+
rep
.
Replace
(
pkgpath
)
+
".go"
if
!
compareFile
(
pkgRealpath
)
{
Info
(
pkgRealpath
+
" no changed"
)
logs
.
Info
(
pkgRealpath
+
" no changed"
)
return
nil
}
genInfoList
=
make
(
map
[
string
][]
ControllerComments
)
...
...
@@ -131,7 +132,7 @@ func parserComments(comments *ast.CommentGroup, funcName, controllerName, pkgpat
func
genRouterCode
()
{
os
.
Mkdir
(
path
.
Join
(
AppPath
,
"routers"
),
0755
)
Info
(
"generate router from comments"
)
logs
.
Info
(
"generate router from comments"
)
var
(
globalinfo
string
sortKey
[]
string
...
...
router.go
View file @
e0a36fb6
...
...
@@ -28,6 +28,7 @@ import (
"time"
beecontext
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/toolbox"
"github.com/astaxie/beego/utils"
)
...
...
@@ -439,11 +440,11 @@ func (p *ControllerRegister) insertFilterRouter(pos int, mr *FilterRouter) (err
func
(
p
*
ControllerRegister
)
URLFor
(
endpoint
string
,
values
...
interface
{})
string
{
paths
:=
strings
.
Split
(
endpoint
,
"."
)
if
len
(
paths
)
<=
1
{
Warn
(
"urlfor endpoint must like path.controller.method"
)
logs
.
Warn
(
"urlfor endpoint must like path.controller.method"
)
return
""
}
if
len
(
values
)
%
2
!=
0
{
Warn
(
"urlfor params must key-value pair"
)
logs
.
Warn
(
"urlfor params must key-value pair"
)
return
""
}
params
:=
make
(
map
[
string
]
string
)
...
...
@@ -651,7 +652,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
var
err
error
context
.
Input
.
CruSession
,
err
=
GlobalSessions
.
SessionStart
(
rw
,
r
)
if
err
!=
nil
{
Error
(
err
)
logs
.
Error
(
err
)
exception
(
"503"
,
context
)
goto
Admin
}
...
...
@@ -780,7 +781,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request)
if
!
context
.
ResponseWriter
.
Started
&&
context
.
Output
.
Status
==
0
{
if
BConfig
.
WebConfig
.
AutoRender
{
if
err
:=
execController
.
Render
();
err
!=
nil
{
Error
(
err
)
logs
.
Error
(
err
)
}
}
}
...
...
@@ -825,7 +826,7 @@ Admin:
devInfo
=
fmt
.
Sprintf
(
"| % -10s | % -40s | % -16s | % -10s |"
,
r
.
Method
,
r
.
URL
.
Path
,
timeDur
.
String
(),
"notmatch"
)
}
if
DefaultAccessLogFilter
==
nil
||
!
DefaultAccessLogFilter
.
Filter
(
context
)
{
Debug
(
devInfo
)
logs
.
Debug
(
devInfo
)
}
}
...
...
@@ -850,14 +851,14 @@ func (p *ControllerRegister) recoverPanic(context *beecontext.Context) {
}
}
var
stack
string
Critical
(
"the request url is "
,
context
.
Input
.
URL
())
Critical
(
"Handler crashed with error"
,
err
)
logs
.
Critical
(
"the request url is "
,
context
.
Input
.
URL
())
logs
.
Critical
(
"Handler crashed with error"
,
err
)
for
i
:=
1
;
;
i
++
{
_
,
file
,
line
,
ok
:=
runtime
.
Caller
(
i
)
if
!
ok
{
break
}
Critical
(
fmt
.
Sprintf
(
"%s:%d"
,
file
,
line
))
logs
.
Critical
(
fmt
.
Sprintf
(
"%s:%d"
,
file
,
line
))
stack
=
stack
+
fmt
.
Sprintln
(
fmt
.
Sprintf
(
"%s:%d"
,
file
,
line
))
}
if
BConfig
.
RunMode
==
DEV
{
...
...
router_test.go
View file @
e0a36fb6
...
...
@@ -21,6 +21,7 @@ import (
"testing"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
)
type
TestController
struct
{
...
...
@@ -94,7 +95,7 @@ func TestUrlFor(t *testing.T) {
handler
.
Add
(
"/api/list"
,
&
TestController
{},
"*:List"
)
handler
.
Add
(
"/person/:last/:first"
,
&
TestController
{},
"*:Param"
)
if
a
:=
handler
.
URLFor
(
"TestController.List"
);
a
!=
"/api/list"
{
Info
(
a
)
logs
.
Info
(
a
)
t
.
Errorf
(
"TestController.List must equal to /api/list"
)
}
if
a
:=
handler
.
URLFor
(
"TestController.Param"
,
":last"
,
"xie"
,
":first"
,
"asta"
);
a
!=
"/person/xie/asta"
{
...
...
@@ -120,24 +121,24 @@ func TestUrlFor2(t *testing.T) {
handler
.
Add
(
"/v1/:v(.+)_cms/ttt_:id(.+)_:page(.+).html"
,
&
TestController
{},
"*:Param"
)
handler
.
Add
(
"/:year:int/:month:int/:title/:entid"
,
&
TestController
{})
if
handler
.
URLFor
(
"TestController.GetURL"
,
":username"
,
"astaxie"
)
!=
"/v1/astaxie/edit"
{
Info
(
handler
.
URLFor
(
"TestController.GetURL"
))
logs
.
Info
(
handler
.
URLFor
(
"TestController.GetURL"
))
t
.
Errorf
(
"TestController.List must equal to /v1/astaxie/edit"
)
}
if
handler
.
URLFor
(
"TestController.List"
,
":v"
,
"za"
,
":id"
,
"12"
,
":page"
,
"123"
)
!=
"/v1/za/cms_12_123.html"
{
Info
(
handler
.
URLFor
(
"TestController.List"
))
logs
.
Info
(
handler
.
URLFor
(
"TestController.List"
))
t
.
Errorf
(
"TestController.List must equal to /v1/za/cms_12_123.html"
)
}
if
handler
.
URLFor
(
"TestController.Param"
,
":v"
,
"za"
,
":id"
,
"12"
,
":page"
,
"123"
)
!=
"/v1/za_cms/ttt_12_123.html"
{
Info
(
handler
.
URLFor
(
"TestController.Param"
))
logs
.
Info
(
handler
.
URLFor
(
"TestController.Param"
))
t
.
Errorf
(
"TestController.List must equal to /v1/za_cms/ttt_12_123.html"
)
}
if
handler
.
URLFor
(
"TestController.Get"
,
":year"
,
"1111"
,
":month"
,
"11"
,
":title"
,
"aaaa"
,
":entid"
,
"aaaa"
)
!=
"/1111/11/aaaa/aaaa"
{
Info
(
handler
.
URLFor
(
"TestController.Get"
))
logs
.
Info
(
handler
.
URLFor
(
"TestController.Get"
))
t
.
Errorf
(
"TestController.Get must equal to /1111/11/aaaa/aaaa"
)
}
}
...
...
session/mysql/sess_mysql.go
View file @
e0a36fb6
...
...
@@ -115,7 +115,6 @@ func (st *SessionStore) SessionRelease(w http.ResponseWriter) {
}
st
.
c
.
Exec
(
"UPDATE "
+
TableName
+
" set `session_data`=?, `session_expiry`=? where session_key=?"
,
b
,
time
.
Now
()
.
Unix
(),
st
.
sid
)
}
// Provider mysql session provider
...
...
session/sess_file.go
View file @
e0a36fb6
...
...
@@ -16,7 +16,6 @@ package session
import
(
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
...
...
@@ -82,14 +81,17 @@ func (fs *FileSessionStore) SessionID() string {
func
(
fs
*
FileSessionStore
)
SessionRelease
(
w
http
.
ResponseWriter
)
{
b
,
err
:=
EncodeGob
(
fs
.
values
)
if
err
!=
nil
{
SLogger
.
Println
(
err
)
return
}
_
,
err
=
os
.
Stat
(
path
.
Join
(
filepder
.
savePath
,
string
(
fs
.
sid
[
0
]),
string
(
fs
.
sid
[
1
]),
fs
.
sid
))
var
f
*
os
.
File
if
err
==
nil
{
f
,
err
=
os
.
OpenFile
(
path
.
Join
(
filepder
.
savePath
,
string
(
fs
.
sid
[
0
]),
string
(
fs
.
sid
[
1
]),
fs
.
sid
),
os
.
O_RDWR
,
0777
)
SLogger
.
Println
(
err
)
}
else
if
os
.
IsNotExist
(
err
)
{
f
,
err
=
os
.
Create
(
path
.
Join
(
filepder
.
savePath
,
string
(
fs
.
sid
[
0
]),
string
(
fs
.
sid
[
1
]),
fs
.
sid
))
SLogger
.
Println
(
err
)
}
else
{
return
}
...
...
@@ -123,7 +125,7 @@ func (fp *FileProvider) SessionRead(sid string) (Store, error) {
err
:=
os
.
MkdirAll
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
])),
0777
)
if
err
!=
nil
{
p
rintln
(
err
.
Error
())
SLogger
.
P
rintln
(
err
.
Error
())
}
_
,
err
=
os
.
Stat
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
]),
sid
))
var
f
*
os
.
File
...
...
@@ -191,7 +193,7 @@ func (fp *FileProvider) SessionAll() int {
return
a
.
visit
(
path
,
f
,
err
)
})
if
err
!=
nil
{
fmt
.
Printf
(
"filepath.Walk() returned %v
\n
"
,
err
)
SLogger
.
Printf
(
"filepath.Walk() returned %v
\n
"
,
err
)
return
0
}
return
a
.
total
...
...
@@ -205,11 +207,11 @@ func (fp *FileProvider) SessionRegenerate(oldsid, sid string) (Store, error) {
err
:=
os
.
MkdirAll
(
path
.
Join
(
fp
.
savePath
,
string
(
oldsid
[
0
]),
string
(
oldsid
[
1
])),
0777
)
if
err
!=
nil
{
p
rintln
(
err
.
Error
())
SLogger
.
P
rintln
(
err
.
Error
())
}
err
=
os
.
MkdirAll
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
])),
0777
)
if
err
!=
nil
{
p
rintln
(
err
.
Error
())
SLogger
.
P
rintln
(
err
.
Error
())
}
_
,
err
=
os
.
Stat
(
path
.
Join
(
fp
.
savePath
,
string
(
sid
[
0
]),
string
(
sid
[
1
]),
sid
))
var
newf
*
os
.
File
...
...
session/session.go
View file @
e0a36fb6
...
...
@@ -32,8 +32,11 @@ import (
"encoding/hex"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"net/url"
"os"
"time"
)
...
...
@@ -61,6 +64,9 @@ type Provider interface {
var
provides
=
make
(
map
[
string
]
Provider
)
// SLogger a helpful variable to log information about session
var
SLogger
=
NewSessionLog
(
os
.
Stderr
)
// Register makes a session provide available by the provided name.
// If Register is called twice with the same name or if driver is nil,
// it panics.
...
...
@@ -296,3 +302,15 @@ func (manager *Manager) isSecure(req *http.Request) bool {
}
return
true
}
// Log implement the log.Logger
type
Log
struct
{
*
log
.
Logger
}
// NewSessionLog set io.Writer to create a Logger for session.
func
NewSessionLog
(
out
io
.
Writer
)
*
Log
{
sl
:=
new
(
Log
)
sl
.
Logger
=
log
.
New
(
out
,
"[SESSION]"
,
1e9
)
return
sl
}
staticfile.go
View file @
e0a36fb6
...
...
@@ -27,6 +27,7 @@ import (
"time"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
)
var
errNotStaticRequest
=
errors
.
New
(
"request not a static file request"
)
...
...
@@ -48,7 +49,7 @@ func serverStaticRouter(ctx *context.Context) {
if
filePath
==
""
||
fileInfo
==
nil
{
if
BConfig
.
RunMode
==
DEV
{
Warn
(
"Can't find/open the file:"
,
filePath
,
err
)
logs
.
Warn
(
"Can't find/open the file:"
,
filePath
,
err
)
}
http
.
NotFound
(
ctx
.
ResponseWriter
,
ctx
.
Request
)
return
...
...
@@ -72,7 +73,7 @@ func serverStaticRouter(ctx *context.Context) {
b
,
n
,
sch
,
err
:=
openFile
(
filePath
,
fileInfo
,
acceptEncoding
)
if
err
!=
nil
{
if
BConfig
.
RunMode
==
DEV
{
Warn
(
"Can't compress the file:"
,
filePath
,
err
)
logs
.
Warn
(
"Can't compress the file:"
,
filePath
,
err
)
}
http
.
NotFound
(
ctx
.
ResponseWriter
,
ctx
.
Request
)
return
...
...
template.go
View file @
e0a36fb6
...
...
@@ -26,6 +26,7 @@ import (
"strings"
"sync"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/utils"
)
...
...
@@ -46,7 +47,7 @@ func executeTemplate(wr io.Writer, name string, data interface{}) error {
if
t
,
ok
:=
beeTemplates
[
name
];
ok
{
err
:=
t
.
ExecuteTemplate
(
wr
,
name
,
data
)
if
err
!=
nil
{
Trace
(
"template Execute err:"
,
err
)
logs
.
Trace
(
"template Execute err:"
,
err
)
}
return
err
}
...
...
@@ -162,7 +163,7 @@ func BuildTemplate(dir string, files ...string) error {
templatesLock
.
Lock
()
t
,
err
:=
getTemplate
(
self
.
root
,
file
,
v
...
)
if
err
!=
nil
{
Trace
(
"parse template err:"
,
file
,
err
)
logs
.
Trace
(
"parse template err:"
,
file
,
err
)
}
else
{
beeTemplates
[
file
]
=
t
}
...
...
@@ -240,7 +241,7 @@ func _getTemplate(t0 *template.Template, root string, subMods [][]string, others
var
subMods1
[][]
string
t
,
subMods1
,
err
=
getTplDeep
(
root
,
otherFile
,
""
,
t
)
if
err
!=
nil
{
Trace
(
"template parse file err:"
,
err
)
logs
.
Trace
(
"template parse file err:"
,
err
)
}
else
if
subMods1
!=
nil
&&
len
(
subMods1
)
>
0
{
t
,
err
=
_getTemplate
(
t
,
root
,
subMods1
,
others
...
)
}
...
...
@@ -261,7 +262,7 @@ func _getTemplate(t0 *template.Template, root string, subMods [][]string, others
var
subMods1
[][]
string
t
,
subMods1
,
err
=
getTplDeep
(
root
,
otherFile
,
""
,
t
)
if
err
!=
nil
{
Trace
(
"template parse file err:"
,
err
)
logs
.
Trace
(
"template parse file err:"
,
err
)
}
else
if
subMods1
!=
nil
&&
len
(
subMods1
)
>
0
{
t
,
err
=
_getTemplate
(
t
,
root
,
subMods1
,
others
...
)
}
...
...
utils/captcha/captcha.go
View file @
e0a36fb6
...
...
@@ -69,6 +69,7 @@ import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/cache"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/utils"
)
...
...
@@ -139,7 +140,7 @@ func (c *Captcha) Handler(ctx *context.Context) {
if
err
:=
c
.
store
.
Put
(
key
,
chars
,
c
.
Expiration
);
err
!=
nil
{
ctx
.
Output
.
SetStatus
(
500
)
ctx
.
WriteString
(
"captcha reload error"
)
beego
.
Error
(
"Reload Create Captcha Error:"
,
err
)
logs
.
Error
(
"Reload Create Captcha Error:"
,
err
)
return
}
}
else
{
...
...
@@ -154,7 +155,7 @@ func (c *Captcha) Handler(ctx *context.Context) {
img
:=
NewImage
(
chars
,
c
.
StdWidth
,
c
.
StdHeight
)
if
_
,
err
:=
img
.
WriteTo
(
ctx
.
ResponseWriter
);
err
!=
nil
{
beego
.
Error
(
"Write Captcha Image Error:"
,
err
)
logs
.
Error
(
"Write Captcha Image Error:"
,
err
)
}
}
...
...
@@ -162,7 +163,7 @@ func (c *Captcha) Handler(ctx *context.Context) {
func
(
c
*
Captcha
)
CreateCaptchaHTML
()
template
.
HTML
{
value
,
err
:=
c
.
CreateCaptcha
()
if
err
!=
nil
{
beego
.
Error
(
"Create Captcha Error:"
,
err
)
logs
.
Error
(
"Create Captcha Error:"
,
err
)
return
""
}
...
...
utils/pagination/controller.go
View file @
e0a36fb6
...
...
@@ -18,7 +18,7 @@ import (
"github.com/astaxie/beego/context"
)
// SetPaginator Instantiates a Paginator and assigns it to context.Input.Data
["paginator"]
.
// SetPaginator Instantiates a Paginator and assigns it to context.Input.Data
("paginator")
.
func
SetPaginator
(
context
*
context
.
Context
,
per
int
,
nums
int64
)
(
paginator
*
Paginator
)
{
paginator
=
NewPaginator
(
context
.
Request
,
per
,
nums
)
context
.
Input
.
SetData
(
"paginator"
,
&
paginator
)
...
...
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