1 | #!/usr/bin/env node
|
2 | var async = require('async')
|
3 | var lodash = require('lodash')
|
4 | var chalk = require('chalk')
|
5 | var aws = require('aws-sdk')
|
6 | var region = process.env.AWS_REGION || 'us-east-1'
|
7 | var cw = new aws.CloudWatchLogs({region:region})
|
8 | var exists = require('path-exists').sync
|
9 |
|
10 | function stream(name, callback) {
|
11 | cw.describeLogStreams({
|
12 | logGroupName: name
|
13 | }, callback)
|
14 | }
|
15 |
|
16 | var name = process.argv[2]
|
17 | if (lodash.isUndefined(name)) {
|
18 | console.error('Error: missing path to the lambda')
|
19 | process.exit(1)
|
20 | }
|
21 |
|
22 | var pkg = name + '/package.json'
|
23 | if (!exists(pkg)) {
|
24 | console.error('Error: ' + pkg + ' does not exist')
|
25 | console.error('\n')
|
26 | console.error('Create a lambda with lambda-create in an npm script.')
|
27 | console.error('\n')
|
28 | process.exit(1)
|
29 | }
|
30 |
|
31 | var package = {
|
32 | json: require(process.cwd() + '/' + pkg)
|
33 | }
|
34 |
|
35 | var actual = package.json.name
|
36 | if (lodash.isUndefined(actual)) {
|
37 | console.error('Error: package.json missing name')
|
38 | process.exit(1)
|
39 | }
|
40 |
|
41 |
|
42 | name = '/aws/lambda/' + package.json.name
|
43 |
|
44 |
|
45 | stream(name, (err, result)=> {
|
46 |
|
47 |
|
48 | var names = result.logStreams.map(l=> l.logStreamName)
|
49 | var handlers = names.map(n=> {
|
50 | return function (callback) {
|
51 | var params = {
|
52 | logGroupName: name,
|
53 | logStreamName: n
|
54 | }
|
55 | cw.getLogEvents(params, callback)
|
56 | }
|
57 | })
|
58 |
|
59 |
|
60 | async.parallel(handlers, (err, results)=> {
|
61 | var events = lodash.flatten(results.map(r=>r.events))
|
62 | events.forEach(e=> {
|
63 |
|
64 |
|
65 | var strftime = require('strftime')
|
66 | var left = chalk.dim.green(' λ ') + chalk.grey.dim(strftime('%b%e,%l:%M:%S ', new Date(e.timestamp)))
|
67 | var right = chalk.green(e.message)
|
68 | var isStart = /START RequestId:/.test(e.message)
|
69 | var isEnd = /END RequestId:/.test(e.message)
|
70 | var isReport = /REPORT RequestId:/.test(e.message)
|
71 | var logexp = /(\d+-\d+-\d+T\d+:\d+:\d+.\d+Z)\s+(\w+-\w+-\w+-\w+-\w+)/
|
72 | var isLog = logexp.test(e.message)
|
73 |
|
74 | if (isLog) {
|
75 | var clean = e.message.replace(logexp, '')
|
76 | console.log(left + chalk.dim.green(clean.split('\n').join('\n' + left)))
|
77 | }
|
78 |
|
79 | if (isReport) {
|
80 | report = e.message.split('\t')
|
81 | var sha = report[0].match(/REPORT RequestId: (\w+)-/)[1]
|
82 | var duration = report[1].replace('Duration:','')
|
83 | right = chalk.cyan.underline.dim('@' + sha) + chalk.dim(duration)
|
84 | console.log(left + right)
|
85 | }
|
86 |
|
87 | if (!isStart && !isEnd && !isReport && !isLog) {
|
88 | right = chalk.green(right.split('\n').join('\n' + left))
|
89 | console.log(left + right)
|
90 | }
|
91 | })
|
92 | })
|
93 | })
|