1 | path = require 'path'
|
2 | ep = require 'event-pipe'
|
3 | os = require 'options-stream'
|
4 | levels = require './levels'
|
5 | Log = require './log'
|
6 |
|
7 | {info, debug, warn, error} = levels
|
8 |
|
9 | cwd = process.cwd()
|
10 |
|
11 | defaultAccessLogFile = "
|
12 | [#{cwd}/logs/#{path.basename (path.basename process.argv[1] , '.js'), '.coffee'}-access-]YYYY-MM-DD[.log]
|
13 | "
|
14 |
|
15 | logs = []
|
16 | flushTime = 1000
|
17 | timer = null
|
18 |
|
19 | heartBeat = ->
|
20 | now = new Date().getTime()
|
21 | inst.heartBeat now for inst in logs
|
22 | timer = setTimeout ->
|
23 | heartBeat()
|
24 | , flushTime
|
25 |
|
26 | heartBeat()
|
27 |
|
28 | factory =
|
29 | config : (opt)->
|
30 | flushTime = opt.flushTime if opt.flushTime
|
31 | clearTimeout timer if timer
|
32 | heartBeat()
|
33 |
|
34 | create : (options)->
|
35 | log = Log options
|
36 | logs.push log
|
37 | log
|
38 |
|
39 | end : (cb = ->)->
|
40 | fns = []
|
41 | fn = (inst)->
|
42 | ->
|
43 | inst.close @
|
44 | for inst in logs
|
45 | fns.push fn inst
|
46 |
|
47 | logs.length = 0
|
48 | pipe = ep()
|
49 | pipe.on 'error', cb
|
50 | pipe.lazy fns if fns.length
|
51 | pipe.lazy ->
|
52 | cb()
|
53 | pipe.run()
|
54 |
|
55 | |
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 | middleware : (options) ->
|
75 | options = os
|
76 | file:
|
77 | path : defaultAccessLogFile
|
78 | pattern : 'accesslog-rt'
|
79 | stdio :
|
80 | pattern : 'accesslog-color'
|
81 | , options
|
82 |
|
83 | options.file.level |= info
|
84 | options.stdio.level |= info
|
85 |
|
86 | log = Log options
|
87 | logs.push log
|
88 |
|
89 | mw = (req, resp, next) =>
|
90 |
|
91 | req.__justLogStartTime = new Date
|
92 |
|
93 | end = resp.end
|
94 | resp.end = (chunk, encoding) ->
|
95 | resp.end = end
|
96 | resp.end chunk, encoding
|
97 | log.info {
|
98 | 'remote-address' : req.socket.remoteAddress
|
99 | method : req.method
|
100 | url : req.originalUrl || req.url
|
101 | version : req.httpVersionMajor + '.' + req.httpVersionMinor
|
102 | status : resp.statusCode
|
103 | 'content-length' : parseInt resp.getHeader('content-length'), 10
|
104 | headers : req.headers
|
105 | rt : new Date() - req.__justLogStartTime
|
106 | }
|
107 | next()
|
108 | mw.justlog = log
|
109 | mw
|
110 |
|
111 | create = (options)->
|
112 | log = new Log options
|
113 | logs.push log
|
114 | log
|
115 |
|
116 | create[k.toUpperCase()] = v for k, v of levels.levels
|
117 |
|
118 | module.exports = create
|
119 |
|
120 | module.exports[k] = v for k, v of factory
|