These code samples are for the blog post Dynamic logging control for serverless without redeploying at:
http://www.sensedeep.com/blog/posts/stories/dynamic-serverless-log-control.html
| import Bunyan from 'bunyan' | |
| let {LOG_FILTER, LOG_OVERRIDE, LOG_SAMPLE} = process.env | |
| if (LOG_OVERRIDE != null) { | |
| let [expire, level] = LOG_OVERRIDE.split(':') | |
| if (level && Date.now() < expire) { | |
| LOG_FILTER = level | |
| } | |
| } | |
| let sample = 0, sampleRate, sampleLevel | |
| if (LOG_SAMPLE != null) { | |
| [sampleRate, sampleLevel] = LOG_SAMPLE.split(':') | |
| } | |
| const bunyan = Bunyan.createLogger({name: 'bunyan', level: LOG_FILTER}) | |
| exports.handler = async (event, context) => { | |
| if (sampleRate && (sample++ % (100 / sampleRate)) == 0) { | |
| bunyan.level = sampleLevel | |
| } | |
| bunyan.debug('Debug message') | |
| return 'done' | |
| } |
| import Debug from 'debug' | |
| let {LOG_FILTER, LOG_OVERRIDE, LOG_SAMPLE} = process.env | |
| if (LOG_OVERRIDE != null) { | |
| let [expire, level] = LOG_OVERRIDE.split(':') | |
| if (level && Date.now() < expire) { | |
| LOG_FILTER = level | |
| } | |
| } | |
| let sample = 0, sampleRate, sampleLevel | |
| if (LOG_SAMPLE != null) { | |
| [sampleRate, sampleLevel] = LOG_SAMPLE.split(':') | |
| } | |
| Debug.enable(LOG_FILTER) | |
| exports.handler = async (event, context) => { | |
| if (sampleRate && (sample++ % (100 / sampleRate)) == 0) { | |
| debug.enable(sampleLevel) | |
| } | |
| Debug('debug')('Debug message') | |
| return 'done' | |
| } |
These code samples are for the blog post Dynamic logging control for serverless without redeploying at:
http://www.sensedeep.com/blog/posts/stories/dynamic-serverless-log-control.html
| import Pino from 'pino' | |
| let {LOG_FILTER, LOG_OVERRIDE, LOG_SAMPLE} = process.env | |
| if (LOG_OVERRIDE != null) { | |
| let [expire, level] = LOG_OVERRIDE.split(':') | |
| if (level && Date.now() < expire) { | |
| LOG_FILTER = level | |
| } | |
| } | |
| let sample = 0, sampleRate, sampleLevel | |
| if (LOG_SAMPLE != null) { | |
| [sampleRate, sampleLevel] = LOG_SAMPLE.split(':') | |
| } | |
| const pino = Pino({name: 'pino', level: LOG_FILTER}) | |
| exports.handler = async (event, context) => { | |
| if (sampleRate && (sample++ % (100 / sampleRate)) == 0) { | |
| pino.level = sampleLevel | |
| } | |
| pino.debug('Debug message') | |
| return 'done' | |
| } |
| import os | |
| import logging | |
| from datetime import datetime | |
| LOG_FILTER = os.environ.get('LOG_FILTER') | |
| LOG_OVERRIDE = os.environ.get('LOG_OVERRIDE') | |
| LOG_SAMPLE = os.environ.get('LOG_SAMPLE') | |
| sample = 0 | |
| sampleRate = 0 | |
| sampleLevel = None | |
| if LOG_SAMPLE != None: | |
| sampleRate, sampleLevel = LOG_SAMPLE.split(':') | |
| if LOG_OVERRIDE != None: | |
| when, level = LOG_OVERRIDE.split(':') | |
| if level and int(datetime.today().timestamp()) < int(when): | |
| LOG_FILTER = level | |
| logging.basicConfig(level = int(LOG_FILTER)) | |
| log = logging.getLogger() | |
| def lambda_handler(event, context): | |
| sample = sample + 1 | |
| if sampleRate and (sample % (100 / sampleRate)) == 0: | |
| log.setLevel(int(sampleLevel)) | |
| log.info("Hello World") | |
| return 'done' |
| import SenseLogs from 'senselogs' | |
| let log = new SenseLogs() | |
| exports.handler = async (event, context) => { | |
| // This will be emitted if LOG_FILTER contains 'debug' as a log level | |
| log.debug('Hello world') | |
| // EMF metrics can also be dynamically controlled | |
| log.metrics('metrics', 'AcmeRockets/CriticalLaunchFailure', {explosion: 1}) | |
| return 'done' | |
| } |
| import Winston from 'winston' | |
| let {LOG_FILTER, LOG_OVERRIDE, LOG_SAMPLE} = process.env | |
| if (LOG_OVERRIDE != null) { | |
| let [expire, level] = LOG_OVERRIDE.split(':') | |
| if (level && Date.now() < expire) { | |
| LOG_FILTER = level | |
| } | |
| } | |
| let sample = 0, sampleRate, sampleLevel | |
| if (LOG_SAMPLE != null) { | |
| [sampleRate, sampleLevel] = LOG_SAMPLE.split(':') | |
| } | |
| const winston = Winston.createLogger({ | |
| level: LOG_FILTER, | |
| transports: [new Winston.transports.Console()], | |
| }) | |
| exports.handler = async (event, context) => { | |
| if (sampleRate && (sample++ % (100 / sampleRate)) == 0) { | |
| winston.transports[0].level = sampleLevel | |
| } | |
| winston.debug('Debug message') | |
| return 'done' | |
| } |