1
1
// Logger
2
2
//
3
3
// Wrapper around Winston logging library with custom query
4
- //
4
+ //
5
5
// expected log entry to be in the shape of:
6
6
// {"level":"info","message":"Your Message","timestamp":"2016-02-04T05:59:27.412Z"}
7
7
//
8
8
import { LoggerAdapter } from './LoggerAdapter' ;
9
9
import winston from 'winston' ;
10
10
import fs from 'fs' ;
11
11
import { Parse } from 'parse/node' ;
12
+ import { logger , configure } from '../../logger' ;
12
13
13
14
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000 ;
14
15
const CACHE_TIME = 1000 * 60 ;
@@ -57,24 +58,6 @@ let _hasValidCache = (from, until, level) => {
57
58
return false ;
58
59
}
59
60
60
- // renews transports to current date
61
- let _renewTransports = ( { infoLogger, errorLogger, logsFolder} ) => {
62
- if ( infoLogger ) {
63
- infoLogger . add ( winston . transports . File , {
64
- filename : logsFolder + _getFileName ( ) + '.info' ,
65
- name : 'info-file' ,
66
- level : 'info'
67
- } ) ;
68
- }
69
- if ( errorLogger ) {
70
- errorLogger . add ( winston . transports . File , {
71
- filename : logsFolder + _getFileName ( ) + '.error' ,
72
- name : 'error-file' ,
73
- level : 'error'
74
- } ) ;
75
- }
76
- } ;
77
-
78
61
// check that log entry has valid time stamp based on query
79
62
let _isValidLogEntry = ( from , until , entry ) => {
80
63
var _entry = JSON . parse ( entry ) ,
@@ -84,139 +67,51 @@ let _isValidLogEntry = (from, until, entry) => {
84
67
: false
85
68
} ;
86
69
87
- // ensure that file name is up to date
88
- let _verifyTransports = ( { infoLogger, errorLogger, logsFolder} ) => {
89
- if ( _getNearestDay ( currentDate ) !== _getNearestDay ( new Date ( ) ) ) {
90
- currentDate = new Date ( ) ;
91
- if ( infoLogger ) {
92
- infoLogger . remove ( 'info-file' ) ;
93
- }
94
- if ( errorLogger ) {
95
- errorLogger . remove ( 'error-file' ) ;
96
- }
97
- _renewTransports ( { infoLogger, errorLogger, logsFolder} ) ;
98
- }
99
- }
100
-
101
70
export class FileLoggerAdapter extends LoggerAdapter {
102
- constructor ( options = { } ) {
103
- super ( ) ;
104
- this . _logsFolder = options . logsFolder || LOGS_FOLDER ;
105
-
106
- // check logs folder exists
107
- if ( ! fs . existsSync ( this . _logsFolder ) ) {
108
- fs . mkdirSync ( this . _logsFolder ) ;
109
- }
110
-
111
- this . _errorLogger = new ( winston . Logger ) ( {
112
- exitOnError : false ,
113
- transports : [
114
- new ( winston . transports . File ) ( {
115
- filename : this . _logsFolder + _getFileName ( ) + '.error' ,
116
- name : 'error-file' ,
117
- level : 'error'
118
- } )
119
- ]
120
- } ) ;
121
-
122
- this . _infoLogger = new ( winston . Logger ) ( {
123
- exitOnError : false ,
124
- transports : [
125
- new ( winston . transports . File ) ( {
126
- filename : this . _logsFolder + _getFileName ( ) + '.info' ,
127
- name : 'info-file' ,
128
- level : 'info'
129
- } )
130
- ]
131
- } ) ;
132
- }
133
71
134
72
info ( ) {
135
- _verifyTransports ( { infoLogger : this . _infoLogger , logsFolder : this . _logsFolder } ) ;
136
- return this . _infoLogger . info . apply ( undefined , arguments ) ;
73
+ return logger . info . apply ( undefined , arguments ) ;
137
74
}
138
75
139
76
error ( ) {
140
- _verifyTransports ( { errorLogger : this . _errorLogger , logsFolder : this . _logsFolder } ) ;
141
- return this . _errorLogger . error . apply ( undefined , arguments ) ;
77
+ return logger . error . apply ( undefined , arguments ) ;
142
78
}
143
79
144
80
// custom query as winston is currently limited
145
- query ( options , callback ) {
81
+ query ( options , callback = ( ) => { } ) {
146
82
if ( ! options ) {
147
83
options = { } ;
148
84
}
149
85
// defaults to 7 days prior
150
86
let from = options . from || new Date ( Date . now ( ) - ( 7 * MILLISECONDS_IN_A_DAY ) ) ;
151
87
let until = options . until || new Date ( ) ;
152
- let size = options . size || 10 ;
88
+ let limit = options . size || 10 ;
153
89
let order = options . order || 'desc' ;
154
90
let level = options . level || 'info' ;
155
91
let roundedUntil = _getNearestDay ( until ) ;
156
92
let roundedFrom = _getNearestDay ( from ) ;
157
93
158
- if ( _hasValidCache ( roundedFrom , roundedUntil , level ) ) {
159
- let logs = [ ] ;
160
- if ( order !== simpleCache . order ) {
161
- // reverse order of data
162
- simpleCache . data . forEach ( ( entry ) => {
163
- logs . unshift ( entry ) ;
164
- } ) ;
165
- } else {
166
- logs = simpleCache . data ;
167
- }
168
- callback ( logs . slice ( 0 , size ) ) ;
169
- return ;
170
- }
171
-
172
- let curDate = roundedUntil ;
173
- let curSize = 0 ;
174
- let method = order === 'desc' ? 'push' : 'unshift' ;
175
- let files = [ ] ;
176
- let promises = [ ] ;
177
-
178
- // current a batch call, all files with valid dates are read
179
- while ( curDate >= from ) {
180
- files [ method ] ( this . _logsFolder + curDate . toISOString ( ) + '.' + level ) ;
181
- curDate = _getPrevDay ( curDate ) ;
182
- }
94
+ var options = {
95
+ from,
96
+ until,
97
+ limit,
98
+ order
99
+ } ;
183
100
184
- // read each file and split based on newline char.
185
- // limitation is message cannot contain newline
186
- // TODO: strip out delimiter from logged message
187
- files . forEach ( function ( file , i ) {
188
- let promise = new Parse . Promise ( ) ;
189
- fs . readFile ( file , 'utf8' , function ( err , data ) {
101
+ return new Promise ( ( resolve , reject ) => {
102
+ logger . query ( options , ( err , res ) => {
190
103
if ( err ) {
191
- promise . resolve ( [ ] ) ;
192
- } else {
193
- let results = data . split ( '\n' ) . filter ( ( value ) => {
194
- return value . trim ( ) !== '' ;
195
- } ) ;
196
- promise . resolve ( results ) ;
104
+ callback ( err ) ;
105
+ return reject ( err ) ;
197
106
}
198
- } ) ;
199
- promises [ method ] ( promise ) ;
200
- } ) ;
201
-
202
- Parse . Promise . when ( promises ) . then ( ( results ) => {
203
- let logs = [ ] ;
204
- results . forEach ( function ( logEntries , i ) {
205
- logEntries . forEach ( function ( entry ) {
206
- if ( _isValidLogEntry ( from , until , entry ) ) {
207
- logs [ method ] ( JSON . parse ( entry ) ) ;
208
- }
209
- } ) ;
210
- } ) ;
211
- simpleCache = {
212
- timestamp : new Date ( ) ,
213
- from : roundedFrom ,
214
- until : roundedUntil ,
215
- data : logs ,
216
- order,
217
- level,
218
- } ;
219
- callback ( logs . slice ( 0 , size ) ) ;
107
+ if ( level == 'error' ) {
108
+ callback ( res [ 'parse-server-error' ] ) ;
109
+ resolve ( res [ 'parse-server-error' ] ) ;
110
+ } else {
111
+ callback ( res [ 'parse-server' ] ) ;
112
+ resolve ( res [ 'parse-server' ] ) ;
113
+ }
114
+ } )
220
115
} ) ;
221
116
}
222
117
}
0 commit comments