-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.js
136 lines (122 loc) · 3.45 KB
/
logger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* eslint-disable */ // accept the shady magic of this file
/* $lab:coverage:off$ */
// don't use strict mode on that file because it breaks the module stack hack
const _ = require('lodash')
const path = require('path')
const moment = require('moment')
const SysLogger = require('ain2')
let LOGACIOUS_ENABLED = true
Object.defineProperty(module, '__stack', {
get: function () {
var orig = Error.prepareStackTrace
Error.prepareStackTrace = function (_, stack) {
return stack
}
var err = new Error()
Error.captureStackTrace(err, arguments.callee)
var stack = err.stack
delete Error.prepareStackTrace
Error.prepareStackTrace = orig
return stack
}
})
const STACK_DEPTH = parseInt(process.env.LOGACIOUS_STACK_DEPTH, 10) || 3
Object.defineProperty(module, '__caller_info', {
get: function () {
var callerStack = module.__stack
return {
line: callerStack[STACK_DEPTH].getLineNumber(),
file: path.relative(process.cwd(), callerStack[STACK_DEPTH].getFileName()),
functionName: callerStack[STACK_DEPTH].getFunctionName()
}
}
})
function fileInfo () {
var callerInfo = module.__caller_info
return callerInfo.file + ':' + callerInfo.line
}
function prepare (prependList, jsArguments) {
var args =_.map(jsArguments, function (item) {
if(item instanceof String) {
return item
} else if(item instanceof Error) {
let str = `${item.message}\n`
if(item.code) {
str += `code=${item.code}\n`
}
if(item.statusCode) {
str += `statusCode=${item.statusCode}\n`
}
str += item.stack
return str
}else {
try {
return JSON.stringify(item)
}
catch(e) {
// can happen if item has circular dependencies.
// In which case, logging [item] will default
// below to whatever console.log can handle.
return item
}
}
})
_.eachRight(prependList, function (prependItem) {
args.unshift(prependItem)
})
return args
}
function wrapWithMetadata (level, func) {
return function () {
if (!LOGACIOUS_ENABLED){
return
}
var args = prepare([
'[' + level +']',
moment().format('YYYY-MM-DD HH:mm:ss.SSS'),
fileInfo()
],
arguments)
return func.apply(null, args)
}
}
var logger = console
if(process.env.LOGACIOUS_SYSLOG) {
var syslogConf = {}
if(process.env.LOGACIOUS_SYSLOG_TAG) {
syslogConf.tag = process.env.LOGACIOUS_SYSLOG_TAG
}
if(process.env.LOGACIOUS_SYSLOG_FACILITY) {
syslogConf.facility = process.env.LOGACIOUS_SYSLOG_FACILITY
}
if(process.env.LOGACIOUS_SYSLOG_HOSTNAME) {
syslogConf.host = process.env.LOGACIOUS_SYSLOG_HOSTNAME
}
if(process.env.LOGACIOUS_SYSLOG_PORT) {
syslogConf.port = process.env.LOGACIOUS_SYSLOG_PORT
}
if(process.env.LOGACIOUS_SYSLOG_TRANSPORT) {
syslogConf.transport = process.env.LOGACIOUS_SYSLOG_TRANSPORT.toUpperCase()
}
logger = new SysLogger()
logger.log = logger.log.bind(logger)
logger.info = logger.info.bind(logger)
logger.warn = logger.warn.bind(logger)
logger.error = logger.error.bind(logger)
}
const debug = wrapWithMetadata('DEBUG', logger.log)
const info = wrapWithMetadata('INFO', logger.info)
const warn = wrapWithMetadata('WARN', logger.warn)
const error = wrapWithMetadata('ERROR', logger.error)
const disable = () => {
LOGACIOUS_ENABLED = false
}
module.exports = () => ({
name: 'global',
debug,
info,
warn,
error,
disable,
})
/* $lab:coverage:on$ */