Skip to content

Commit 4e67e1f

Browse files
committed
Merge branches 'package-json-files', 'timestamp-with-timezone' and 'unit-tests'
4 parents 449fc42 + 9472f24 + 7b64cc9 + 2e9110b commit 4e67e1f

5 files changed

Lines changed: 1861 additions & 13 deletions

File tree

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const log = require('monk-log')
5353
log.warn('You can have nice log messages in just one line!')
5454

5555
// Outputs
56-
// [2019-02-18T01:10:49.933] WARN [root]: You can have nice log messages in just one line!
56+
// [2019-02-18T01:10:49.933+01:00] WARN [root]: You can have nice log messages in just one line!
5757
```
5858

5959
### Child loggers with custom format
@@ -73,8 +73,8 @@ childLogger.error('this is an error message')
7373

7474
// Outputs
7575
// [2019-02-18T01:08:46.260] INFO [root]: Child logger has been set up
76-
// When: 2019-02-18T01:08:46.262, who: CHILD, why: DEBUG, what: this is a debug message
77-
// When: 2019-02-18T01:08:46.262, who: CHILD, why: INFO, what: This is a info message
78-
// When: 2019-02-18T01:08:46.262, who: CHILD, why: WARN, what: this is a warning message
79-
// When: 2019-02-18T01:08:46.263, who: CHILD, why: ERROR, what: this is an error message
76+
// When: 2019-02-18T01:08:46.262+01:00, who: CHILD, why: DEBUG, what: this is a debug message
77+
// When: 2019-02-18T01:08:46.262+01:00, who: CHILD, why: INFO, what: This is a info message
78+
// When: 2019-02-18T01:08:46.262+01:00, who: CHILD, why: WARN, what: this is a warning message
79+
// When: 2019-02-18T01:08:46.263+01:00, who: CHILD, why: ERROR, what: this is an error message
8080
```

lib/log.js

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,35 @@ const colors = Object.freeze({
1212
ERROR: chalk.red
1313
})
1414

15-
const defaultTimestampFormatter = (date) => {
16-
const tzOffset = date.getTimezoneOffset() * 60000 // offset in milliseconds
17-
const localISOTime = (new Date(date - tzOffset)).toISOString().slice(0, -1) // => '2015-01-26T06:40:36.181'
18-
return localISOTime
15+
/**
16+
* Converts a date to the RFC3339 profile of the ISO 8601 standard
17+
*
18+
* Example: 2019-02-08T19:02:09.432+01:00
19+
* https://tools.ietf.org/html/rfc3339#section-5.6
20+
*
21+
* Inspired by https://stackoverflow.com/a/17415677/1362167
22+
*/
23+
const dateToISOString = (d, milliseconds = true) => {
24+
// Pad an integer >=0, <= 99 to 2 digits.
25+
// Useful to pad days, minutes, hours, months etc.
26+
const pad2 = num => `${num < 10 ? '0' : ''}${num}`
27+
const pad3 = num => `${num < 100 ? (num < 10 ? '00' : '0') : ''}${num}`
28+
const offset = -d.getTimezoneOffset()
29+
const absOffset = Math.abs(offset)
30+
return d.getFullYear()
31+
+ '-' + pad2(d.getMonth() + 1)
32+
+ '-' + pad2(d.getDate())
33+
+ 'T' + pad2(d.getHours())
34+
+ ':' + pad2(d.getMinutes())
35+
+ ':' + pad2(d.getSeconds())
36+
+ (milliseconds ? ('.' + pad3(d.getMilliseconds())) : '')
37+
+ (offset >= 0 ? '+' : '-')
38+
+ pad2(Math.floor(absOffset / 60))
39+
+ ':' + pad2(absOffset % 60)
1940
}
2041

42+
const defaultTimestampFormatter = dateToISOString
43+
2144
const defaultNameFormatter = (name) => {
2245
return chalk.green(name)
2346
}
@@ -99,3 +122,6 @@ defaultLogger.getLoggers = () => _loggersByName
99122
// Export default logger. Can be used directly, or can be used
100123
// to obtain child loggers.
101124
module.exports = defaultLogger
125+
// Export dateToISOString, users may want to use it to define a custom
126+
// timestampformatter
127+
module.exports.dateToISOString = dateToISOString

0 commit comments

Comments
 (0)