|
| 1 | +const cds = require ('@sap/cds/lib') |
| 2 | +const LOG = cds.log('cds.log') |
| 3 | + |
| 4 | +module.exports = class LogService extends cds.Service { |
| 5 | + init(){ |
| 6 | + |
| 7 | + this.on('GET','Loggers', (req)=>{ |
| 8 | + let loggers = Object.values(cds.log.loggers).map (_logger) |
| 9 | + let {$search} = req._.req.query |
| 10 | + if ($search) { |
| 11 | + const re = RegExp($search,'i') |
| 12 | + loggers = loggers.filter (l => re.test(l.id) || re.test(l.level)) |
| 13 | + } |
| 14 | + return loggers |
| 15 | + }) |
| 16 | + |
| 17 | + this.on('PUT','Logger', (req)=>{ |
| 18 | + const {id} = req.params[0] || req.data |
| 19 | + if (!id) return req.reject('No logger id specified in request') |
| 20 | + return _logger (cds.log (id, req.data)) |
| 21 | + }) |
| 22 | + |
| 23 | + this.on('debug', (req)=>{ |
| 24 | + const {logger:id} = req.params[0] || req.data |
| 25 | + if (!id) return req.reject('No logger id specified in request') |
| 26 | + return _logger (cds.log (id, {level:'debug'})) |
| 27 | + }) |
| 28 | + |
| 29 | + this.on('reset', (req)=>{ |
| 30 | + const {logger:id} = req.params[0] || req.data |
| 31 | + if (!id) return req.reject('No logger id specified in request') |
| 32 | + return _logger (cds.log (id, {level:'info'})) |
| 33 | + }) |
| 34 | + |
| 35 | + this.on('format', (req)=>{ |
| 36 | + const $ = req.data; LOG.info('format:',$) |
| 37 | + // Set format for new loggers constructed subsequently |
| 38 | + cds.log.format = (id, level, ...args) => { |
| 39 | + const fmt = [] |
| 40 | + if ($.timestamp) fmt.push ('|', (new Date).toISOString()) |
| 41 | + if ($.level) fmt.push ('|', _levels[level].padEnd(5)) |
| 42 | + if ($.tenant) fmt.push ('|', cds.context && cds.context.tenant) |
| 43 | + if ($.reqid) fmt.push ('|', cds.context && cds.context.id) |
| 44 | + if ($.id) fmt.push ('|', id) |
| 45 | + fmt[0] = '[', fmt.push ('] -', ...args) |
| 46 | + return fmt |
| 47 | + } |
| 48 | + // Apply this format to all existing loggers |
| 49 | + Object.values(cds.log.loggers).forEach (l => l.setFormat (cds.log.format)) |
| 50 | + }) |
| 51 | + } |
| 52 | + |
| 53 | +} |
| 54 | + |
| 55 | +const _logger = ({id,level}) => ({id, level:_levels[level] }) |
| 56 | +const _levels = [ 'SILENT', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE' ] |
0 commit comments