1
1
// File: src/utils/logger.js
2
2
const winston = require ( 'winston' ) ;
3
3
const morgan = require ( 'morgan' ) ;
4
+ const onHeaders = require ( 'on-headers' ) ;
4
5
5
6
// Create a Winston logger
6
7
const logger = winston . createLogger ( {
@@ -35,8 +36,26 @@ morgan.token('success', (req, res) => {
35
36
return res . statusCode < 400 ? 'true' : 'false' ;
36
37
} ) ;
37
38
38
- // Create a custom logging format
39
- const morganFormat = ':remote-addr - :user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" :success' ;
39
+ // Create a custom token for request duration
40
+ morgan . token ( 'duration' , ( req , res ) => {
41
+ return res . locals . duration ? `${ res . locals . duration } ms` : '0ms' ;
42
+ } ) ;
43
+
44
+ // Create a custom logging format with duration
45
+ const morganFormat = ':remote-addr - :user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" :success :duration' ;
46
+
47
+ // Middleware to track request duration
48
+ const trackDuration = ( req , res , next ) => {
49
+ const startTime = process . hrtime ( ) ;
50
+
51
+ onHeaders ( res , ( ) => {
52
+ const diff = process . hrtime ( startTime ) ;
53
+ // Convert to milliseconds (1 second = 1e9 nanoseconds)
54
+ res . locals . duration = Math . round ( ( diff [ 0 ] * 1e9 + diff [ 1 ] ) / 1e6 ) ;
55
+ } ) ;
56
+
57
+ next ( ) ;
58
+ } ;
40
59
41
60
// Create the Morgan middleware with custom logging logic
42
61
const httpLogger = morgan ( morganFormat , {
@@ -54,8 +73,9 @@ const httpLogger = morgan(morganFormat, {
54
73
logObject . status = parseInt ( parts [ 8 ] ) ;
55
74
logObject . responseSize = parts [ 9 ] ;
56
75
logObject . referrer = parts [ 10 ] + ' ' + parts [ 11 ] ;
57
- logObject . userAgent = parts . slice ( 12 , - 1 ) . join ( ' ' ) ;
58
- logObject . success = parts [ parts . length - 1 ] . trim ( ) === 'true' ;
76
+ logObject . userAgent = parts . slice ( 12 , - 2 ) . join ( ' ' ) ;
77
+ logObject . success = parts [ parts . length - 2 ] . trim ( ) === 'true' ;
78
+ logObject . duration = parts [ parts . length - 1 ] . trim ( ) ;
59
79
60
80
// Log all requests, including unauthorized ones
61
81
logger . info ( 'HTTP Request' , logObject ) ;
@@ -65,4 +85,4 @@ const httpLogger = morgan(morganFormat, {
65
85
skip : ( ) => false
66
86
} ) ;
67
87
68
- module . exports = { logger, httpLogger } ;
88
+ module . exports = { logger, httpLogger, trackDuration } ;
0 commit comments