Browse Source

Ability to load logs added

master
Leo Lamprecht 8 years ago
parent
commit
71a04d2811
  1. 215
      package-lock.json
  2. 3
      package.json
  3. 311
      src/providers/sh/commands/bin/logs.js
  4. 6
      src/providers/sh/index.js

215
package-lock.json

@ -205,7 +205,7 @@
"requires": {
"ansi-styles": "3.2.0",
"escape-string-regexp": "1.0.5",
"supports-color": "4.2.1"
"supports-color": "4.4.0"
}
},
"minimist": {
@ -215,9 +215,9 @@
"dev": true
},
"supports-color": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz",
"integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
@ -945,7 +945,7 @@
"requires": {
"babel-core": "6.26.0",
"babel-runtime": "6.26.0",
"core-js": "2.5.0",
"core-js": "2.5.1",
"home-or-tmp": "2.0.0",
"lodash": "4.17.4",
"mkdirp": "0.5.1",
@ -958,7 +958,7 @@
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"dev": true,
"requires": {
"core-js": "2.5.0",
"core-js": "2.5.1",
"regenerator-runtime": "0.11.0"
}
},
@ -1339,7 +1339,7 @@
"requires": {
"ansi-styles": "3.2.0",
"escape-string-regexp": "1.0.5",
"supports-color": "4.2.1"
"supports-color": "4.4.0"
},
"dependencies": {
"ansi-styles": {
@ -1352,9 +1352,9 @@
}
},
"supports-color": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz",
"integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
@ -1746,9 +1746,9 @@
}
},
"core-js": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz",
"integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=",
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
"integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
"dev": true
},
"core-util-is": {
@ -1911,6 +1911,12 @@
"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
"dev": true
},
"dateformat": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz",
"integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=",
"dev": true
},
"death": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
@ -2292,47 +2298,54 @@
}
},
"engine.io-client": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz",
"integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=",
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.4.tgz",
"integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=",
"dev": true,
"requires": {
"component-emitter": "1.2.1",
"component-inherit": "0.0.3",
"debug": "2.6.8",
"engine.io-parser": "2.1.1",
"debug": "2.3.3",
"engine.io-parser": "1.3.2",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"parsejson": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"ws": "2.3.1",
"ws": "1.1.2",
"xmlhttprequest-ssl": "1.5.3",
"yeast": "0.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
"integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
"dev": true,
"requires": {
"ms": "2.0.0"
"ms": "0.7.2"
}
},
"ms": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
"dev": true
}
}
},
"engine.io-parser": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz",
"integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz",
"integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
"dev": true,
"requires": {
"after": "0.8.2",
"arraybuffer.slice": "0.0.6",
"base64-arraybuffer": "0.1.5",
"blob": "0.0.4",
"has-binary2": "1.0.2"
"has-binary": "0.1.7",
"wtf-8": "1.0.0"
}
},
"enhanced-resolve": {
@ -2914,14 +2927,14 @@
"dev": true,
"requires": {
"babel-plugin-transform-flow-comments": "6.22.0",
"flow-bin": "0.53.1",
"flow-bin": "0.54.0",
"lodash.merge": "4.6.0"
}
},
"flow-bin": {
"version": "0.53.1",
"resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.53.1.tgz",
"integrity": "sha1-myK2OiPJl2OuUz67qwf4jIjJfYQ=",
"version": "0.54.0",
"resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.54.0.tgz",
"integrity": "sha1-8vsEeOnplwK2I8nthAeaOZA7unc=",
"dev": true
},
"for-in": {
@ -4085,19 +4098,19 @@
"ansi-regex": "2.1.1"
}
},
"has-binary2": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
"integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
"has-binary": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
"integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
"dev": true,
"requires": {
"isarray": "2.0.1"
"isarray": "0.0.1"
},
"dependencies": {
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
}
}
@ -4644,6 +4657,12 @@
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
},
"json3": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
"integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
"dev": true
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
@ -5663,6 +5682,12 @@
"wordwrap": "1.0.0"
}
},
"options": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
"integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
"dev": true
},
"ora": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz",
@ -6073,7 +6098,7 @@
"integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=",
"dev": true,
"requires": {
"core-js": "2.5.0",
"core-js": "2.5.1",
"regenerator-runtime": "0.10.5"
}
},
@ -6139,7 +6164,7 @@
"integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=",
"dev": true,
"requires": {
"core-js": "2.5.0",
"core-js": "2.5.1",
"regenerator-runtime": "0.10.5"
}
},
@ -6909,62 +6934,78 @@
}
},
"socket.io-client": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz",
"integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=",
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz",
"integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=",
"dev": true,
"requires": {
"backo2": "1.0.2",
"base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
"component-emitter": "1.2.1",
"debug": "2.6.8",
"engine.io-client": "3.1.1",
"has-cors": "1.1.0",
"debug": "2.3.3",
"engine.io-client": "1.8.4",
"has-binary": "0.1.7",
"indexof": "0.0.1",
"object-component": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"socket.io-parser": "3.1.2",
"socket.io-parser": "2.3.1",
"to-array": "0.1.4"
},
"dependencies": {
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
"integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
"dev": true,
"requires": {
"ms": "2.0.0"
"ms": "0.7.2"
}
},
"ms": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
"dev": true
}
}
},
"socket.io-parser": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz",
"integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz",
"integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
"dev": true,
"requires": {
"component-emitter": "1.2.1",
"debug": "2.6.8",
"has-binary2": "1.0.2",
"isarray": "2.0.1"
"component-emitter": "1.1.2",
"debug": "2.2.0",
"isarray": "0.0.1",
"json3": "3.3.2"
},
"dependencies": {
"component-emitter": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
"integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=",
"dev": true
},
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
"dev": true,
"requires": {
"ms": "2.0.0"
"ms": "0.7.1"
}
},
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
"ms": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
"integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
"dev": true
}
}
@ -7576,9 +7617,9 @@
"dev": true
},
"ultron": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz",
"integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
"dev": true
},
"unbzip2-stream": {
@ -7813,7 +7854,7 @@
"mkdirp": "0.5.1",
"node-libs-browser": "2.0.0",
"source-map": "0.5.7",
"supports-color": "4.2.1",
"supports-color": "4.4.0",
"tapable": "0.2.8",
"uglifyjs-webpack-plugin": "0.4.6",
"watchpack": "1.4.0",
@ -7828,9 +7869,9 @@
"dev": true
},
"supports-color": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz",
"integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
@ -8017,23 +8058,21 @@
}
},
"ws": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz",
"integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz",
"integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
"dev": true,
"requires": {
"safe-buffer": "5.0.1",
"ultron": "1.1.0"
},
"dependencies": {
"safe-buffer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
"integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
"dev": true
}
"options": "0.0.6",
"ultron": "1.0.2"
}
},
"wtf-8": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz",
"integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=",
"dev": true
},
"xdg-basedir": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",

