(debug output) generates a text file from your logs that can be searched, timestamped, downloaded and more.
Debugout's log()
method accepts 1 or more args of any type, including functions. Debugout is not a monkey patch, but a separate logging class altogether that you use in place of console
.
Some highlights of debugout:
- get the entire log, or the tail at runtime or any time
- download the log as a text file
- search and slice the log
- optionally timestamp logs
- also supports info, warn and error methods
- toggle live logging (console.log) in one place
- optionally store the output in
window.localStorage
and continuously add to the same log each session - optionally cap the log to X most recent lines to limit memory consumption
New in 1.0
- Improved logging (multiple args, better formatting)
- Modularized
- More options
- Tested with jest
On npm: debugout.js
Use as a replacement for console
, or just use it as a logging utility.
import { Debugout } from 'debugout.js';
const bugout = new Debugout();
// instead of console.log
bugout.log('log stuff', someObject, someArray);
Whatever you log is saved and added to the log file.
log()
,warn()
,info()
,error()
- just likeconsole
, but saved!getLog()
- returns the entire log.tail(numLines)
- returns the last X lines of the log, where X is the number you pass. Defaults to 100.search(string)
- returns numbered lines where there were matches for your search. Pass a string.getSlice(start, end)
- get a 'slice' of the log. Pass the starting line index and optionally an ending line index.downloadLog()
- downloads a .txt file of the log.clear()
- clears the log.determineType()
- a more granular version oftypeof
for your convenience
Pass any of the following options in the constructor in an object. You can also change them at runtime as properties of your debugout instance.
interface DebugoutOptions {
realTimeLoggingOn?: boolean; // log in real time (forwards to console.log)
useTimestamps?: boolean; // insert a timestamp in front of each log
includeSessionMetadata?: boolean; // whether to include session start, end, duration, and when log is cleared
useLocalStorage?: boolean; // store the output using localStorage and continuously add to the same log each session
recordLogs?: boolean; // disable the core functionality of this lib
autoTrim?: boolean; // to avoid the log eating up potentially endless memory
maxLines?: number; // if autoTrim is true, this many most recent lines are saved
tailNumLines?: number; // default number of lines tail gets
logFilename?: string; // filename of log downloaded with downloadLog()
maxDepth?: number; // max recursion depth for logged objects
localStorageKey?: string; // localStorage key
indent?: string; // string to use for indent
quoteStrings?: boolean; // whether or not to put quotes around strings
}
Example using options:
const bugout = new Debugout({ realTimeLoggingOn: false });
// instead of console.log
bugout.log('log stuff'); // real time logging disabled (no console output)
bugout.realTimeLoggingOn = true;
bugout.log('more stuff'); // now, this will show up in your console.
- Post the log to your server if an error or some other event occurs.
- Allow the user to download a copy of a submitted form.
- Generate output for the user to download.
- Record survey answers and know how long each question took the user to answer.
- Do your work in src/debugout.ts
- Lint
npm run lint
- Test
npm t
- Test demo:
npm start
Debugout will get stuck in an endless loop if you try to log the window object because it has a circular reference. It will work if you set maxDepth
to 2, and you can see the root properties. The same thing happens if you do JSON.stringify(window, null, ' ')
, but the error message provides some insight.
If you try to log Debugout, it just prints ... (Debugout)
. Otherwise, recursion would cause an endless loop.