xpl / ololog Goto Github PK
View Code? Open in Web Editor NEWA better console.log for the log-driven debugging junkies
Home Page: https://www.npmjs.com/package/ololog
License: The Unlicense
A better console.log for the log-driven debugging junkies
Home Page: https://www.npmjs.com/package/ololog
License: The Unlicense
On test mode log messages add noise, so I wonder is there a way to silent them
I like ololog a lot better than debug.
But one feature we use organizationally with debug is the local storage enablement.
It may already be familiar to anyone reading this. But in case not, the way it works is with local storage debug
missing or empty, all debug()
output is disabled. If its value is *
, all debug()
output is enabled. Finally it can be set to a comma-separated list of context names, which correlate with require('debug')('context:name')('hello world')
.
This seems like 2 features unavailable with ololog - 1) local storage enablement and 2) named logging contexts.
If either or both of these features are actually available please just let me know. I'm not perfectly aware of everything ololog can do.
But the local storage enablement alone prevents me from using ololog in our frontend (react) apps.
Because I have a choice, I think, I can enable it or disable it in the build by using ololog.noop
when NODE_ENV==='production'
and configuring it as wanted otherwise. Or I can leave it enabled.
In the first case, if there's a problem in production, people will be upset we can't see the logging. In the second, the app will seem spammy, people here would prefer to not have logging output by default from our code.
If it seems like it might be possible to add one or both of these features I'd be willing to try to submit a PR according to whatever constraints you might have for it.
add TypeScript definitions (.d.ts file) to the repo.
Context is
Transpiled with babel:
"@babel/plugin-transform-runtime": "^7.9.6",
"@babel/runtime": "^7.10.2",
"@babel/cli": "^7.8.4",
"@babel/core": "^7.10.2",
"@babel/preset-env": "^7.10.2",
while NODE_ENV=development
import { URL } from 'url';
import ololog from 'ololog';
const log = ololog.configure({
stringify: { fancy: false, indentation: ' ', maxDepth: 9, maxStringLength: 135 },
})
log(new URL('http://www.fml.com')); // <-- just want that one to work
log((new URL('http://www.fml.com')).toString());
log(JSON.stringify(new URL('http://www.fml.com')));
outputs:
{ } (<anonymous> @ apis.js:41)
http://www.fml.com/ (<anonymous> @ apis.js:42)
"http://www.fml.com/" (<anonymous> @ apis.js:43)
Hey, I love this library, however in some cases I would like to output the javascript object without stringifying. How can this be done? Thanks!
warning in ./node_modules/.pnpm/[email protected]/node_modules/get-source/get-source.js
Module not found: Error: Can't resolve 'fs' in 'C:\me\dev\tabdeck\node_modules\.pnpm\[email protected]\node_modules\get-source'
@ ./node_modules/.pnpm/[email protected]/node_modules/stacktracey/stacktracey.js 8:23-45
@ ./node_modules/.pnpm/[email protected]/node_modules/ololog/build/ololog.js 14:18-40
@ ./src/glue/globals.js 7:37-54
I believe that you are version 2.0 with stacktracey.
using the example log = log.configure ({ time: { yes: true, format: 'iso' } })
leads to a typescript issue as yes
is not defined. It seems it is missing from the types definition
I tried the example from the docs:
const obj = { foo: true, bar: 42 }
const log = require ('ololog').configure ({ stringify: { print: require ('q-i').stringify } })
log(obj)
const { stringify } = require('q-i')
console.log(stringify(obj))
It turns out that while q-i
works by itself, with ololog it doesn't:
Suppose I configure the log once. How can I reconfigure it afterwards such that the effect stays permanent. See example below:
var log = require("ololog").configure({
locate: false,
tag:false
});
log("doesn't print locate or tag :)");
log.configure({locate:true, tag: true});
log.info("doesn't print locate or tag despite configure :(");
log.configure({locate:true, tag: true}).info("prints locate or tag but it's ugly!");
Hi,
When importing into my typescript project, I was forced to import it as a js library and not use the type definition. This was due to several parameters defined as object
types.
Typescript does not like this, and so it should either be changed to any
or an interface should be created for such parameters.
example:
type StageCallback = (input: any, config?: object) => any;
the config?: object
means that we are unable to send in any config parameters. It should either be config?: any
or config?: IStageCallbackConfig
where you define the interface elsewhere.
There are several appearances of this which need fixing in the definition file
I couldn't find a guideline how to preserve colors for object properies, so the console output may look similar to the one produced by console.log
:
const log = require ('ololog')
const os = require("os");
const path = require('path');
log({"hello": "world!"});
console.log({"hello": "world!"});
Does the module provide such capabilities?
Hey @xpl! I noticed that there is no license attached to this repository. I would like to use this for a commercial project but without any license declared in the repository, this will be impossible.
Would it be possible to add a license?
Thanks for the best logging library out there!
One glitch I bumped into, when calling log.info from inside iframe, an iframe which I instantiate as BlobURL.
The call would be here
try {
if (isBrowser) {
let xhr = new XMLHttpRequest ()
xhr.open ('GET', path, false /* SYNCHRONOUS XHR FTW :) */)
xhr.send (null)
this.text = xhr.responseText
} else {
The error in Chrome
6cb0327a-6bb3-4ae6-87cf-91d6c71c5e80:5667 GET blob:http://localhost:3000/4c010b36-0716-4494-8acf-ddb045159385/ net::ERR_FILE_NOT_FOUND
The iframe I create btw like this
const iFrameHtml = [
`<!doctype html>`,
`<html lang="en">`,
`<head>`,
`</head>`,
`<body>`,
`<script type="text/javascript" src="${ScriptProcessorNodeWorker()}"></script>`,
`</body>`,
].join('\n');
const iFrameBlob = new Blob([iFrameHtml], { type: 'text/html' });
const iFrame = document.createElement('iframe');
iFrame.src = URL.createObjectURL(iFrameBlob);
iFrame.sandbox.add('allow-scripts', 'allow-same-origin');
document.body.appendChild(iFrame);
I was able to hack a severity level so that a message only prints if its severity is above the min severity level. This is useful when for example you run the program in a verbose vs non-verbose mode.
Here is what worked for me:
const bullet = require("string.bullet");
const { cyan, yellow, red, dim, blue } = require("ansicolor");
var log = require("ololog").configure({
locate: false,
infoSeverity: 5,
tag: (
lines,
{
level = "",
minSeverity=10,
severity = 11,
levelColor = {
info: cyan,
warn: yellow,
error: red.bright.inverse,
debug: blue
}
}
) => {
const levelStr =
level && (levelColor[level] || (s => s))(level.toUpperCase());
if (severity >= minSeverity) {
return bullet(levelStr.padStart(6) + " ", lines);
} else return [];
}
});
log("This prints!");
log
.configure({tag:{severity:12}})
.info("This will print, severity 12!");
log
.configure({tag:{severity:1}})
.info("This will print, severity 1!");
log
.configure({tag:{severity:15}})
.info("This will print, severity 15!");
log = log
.configure({tag:{minSeverity:1000}}); // change severity
log
.configure({tag:{severity:12}})
.info("This will not print, severity 12!");
log
.configure({tag:{severity:1}})
.info("This will not print, severity 1!");
log
.configure({tag:{severity:15}})
.info("This will not print, severity 15!");
However, this is ugly. Ideally, it should be like this:
var log = require("ololog").configure({
locate: false,
infoMinSeverity: 5,
warnMinSeverity: 6,
debugMinSeverity: 8,
errorMinSeverity: 10,
minSeverity: 15, //without tag
});
log.severity(5).info('This is my message');
log.configure({infoMinSeverity:0}).info('This is my message');
Current behavior when using timestamp and tags and trying to log long lines
[time] [tag] Lorem ipsum dolor sit amet
[time] [tag] Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
[time] [tag] Lorem ipsum dolor sit amet
But it is more nicer when it looks like:
[time] [tag] Lorem ipsum dolor sit amet
[time] [tag] Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
[time] [tag] Lorem ipsum dolor sit amet
I suppose it is possible when I manually add linebreaks
log('Lorem ipsum dolor sit amet\ntempor incididunt ut labore\n et dolore magna aliqua. Ut enim ad minim veniam')
It would be nice if it happends automatically (break lines depending of available columns in terminal - https://github.com/sindresorhus/term-size)
Is there any way to define your current timezone or an offset?
Right now the timestamps from the logger are 2 hours behind.
I couldn't find this in the docs.
Thanks.
I am building an app with Electron and Ololog
does not work in my front-end.
I get the following error:
index.js:60 Uncaught (in promise) ReferenceError: Buffer is not defined
at dataUriToBuffer (index.js:60:16)
at SourceMapResolver (get-source.js:84:61)
at SourceMapResolverFromFetchedFile (get-source.js:77:22)
at _resolve (get-source.js:37:59)
at Object.resolve (get-source.js:44:36)
at StackTracey.withSource (stacktracey.js:186:55)
at stacktracey.js:234:36
at Array.map (<anonymous>)
at StackTracey.<computed> [as map] (stacktracey.js:332:52)
at StackTracey.withSources (stacktracey.js:234:21)
I am using Vite and Svelte, however when I tried to reproduce it with just those two frameworks (without Electron), it works just fine.
I think that it might not execute the Browser version for whatever reason.
Is it possible to enforce that?
So, traditionally I use debug for console logging (which ololog could replace, if it had the filters) and winston for centralized logging.
What's your plan for how ololog will expand going forward?
newbie question - seeing unexpected error when using ololog as below. I include the lib like this:
<script src="https://unpkg.com/ololog"></script>
then i setup simply like this:
let log = ololog;
log.configure ({
indent: { level: 3 }, //indent level
locate:true,
tag:true, //shows the 'iNFo' tag (or whatever) in front of msg
time:false //timestamps
});
but I see a console error on startup from the file get-source.js that i don't understand..
get-source.js:142 GET http://127.0.0.1:5500/index.html/ 404 (Not Found)
(anonymous) @ get-source.js:142
SyncPromise @ SyncPromise.js:9
fetchFileSync @ get-source.js:138
(anonymous) @ get-source.js:27
m @ get-source.js:17
SourceFile @ get-source.js:30
getSource @ get-source.js:113
withSource @ stacktracey.js:166
(anonymous) @ stacktracey.js:214
StackTracey.<computed> @ stacktracey.js:312
withSources @ stacktracey.js:214
clean @ stacktracey.js:237
locate @ ololog.js:119
modifiedFunctions.<computed> @ pipez.js:48
modifiedFunctions.<computed> @ pipez.js:48
(anonymous) @ pipez.js:23
Object.assign.configure @ pipez.js:23
(anonymous) @ logger.js:26
Currently when you set date:true
, the date if printed in ISO format:
2018-04-27T18:30:09.573Z
It would be great to show it in local value
For reasons too long to explain here, I can't include browser compatible polyfills for built-in nodejs modules.
So when I'm compiling targeting the browser with rollup I'm getting
[!] Error: Could not load util (imported by node_modules/stacktracey/stacktracey.js): ENOENT: no such file or directory, open 'util'
Error: Could not load util (imported by node_modules/stacktracey/stacktracey.js): ENOENT: no such file or directory, open 'util'
perhaps some easy isBrowser
will fix this. I'm also sure that it should be possible to find require ('util').inspect
browserified (using built-in modules if in nodejs env).
If you follow the documentation for the custom printer for timestamps (https://github.com/xpl/ololog#timestamping), it will show you nothing. That is because the example code lacks the yes
switch you need to enable the custom printer.
So this current example:
log.configure ({ time: { print: x => (String (x) + ' | ').bright.cyan }}) ('Lorem ipsum dolor sit amet\nconsectetur adipiscing elit..')
Should be (added yes: true
):
log.configure ({ time: { yes: true, print: x => (String (x) + ' | ').bright.cyan }}) ('Lorem ipsum dolor sit amet\nconsectetur adipiscing elit..')
Not sure if it applies to other custom printers as well. It works without the yes
on the locate custom printer.
The TypeScript definition file ololog.d.ts
exports symbol null
which VS Code's TypeScript auto import feature is eager to import any time the symbol null
is autocompleted.
For example, pressing the autocomplete key at the end of this line:
const rudeObj = { hello: "world", value: nul
will cause nul
to be auto completed to null
, and the null symbol to be automatically imported from ololog.
import ololog, { null } from 'ololog';
The result is invalid code, because null
cannot be assigned to for obvious reasons.
It strikes me that it is not good practice to export a symbol that is a language keyword. It is possible that this is simply bad behavior on VS Code's part, but note that this is not the behavior of an extension.
Line 130 in fe1d34a
Before you ask, yes, I am too lazy to type the word 'null' ๐
Hi,
Great tool. I especially love the fact that we can intercept and modify the concat
and render
stages.
One thing I was not able to do:
I would like to format the timestamp
in the following fashion:
[2019-01-19T15:40:28.535Z] (INFO) This is just a message reporting a variable:
[1, 2, 3, 4, 5, 6] (info @ logging.js:60)
I know we can add a custom printer for the time, but that changes the output to:
[Sat Jan 19 2019 15:17:03 GMT+0000 (Greenwich Mean Time)]
which is not something that I would like to do? So here is what I am trying to achieve:
[
to the start and ]
to the end of the timestamp.(INFO)
signature between the timestamp and the message block, so the second line of the message does not spill below the (INFO)
signature.Obviously, I tried this:
const logging = log.configure ({
/* Injects a function after the "concat" step */
'concat+' (blocks) {
console.log(blocks)
return blocks;
},
time: {
yes: true,
format: 'iso'
}
});
as an attempt to intercept the text stream and try re-format it, but I got this:
[ '\u001b[33m\u001b[22m\u001b[1mThis is just a message reporting a variable:\u001b[22m\u001b[39m',
'\u001b[33m\u001b[22m\u001b[1m\u001b[22m\u001b[39m [1, 2, 3, 4, 5, 6]' ]
... so the timestamp was not there :)
It would be nice to use Ololog in react-native. Right now it seems it primary doesn't work because the browser check is incorrect so react-native is detected as a browser and undefined properties are read.
is_browser = (typeof window !== 'undefined') && (window.window === window) && window.navigator
should be
is_browser = (typeof window !== 'undefined' && typeof document !== 'undefined') && (window.window === window) && window.navigator
in ololog and all of it's dependencies, otherwise react-native gets detected as a browser environment and crashes accessing undefined APIs.
You can also test for react-native directly with
isReactNative = (typeof navigator != 'undefined' && navigator.product == 'ReactNative'),
It also seems that stacktracey
is incompatible with react-native, primarily because of:
get-source
assumes some node APIs exist that don't on react-native, namely process.cwd
is undefined.How feasible do you think it is to make ololog support react-native out of the box? If the browser checks are fixed it seems to be mostly working except for source mapping. When I tried to async load the source map from metro (react-native's bundler) it just hangs because the source map is enormous. I'm not really familiar with how source mapping works and editing non typescript JS written by somebody else is challenging so I'm not sure if I'm able to figure it out right now.
I was trying to use this with the npm blessed library, so that I have two boxes: one for output log and one for showing progress which doesn't scroll.
I used:
let renderedText = ololog.before('render')(...args);
and was able to make set of new functions called mainLog. I could make mainLog.info(), error, and warn to work, but I can't make without any tags, e.g. mainLog("print this item");
My complete code is here.
In general, how would you do this?
git clone https://github.com/unlight/node-package-starter.git
cd node-package-starter
npm i
npm i -D ololog
# change src/index.spec.ts, change line with 'Hello world' to
# expect(library.hello()).toEqual('Hello world!!!');
node -r ts-node/register/transpile-only node_modules/mocha/bin/_mocha --reporter ololog/reporter src/**/*.spec.ts
const location = new StackTracey ().clean.at (2)
^
TypeError: (intermediate value).clean.at is not a function
at Function.ololog.impl.render (D:\Dev\node-package-starter\node_modules\ololog\reporter.js:62:55)
at Function.modifiedFunctions.<computed> (D:\Dev\node-package-starter\node_modules\pipez\pipez.js:48:45)
at Function.modifiedFunctions.<computed> (D:\Dev\node-package-starter\node_modules\pipez\pipez.js:48:45)
at Function.modifiedFunctions.<computed> (D:\Dev\node-package-starter\node_modules\pipez\pipez.js:48:45)
at D:\Dev\node-package-starter\node_modules\pipez\pipez.js:23:73
at Array.reduce (<anonymous>)
at Function.Object.assign.configure (D:\Dev\node-package-starter\node_modules\pipez\pipez.js:23:39)
at process.<anonymous> (D:\Dev\node-package-starter\node_modules\ololog\reporter.js:10:48)
at process.emit (events.js:327:22)
at process.EventEmitter.emit (domain.js:467:12)
at process.emit (D:\Dev\node-package-starter\node_modules\source-map-support\source-map-support.js:495:21)
at process._fatalException (internal/process/execution.js:163:25)
Formatted exception
https://github.com/xpl/ololog#using-with-mocha
While running ololog in React I have noticed that it does not output location file from the point where it is called but shows always as event raised by ololog.js:145.
with location config = false it will show:
3/22/2021, 11:22:14 AM "My Log>> XXX" ololog.js:145
with location config = false it will show:
3/22/2021, 11:22:14 AM "My Log>> XXX" ololog.js:145
(<computed> โ <computed> โ <computed> @ pipez.js:47)
while log was raised in the file example.js
.
Even in your demo it will output something like:
https://xpl.github.io/ololog/
foo ra (<computed> โ <computed> โ <computed> โ <computed> @ pipez.js:48) ololog.js:145
is that possible to get a background color for the printed string? how to achieve this effect?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.