forked from revel/revel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
revel.go
152 lines (127 loc) · 3.37 KB
/
revel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package rev
import (
"go/build"
"io"
"log"
"os"
"path"
"path/filepath"
"strings"
)
const (
DEV = "dev"
PROD = "prod"
)
var (
// App details
AppName string // e.g. "sample"
BasePath string // e.g. "/Users/robfig/gocode/src/revel/sample"
AppPath string // e.g. "/Users/robfig/gocode/src/revel/sample/app"
ViewsPath string // e.g. "/Users/robfig/gocode/src/revel/sample/app/views"
ImportPath string // e.g. "revel/sample"
Config *MergedConfig
RunMode string // DEV or PROD
// Revel installation details
RevelPath string // e.g. "/Users/robfig/gocode/src/revel"
RevelTemplatePath string // e.g. "/Users/robfig/gocode/src/revel/templates"
DEFAULT = log.New(os.Stderr, "", log.Ldate|log.Ltime|log.Lshortfile)
TRACE = DEFAULT
INFO = DEFAULT
WARN = DEFAULT
ERROR = DEFAULT
// Revel runs every function in this array after init.
InitHooks []func()
// Private
revelInit bool
secretKey []byte
)
func init() {
log.SetFlags(DEFAULT.Flags())
}
func Init(importPath string, mode string) {
RunMode = mode
// Find the user's app path.
importPath = strings.TrimRight(importPath, "/")
pkg, err := build.Import(importPath, "", build.FindOnly)
if err != nil {
log.Fatalln("Failed to import", importPath, "with error:", err)
}
BasePath = pkg.Dir
if BasePath == "" {
log.Fatalf("Failed to find code. Did you pass the import path?")
}
AppName = filepath.Base(BasePath)
AppPath = path.Join(BasePath, "app")
ViewsPath = path.Join(AppPath, "views")
ImportPath = importPath
// Find the provided resources.
revelPkg, err := build.Import("github.com/robfig/revel", "", build.FindOnly)
if err != nil {
log.Fatalf("Failed to find revel code.")
}
RevelPath = revelPkg.Dir
RevelTemplatePath = path.Join(RevelPath, "templates")
// Load application.conf
Config, err = LoadConfig(path.Join(BasePath, "conf", "app.conf"))
if err != nil {
log.Fatalln("Failed to load app.conf:", err)
}
Config.SetSection(mode)
secretStr, err := Config.String("app.secret")
if err != nil {
log.Fatalln("No app.secret provided.")
}
secretKey = []byte(secretStr)
// Configure logging.
TRACE = getLogger("trace")
INFO = getLogger("info")
WARN = getLogger("warn")
ERROR = getLogger("error")
for _, hook := range InitHooks {
hook()
}
revelInit = true
}
// Create a logger using log.* directives in app.conf plus the current settings
// on the default logger.
func getLogger(name string) *log.Logger {
var logger *log.Logger
// Create a logger with the requested output. (default to stderr)
output, err := Config.String("log." + name + ".output")
if err != nil {
output = "stderr"
}
switch output {
case "stdout":
logger = newLogger(os.Stdout)
case "stderr":
logger = newLogger(os.Stderr)
default:
if output == "off" {
output = os.DevNull
}
file, err := os.OpenFile(output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalln("Failed to open log file", output, ":", err)
}
logger = newLogger(file)
}
// Set the prefix / flags.
flags, err := Config.Int("log." + name + ".flags")
if err == nil {
logger.SetFlags(flags)
}
prefix, err := Config.String("log." + name + ".prefix")
if err == nil {
logger.SetPrefix(prefix)
}
return logger
}
func newLogger(wr io.Writer) *log.Logger {
return log.New(wr, DEFAULT.Prefix(), DEFAULT.Flags())
}
func CheckInit() {
if !revelInit {
panic("Revel has not been initialized!")
}
}