3
package.json

@ -97,6 +97,7 @@
"clipboardy": "1.1.4",
"convert-stream": "1.0.2",
"copy-webpack-plugin": "4.0.1",
"dateformat": "2.0.0",
"death": "1.1.0",
"debug": "3.0.0",
"deployment-type": "1.0.1",
@ -134,7 +135,7 @@
"shebang-loader": "0.0.1",
"single-line-log": "1.1.2",
"slackup": "2.2.1",
"socket.io-client": "2.0.3",
"socket.io-client": "1.7.4",
"split-array": "1.0.1",
"strip-ansi": "4.0.0",
"tar-fs": "1.15.3",

311
src/providers/sh/commands/bin/logs.js

@ -0,0 +1,311 @@
#!/usr/bin/env node
// Native
const qs = require('querystring')
// Packages
const minimist = require('minimist')
const chalk = require('chalk')
const dateformat = require('dateformat')
const io = require('socket.io-client')
// Utilities
const Now = require('../lib')
const login = require('../lib/login')
const cfg = require('../lib/cfg')
const { handleError, error } = require('../lib/error')
const logo = require('../lib/utils/output/logo')
const { compare, deserialize } = require('../lib/logs')
const { maybeURL, normalizeURL, parseInstanceURL } = require('../lib/utils/url')
const help = () => {
console.log(`
${chalk.bold(`${logo} now logs`)} <deploymentId|url>
${chalk.dim('Options:')}
-h, --help output usage information
-a, --all include access logs
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline(
'FILE'
)} config file
-d, --debug debug mode [off]
-f wait for additional data [off]
-n ${chalk.bold.underline('NUMBER')} number of logs [1000]
-q ${chalk.bold.underline('QUERY')}, --query=${chalk.bold.underline(
'QUERY'
)} search query
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
'TOKEN'
)} login token
--since=${chalk.bold.underline(
'SINCE'
)} only return logs after date (ISO 8601)
--until=${chalk.bold.underline(
'UNTIL'
)} only return logs before date (ISO 8601), ignored if the f option is enbled.
${chalk.dim('Examples:')}
${chalk.gray('–')} Print logs for the deployment ${chalk.dim(
'`deploymentId`'
)}
${chalk.cyan('$ now logs deploymentId')}
`)
}
let argv
let deploymentIdOrURL
let debug
let apiUrl
let limit
let query
let follow
let types
let since
let until
let instanceId
const main = async ctx => {
argv = minimist(ctx.argv.slice(2), {
string: ['config', 'query', 'since', 'token', 'until'],
boolean: ['help', 'all', 'debug', 'f'],
alias: {
help: 'h',
all: 'a',
config: 'c',
debug: 'd',
token: 't',
query: 'q'
}
})
argv._ = argv._.slice(1)
deploymentIdOrURL = argv._[0]
if (argv.help || !deploymentIdOrURL) {
help()
process.exit(0)
}
try {
since = argv.since ? toSerial(argv.since) : null
} catch (err) {
error(`Invalid date string: ${argv.since}`)
process.exit(1)
}
try {
until = argv.until ? toSerial(argv.until) : null
} catch (err) {
error(`Invalid date string: ${argv.until}`)
process.exit(1)
}
if (maybeURL(deploymentIdOrURL)) {
const normalizedURL = normalizeURL(deploymentIdOrURL)
if (normalizedURL.includes('/')) {
error(`Invalid deployment url: can't include path (${deploymentIdOrURL})`)
process.exit(1)
}
;[deploymentIdOrURL, instanceId] = parseInstanceURL(normalizedURL)
}
debug = argv.debug
apiUrl = argv.url || 'https://api.zeit.co'
if (argv.config) {
cfg.setConfigFile(argv.config)
}
limit = typeof argv.n === 'number' ? argv.n : 1000
query = argv.query || ''
follow = argv.f
types = argv.all ? [] : ['command', 'stdout', 'stderr', 'exit']
const config = await cfg.read({ token: argv.token })
let token
try {
token = config.token || (await login(apiUrl))
} catch (err) {
error(`Authentication error – ${err.message}`)
process.exit(1)
}
await printLogs({ token, config })
}
module.exports = async ctx => {
try {
await main(ctx)
} catch (err) {
handleError(err)
process.exit(1)
}
}
async function printLogs({ token, config: { currentTeam } }) {
let buf = []
let init = false
let lastLog
if (!follow) {
onLogs(await fetchLogs({ token, currentTeam, since, until }))
return
}
const isURL = deploymentIdOrURL.includes('.')
const q = qs.stringify({
deploymentId: isURL ? '' : deploymentIdOrURL,
host: isURL ? deploymentIdOrURL : '',
instanceId,
types: types.join(','),
query
})
const socket = io(`https://log-io.zeit.co?${q}`)
socket.on('connect', () => {
if (debug) {
console.log('> [debug] Socket connected')
}
})
socket.on('auth', callback => {
if (debug) {
console.log('> [debug] Socket authenticate')
}
callback(token)
})
socket.on('ready', () => {
if (debug) {
console.log('> [debug] Socket ready')
}
// For the case socket reconnected
const _since = lastLog ? lastLog.serial : since
fetchLogs({ token, currentTeam, since: _since }).then(logs => {
init = true
const m = {}
logs.concat(buf.map(b => b.log)).forEach(l => {
m[l.id] = l
})
buf = []
onLogs(Object.values(m))
})
})
socket.on('logs', l => {
const log = deserialize(l)
let timer
if (init) {
// Wait for other logs for a while
// and sort them in the correct order
timer = setTimeout(() => {
buf.sort((a, b) => compare(a.log, b.log))
const idx = buf.findIndex(b => b.log.id === log.id)
buf.slice(0, idx + 1).forEach(b => {
clearTimeout(b.timer)
onLog(b.log)
})
buf = buf.slice(idx + 1)
}, 300)
}
buf.push({ log, timer })
})
socket.on('disconnect', () => {
if (debug) {
console.log('> [debug] Socket disconnect')
}
init = false
})
socket.on('error', err => {
if (debug) {
console.log('> [debug] Socket error', err.stack)
}
})
function onLogs(logs) {
logs.sort(compare).forEach(onLog)
}
function onLog(log) {
lastLog = log
printLog(log)
}
}
function printLog(log) {
let data
const obj = log.object
if (log.type === 'request') {
data =
`REQ "${obj.method} ${obj.uri} ${obj.protocol}"` +
` ${obj.remoteAddr} - ${obj.remoteUser || ''}` +
` "${obj.referer || ''}" "${obj.userAgent}"`
} else if (log.type === 'response') {
data =
`RES "${obj.method} ${obj.uri} ${obj.protocol}"` +
` ${obj.status} ${obj.bodyBytesSent}`
} else {
data = obj
? JSON.stringify(obj, null, 2)
: (log.text || '').replace(/\n$/, '')
}
const date = dateformat(log.date, 'mm/dd hh:MM TT')
data.split('\n').forEach((line, i) => {
if (i === 0) {
console.log(`${chalk.dim(date)} ${line}`)
} else {
console.log(`${repeat(' ', date.length)} ${line}`)
}
})
}
async function fetchLogs({ token, currentTeam, since, until } = {}) {
const now = new Now({ apiUrl, token, debug, currentTeam })
let logs
try {
logs = await now.logs(deploymentIdOrURL, {
instanceId,
types,
limit,
query,
since,
until
})
} catch (err) {
handleError(err)
process.exit(1)
} finally {
now.close()
}
return logs.map(deserialize)
}
function repeat(s, n) {
return new Array(n + 1).join(s)
}
function toSerial(datestr) {
const t = Date.parse(datestr)
if (isNaN(t)) {
throw new TypeError('Invalid date string')
}
const pidLen = 19
const seqLen = 19
return t + repeat('0', pidLen + seqLen)
}

6
src/providers/sh/index.js

@ -13,7 +13,8 @@ module.exports = {
'rm',
'remove',
'whoami',
'secrets'
'secrets',
'logs'
]),
get deploy() {
return require('./deploy')
@ -53,5 +54,8 @@ module.exports = {
},
get secrets() {
return require('./commands/bin/secrets')
},
get logs() {
return require('./commands/bin/logs')
}
}

Loading…
Cancel
Save