UNPKG

3.23 kBtext/coffeescriptView Raw
1path = require 'path'
2ep = require 'event-pipe'
3os = require 'options-stream'
4levels = require './levels'
5Log = require './log'
6
7{info, debug, warn, error} = levels
8
9cwd = process.cwd()
10
11defaultAccessLogFile = "
12[#{cwd}/logs/#{path.basename (path.basename process.argv[1] , '.js'), '.coffee'}-access-]YYYY-MM-DD[.log]
13"
14
15logs = []
16flushTime = 1000
17timer = null
18
19heartBeat = ->
20 now = new Date().getTime()
21 inst.heartBeat now for inst in logs
22 timer = setTimeout ->
23 heartBeat()
24 , flushTime
25
26heartBeat()
27
28factory =
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 * connect middleware
58 * @param {Object} options
59 * - {String} [encodeing='utf-8'], log text encoding
60 * - file :
61 * - {Number} [level=error|warn], file log levels
62 * - {String} [pattern='accesslog-rt'], log line pattern
63 * - {String} [mode='0664'], log file mode
64 * - {String} [dir_mode='2775'], log dir mode
65 * - {String} [path="[$CWD/logs/$MAIN_FILE_BASENAME-access-]YYYY-MM-DD[.log]"], log file path pattern
66 * - stdio:
67 * - {Number} [level=all], file log levels
68 * - {String} [pattern='accesslog-rt'], log line pattern
69 * - {WritableStream} [stdout=process.stdout], info & debug output stream
70 * - {WritableStream} [stderr=process.stderr], warn & error output stream
71 * @param {Function} cb(justlog)
72 * @return {Middlewtr}
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 # make sure level info need log
83 options.file.level |= info
84 options.stdio.level |= info
85 # new log object
86 log = Log options
87 logs.push log
88 # middleware
89 mw = (req, resp, next) =>
90 # response timer
91 req.__justLogStartTime = new Date
92 # hack resp.end
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
111create = (options)->
112 log = new Log options
113 logs.push log
114 log
115# set levels const
116create[k.toUpperCase()] = v for k, v of levels.levels
117# exports
118module.exports = create
119
120module.exports[k] = v for k, v of factory