Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
张磊
/
FileStorageBeego
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
f752c98d
authored
2013-12-19 19:52:52 +0800
by
astaxie
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
Merge branch 'master' of
https://github.com/astaxie/beego
2 parents
7c3d1d34
764bbd98
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
71 additions
and
140 deletions
cache/file.go
httplib/httplib.go
logs/conn.go
logs/console.go
logs/file.go
logs/smtp.go
cache/file.go
View file @
f752c98
...
...
@@ -14,7 +14,7 @@ import (
"fmt"
"io"
"os"
"path"
"path
/filepath
"
"reflect"
"strconv"
"time"
...
...
@@ -79,8 +79,8 @@ func (this *FileCache) StartAndGC(config string) error {
}
func
(
this
*
FileCache
)
Init
()
{
app
:=
path
.
Dir
(
os
.
Args
[
0
])
this
.
CachePath
=
path
.
Join
(
app
,
this
.
CachePath
)
app
:=
file
path
.
Dir
(
os
.
Args
[
0
])
this
.
CachePath
=
file
path
.
Join
(
app
,
this
.
CachePath
)
ok
,
err
:=
exists
(
this
.
CachePath
)
if
err
!=
nil
{
// print error
//fmt.Println(err)
...
...
@@ -102,9 +102,9 @@ func (this *FileCache) getCacheFileName(key string) string {
//fmt.Println("md5" , keyMd5);
switch
this
.
DirectoryLevel
{
case
2
:
cachePath
=
path
.
Join
(
cachePath
,
keyMd5
[
0
:
2
],
keyMd5
[
2
:
4
])
cachePath
=
file
path
.
Join
(
cachePath
,
keyMd5
[
0
:
2
],
keyMd5
[
2
:
4
])
case
1
:
cachePath
=
path
.
Join
(
cachePath
,
keyMd5
[
0
:
2
])
cachePath
=
file
path
.
Join
(
cachePath
,
keyMd5
[
0
:
2
])
}
ok
,
err
:=
exists
(
cachePath
)
...
...
@@ -116,7 +116,7 @@ func (this *FileCache) getCacheFileName(key string) string {
//fmt.Println(err);
}
}
return
path
.
Join
(
cachePath
,
fmt
.
Sprintf
(
"%s%s"
,
keyMd5
,
this
.
FileSuffix
))
return
file
path
.
Join
(
cachePath
,
fmt
.
Sprintf
(
"%s%s"
,
keyMd5
,
this
.
FileSuffix
))
}
func
(
this
*
FileCache
)
Get
(
key
string
)
interface
{}
{
...
...
httplib/httplib.go
View file @
f752c98
...
...
@@ -90,7 +90,7 @@ func (b *BeegoHttpRequest) Header(key, value string) *BeegoHttpRequest {
}
func
(
b
*
BeegoHttpRequest
)
SetCookie
(
cookie
*
http
.
Cookie
)
*
BeegoHttpRequest
{
b
.
req
.
Header
.
Add
(
"
Set-
Cookie"
,
cookie
.
String
())
b
.
req
.
Header
.
Add
(
"Cookie"
,
cookie
.
String
())
return
b
}
...
...
logs/conn.go
View file @
f752c98
...
...
@@ -10,45 +10,29 @@ import (
type
ConnWriter
struct
{
lg
*
log
.
Logger
innerWriter
io
.
WriteCloser
reconnectOnMsg
bool
reconnect
bool
net
string
addr
string
level
int
ReconnectOnMsg
bool
`json:"reconnectOnMsg"`
Reconnect
bool
`json:"reconnect"`
Net
string
`json:"net"`
Addr
string
`json:"addr"`
Level
int
`json:"level"`
}
func
NewConn
()
LoggerInterface
{
conn
:=
new
(
ConnWriter
)
conn
.
l
evel
=
LevelTrace
conn
.
L
evel
=
LevelTrace
return
conn
}
func
(
c
*
ConnWriter
)
Init
(
jsonconfig
string
)
error
{
var
m
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
&
m
)
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
c
)
if
err
!=
nil
{
return
err
}
if
rom
,
ok
:=
m
[
"reconnectOnMsg"
];
ok
{
c
.
reconnectOnMsg
=
rom
.
(
bool
)
}
if
rc
,
ok
:=
m
[
"reconnect"
];
ok
{
c
.
reconnect
=
rc
.
(
bool
)
}
if
nt
,
ok
:=
m
[
"net"
];
ok
{
c
.
net
=
nt
.
(
string
)
}
if
addr
,
ok
:=
m
[
"addr"
];
ok
{
c
.
addr
=
addr
.
(
string
)
}
if
lv
,
ok
:=
m
[
"level"
];
ok
{
c
.
level
=
int
(
lv
.
(
float64
))
}
return
nil
}
func
(
c
*
ConnWriter
)
WriteMsg
(
msg
string
,
level
int
)
error
{
if
level
<
c
.
l
evel
{
if
level
<
c
.
L
evel
{
return
nil
}
if
c
.
neddedConnectOnMsg
()
{
...
...
@@ -58,7 +42,7 @@ func (c *ConnWriter) WriteMsg(msg string, level int) error {
}
}
if
c
.
r
econnectOnMsg
{
if
c
.
R
econnectOnMsg
{
defer
c
.
innerWriter
.
Close
()
}
c
.
lg
.
Println
(
msg
)
...
...
@@ -82,7 +66,7 @@ func (c *ConnWriter) connect() error {
c
.
innerWriter
=
nil
}
conn
,
err
:=
net
.
Dial
(
c
.
net
,
c
.
a
ddr
)
conn
,
err
:=
net
.
Dial
(
c
.
Net
,
c
.
A
ddr
)
if
err
!=
nil
{
return
err
}
...
...
@@ -97,8 +81,8 @@ func (c *ConnWriter) connect() error {
}
func
(
c
*
ConnWriter
)
neddedConnectOnMsg
()
bool
{
if
c
.
r
econnect
{
c
.
r
econnect
=
false
if
c
.
R
econnect
{
c
.
R
econnect
=
false
return
true
}
...
...
@@ -106,7 +90,7 @@ func (c *ConnWriter) neddedConnectOnMsg() bool {
return
true
}
return
c
.
r
econnectOnMsg
return
c
.
R
econnectOnMsg
}
func
init
()
{
...
...
logs/console.go
View file @
f752c98
...
...
@@ -8,30 +8,26 @@ import (
type
ConsoleWriter
struct
{
lg
*
log
.
Logger
level
int
Level
int
`json:"level"`
}
func
NewConsole
()
LoggerInterface
{
cw
:=
new
(
ConsoleWriter
)
cw
.
lg
=
log
.
New
(
os
.
Stdout
,
""
,
log
.
Ldate
|
log
.
Ltime
)
cw
.
l
evel
=
LevelTrace
cw
.
L
evel
=
LevelTrace
return
cw
}
func
(
c
*
ConsoleWriter
)
Init
(
jsonconfig
string
)
error
{
var
m
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
&
m
)
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
c
)
if
err
!=
nil
{
return
err
}
if
lv
,
ok
:=
m
[
"level"
];
ok
{
c
.
level
=
int
(
lv
.
(
float64
))
}
return
nil
}
func
(
c
*
ConsoleWriter
)
WriteMsg
(
msg
string
,
level
int
)
error
{
if
level
<
c
.
l
evel
{
if
level
<
c
.
L
evel
{
return
nil
}
c
.
lg
.
Println
(
msg
)
...
...
logs/file.go
View file @
f752c98
...
...
@@ -7,7 +7,6 @@ import (
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strings"
"sync"
...
...
@@ -18,25 +17,25 @@ type FileLogWriter struct {
*
log
.
Logger
mw
*
MuxWriter
// The opened file
filename
string
Filename
string
`json:"filename"`
maxlines
int
Maxlines
int
`json:"maxlines"`
maxlines_curlines
int
// Rotate at size
maxsize
int
Maxsize
int
`json:"maxsize"`
maxsize_cursize
int
// Rotate daily
daily
bool
maxdays
int64
Daily
bool
`json:"daily"`
Maxdays
int64
`json:"maxdays`
daily_opendate
int
rotate
bool
Rotate
bool
`json:"rotate"`
startLock
sync
.
Mutex
// Only one log can write to the file
level
int
Level
int
`json:"level"`
}
type
MuxWriter
struct
{
...
...
@@ -59,13 +58,13 @@ func (l *MuxWriter) SetFd(fd *os.File) {
func
NewFileWriter
()
LoggerInterface
{
w
:=
&
FileLogWriter
{
f
ilename
:
""
,
m
axlines
:
1000000
,
m
axsize
:
1
<<
28
,
//256 MB
d
aily
:
true
,
m
axdays
:
7
,
r
otate
:
true
,
l
evel
:
LevelTrace
,
F
ilename
:
""
,
M
axlines
:
1000000
,
M
axsize
:
1
<<
28
,
//256 MB
D
aily
:
true
,
M
axdays
:
7
,
R
otate
:
true
,
L
evel
:
LevelTrace
,
}
// use MuxWriter instead direct use os.File for lock write when rotate
w
.
mw
=
new
(
MuxWriter
)
...
...
@@ -84,33 +83,12 @@ func NewFileWriter() LoggerInterface {
// "rotate":true
//}
func
(
w
*
FileLogWriter
)
Init
(
jsonconfig
string
)
error
{
var
m
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
&
m
)
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
w
)
if
err
!=
nil
{
return
err
}
if
fn
,
ok
:=
m
[
"filename"
];
!
ok
{
if
len
(
w
.
Filename
)
==
0
{
return
errors
.
New
(
"jsonconfig must have filename"
)
}
else
{
w
.
filename
=
fn
.
(
string
)
}
if
ml
,
ok
:=
m
[
"maxlines"
];
ok
{
w
.
maxlines
=
int
(
ml
.
(
float64
))
}
if
ms
,
ok
:=
m
[
"maxsize"
];
ok
{
w
.
maxsize
=
int
(
ms
.
(
float64
))
}
if
dl
,
ok
:=
m
[
"daily"
];
ok
{
w
.
daily
=
dl
.
(
bool
)
}
if
md
,
ok
:=
m
[
"maxdays"
];
ok
{
w
.
maxdays
=
int64
(
md
.
(
float64
))
}
if
rt
,
ok
:=
m
[
"rotate"
];
ok
{
w
.
rotate
=
rt
.
(
bool
)
}
if
lv
,
ok
:=
m
[
"level"
];
ok
{
w
.
level
=
int
(
lv
.
(
float64
))
}
err
=
w
.
StartLogger
()
return
err
...
...
@@ -132,11 +110,11 @@ func (w *FileLogWriter) StartLogger() error {
func
(
w
*
FileLogWriter
)
docheck
(
size
int
)
{
w
.
startLock
.
Lock
()
defer
w
.
startLock
.
Unlock
()
if
(
w
.
maxlines
>
0
&&
w
.
maxlines_curlines
>=
w
.
m
axlines
)
||
(
w
.
maxsize
>
0
&&
w
.
maxsize_cursize
>=
w
.
m
axsize
)
||
(
w
.
d
aily
&&
time
.
Now
()
.
Day
()
!=
w
.
daily_opendate
)
{
if
(
w
.
Maxlines
>
0
&&
w
.
maxlines_curlines
>=
w
.
M
axlines
)
||
(
w
.
Maxsize
>
0
&&
w
.
maxsize_cursize
>=
w
.
M
axsize
)
||
(
w
.
D
aily
&&
time
.
Now
()
.
Day
()
!=
w
.
daily_opendate
)
{
if
err
:=
w
.
DoRotate
();
err
!=
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"FileLogWriter(%q): %s
\n
"
,
w
.
f
ilename
,
err
)
fmt
.
Fprintf
(
os
.
Stderr
,
"FileLogWriter(%q): %s
\n
"
,
w
.
F
ilename
,
err
)
return
}
}
...
...
@@ -145,7 +123,7 @@ func (w *FileLogWriter) docheck(size int) {
}
func
(
w
*
FileLogWriter
)
WriteMsg
(
msg
string
,
level
int
)
error
{
if
level
<
w
.
l
evel
{
if
level
<
w
.
L
evel
{
return
nil
}
n
:=
24
+
len
(
msg
)
// 24 stand for the length "2013/06/23 21:00:22 [T] "
...
...
@@ -156,7 +134,7 @@ func (w *FileLogWriter) WriteMsg(msg string, level int) error {
func
(
w
*
FileLogWriter
)
createLogFile
()
(
*
os
.
File
,
error
)
{
// Open the log file
fd
,
err
:=
os
.
OpenFile
(
w
.
f
ilename
,
os
.
O_WRONLY
|
os
.
O_APPEND
|
os
.
O_CREATE
,
0660
)
fd
,
err
:=
os
.
OpenFile
(
w
.
F
ilename
,
os
.
O_WRONLY
|
os
.
O_APPEND
|
os
.
O_CREATE
,
0660
)
return
fd
,
err
}
...
...
@@ -169,7 +147,7 @@ func (w *FileLogWriter) initFd() error {
w
.
maxsize_cursize
=
int
(
finfo
.
Size
())
w
.
daily_opendate
=
time
.
Now
()
.
Day
()
if
finfo
.
Size
()
>
0
{
content
,
err
:=
ioutil
.
ReadFile
(
w
.
f
ilename
)
content
,
err
:=
ioutil
.
ReadFile
(
w
.
F
ilename
)
if
err
!=
nil
{
return
err
}
...
...
@@ -181,18 +159,18 @@ func (w *FileLogWriter) initFd() error {
}
func
(
w
*
FileLogWriter
)
DoRotate
()
error
{
_
,
err
:=
os
.
Lstat
(
w
.
f
ilename
)
_
,
err
:=
os
.
Lstat
(
w
.
F
ilename
)
if
err
==
nil
{
// file exists
// Find the next available number
num
:=
1
fname
:=
""
for
;
err
==
nil
&&
num
<=
999
;
num
++
{
fname
=
w
.
f
ilename
+
fmt
.
Sprintf
(
".%s.%03d"
,
time
.
Now
()
.
Format
(
"2006-01-02"
),
num
)
fname
=
w
.
F
ilename
+
fmt
.
Sprintf
(
".%s.%03d"
,
time
.
Now
()
.
Format
(
"2006-01-02"
),
num
)
_
,
err
=
os
.
Lstat
(
fname
)
}
// return error if the last file checked still existed
if
err
==
nil
{
return
fmt
.
Errorf
(
"Rotate: Cannot find free log number to rename %s
\n
"
,
w
.
f
ilename
)
return
fmt
.
Errorf
(
"Rotate: Cannot find free log number to rename %s
\n
"
,
w
.
F
ilename
)
}
// block Logger's io.Writer
...
...
@@ -204,7 +182,7 @@ func (w *FileLogWriter) DoRotate() error {
// close fd before rename
// Rename the file to its newfound home
err
=
os
.
Rename
(
w
.
f
ilename
,
fname
)
err
=
os
.
Rename
(
w
.
F
ilename
,
fname
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"Rotate: %s
\n
"
,
err
)
}
...
...
@@ -222,10 +200,10 @@ func (w *FileLogWriter) DoRotate() error {
}
func
(
w
*
FileLogWriter
)
deleteOldLog
()
{
dir
:=
path
.
Dir
(
w
.
f
ilename
)
dir
:=
filepath
.
Dir
(
w
.
F
ilename
)
filepath
.
Walk
(
dir
,
func
(
path
string
,
info
os
.
FileInfo
,
err
error
)
error
{
if
!
info
.
IsDir
()
&&
info
.
ModTime
()
.
Unix
()
<
(
time
.
Now
()
.
Unix
()
-
60
*
60
*
24
*
w
.
m
axdays
)
{
if
strings
.
HasPrefix
(
filepath
.
Base
(
path
),
filepath
.
Base
(
w
.
f
ilename
))
{
if
!
info
.
IsDir
()
&&
info
.
ModTime
()
.
Unix
()
<
(
time
.
Now
()
.
Unix
()
-
60
*
60
*
24
*
w
.
M
axdays
)
{
if
strings
.
HasPrefix
(
filepath
.
Base
(
path
),
filepath
.
Base
(
w
.
F
ilename
))
{
os
.
Remove
(
path
)
}
}
...
...
logs/smtp.go
View file @
f752c98
...
...
@@ -2,7 +2,6 @@ package logs
import
(
"encoding/json"
"errors"
"fmt"
"net/smtp"
"strings"
...
...
@@ -15,77 +14,51 @@ const (
// smtpWriter is used to send emails via given SMTP-server.
type
SmtpWriter
struct
{
username
string
password
string
host
string
subject
string
recipientAddresses
[]
string
level
int
Username
string
`json:"Username"`
Password
string
`json:"password"`
Host
string
`json:"Host"`
Subject
string
`json:"subject"`
RecipientAddresses
[]
string
`json:"sendTos"`
Level
int
`json:"level"`
}
func
NewSmtpWriter
()
LoggerInterface
{
return
&
SmtpWriter
{
l
evel
:
LevelTrace
}
return
&
SmtpWriter
{
L
evel
:
LevelTrace
}
}
func
(
s
*
SmtpWriter
)
Init
(
jsonconfig
string
)
error
{
var
m
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
&
m
)
err
:=
json
.
Unmarshal
([]
byte
(
jsonconfig
),
s
)
if
err
!=
nil
{
return
err
}
if
username
,
ok
:=
m
[
"username"
];
!
ok
{
return
errors
.
New
(
"smtp config must have auth username"
)
}
else
if
password
,
ok
:=
m
[
"password"
];
!
ok
{
return
errors
.
New
(
"smtp config must have auth password"
)
}
else
if
hostname
,
ok
:=
m
[
"host"
];
!
ok
{
return
errors
.
New
(
"smtp config must have host like 'mail.example.com:25'"
)
}
else
if
sendTos
,
ok
:=
m
[
"sendTos"
];
!
ok
{
return
errors
.
New
(
"smtp config must have sendTos"
)
}
else
{
s
.
username
=
username
.
(
string
)
s
.
password
=
password
.
(
string
)
s
.
host
=
hostname
.
(
string
)
for
_
,
v
:=
range
sendTos
.
([]
interface
{})
{
s
.
recipientAddresses
=
append
(
s
.
recipientAddresses
,
v
.
(
string
))
}
}
if
subject
,
ok
:=
m
[
"subject"
];
ok
{
s
.
subject
=
subject
.
(
string
)
}
else
{
s
.
subject
=
subjectPhrase
}
if
lv
,
ok
:=
m
[
"level"
];
ok
{
s
.
level
=
int
(
lv
.
(
float64
))
}
return
nil
}
func
(
s
*
SmtpWriter
)
WriteMsg
(
msg
string
,
level
int
)
error
{
if
level
<
s
.
l
evel
{
if
level
<
s
.
L
evel
{
return
nil
}
hp
:=
strings
.
Split
(
s
.
h
ost
,
":"
)
hp
:=
strings
.
Split
(
s
.
H
ost
,
":"
)
// Set up authentication information.
auth
:=
smtp
.
PlainAuth
(
""
,
s
.
u
sername
,
s
.
p
assword
,
s
.
U
sername
,
s
.
P
assword
,
hp
[
0
],
)
// Connect to the server, authenticate, set the sender and recipient,
// and send the email all in one step.
content_type
:=
"Content-Type: text/plain"
+
"; charset=UTF-8"
mailmsg
:=
[]
byte
(
"To: "
+
strings
.
Join
(
s
.
recipientAddresses
,
";"
)
+
"
\r\n
From: "
+
s
.
username
+
"<"
+
s
.
u
sername
+
">
\r\n
Subject: "
+
s
.
s
ubject
+
"
\r\n
"
+
content_type
+
"
\r\n\r\n
"
+
fmt
.
Sprintf
(
".%s"
,
time
.
Now
()
.
Format
(
"2006-01-02 15:04:05"
))
+
msg
)
mailmsg
:=
[]
byte
(
"To: "
+
strings
.
Join
(
s
.
RecipientAddresses
,
";"
)
+
"
\r\n
From: "
+
s
.
Username
+
"<"
+
s
.
U
sername
+
">
\r\n
Subject: "
+
s
.
S
ubject
+
"
\r\n
"
+
content_type
+
"
\r\n\r\n
"
+
fmt
.
Sprintf
(
".%s"
,
time
.
Now
()
.
Format
(
"2006-01-02 15:04:05"
))
+
msg
)
err
:=
smtp
.
SendMail
(
s
.
h
ost
,
s
.
H
ost
,
auth
,
s
.
u
sername
,
s
.
r
ecipientAddresses
,
s
.
U
sername
,
s
.
R
ecipientAddresses
,
mailmsg
,
)
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
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 post a comment