Code Monkey home page Code Monkey logo

ololog's People

Contributors

dependabot[bot] avatar ourarash avatar xpl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

ololog's Issues

suggestion: local storage enable/disable

I like ololog a lot better than debug.

But one feature we use organizationally with debug is the local storage enablement.

Screen Shot 2020-09-10 at 4 24 33 PM

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.

stringify doesn't work in this case, I think

Context is

  • nodejs @14.5
  • ololog @1.1.156
  • string.ify @1.0.61

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)

How to disable stringifying?

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!

bump stacktracey because annoying warning.

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.

Typescript definition issues (time, methods)

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

custom stringifier doesn't work

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:

image

How to permanently reconfigure

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!"); 

Typescript definition "object" types issue

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

Color object properies as console.log

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:
image

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?

Add license

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?

xhr request fails in iframe

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);

Feature request: severity

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');

Feature request: Automatic wrap long lines

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)

Define timezone for timestamps

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.

ReferenceError: Buffer is not defined

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?

Future expansion: Winston?

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?

Vanilla JS?

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

Non browser compatible node-module required

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).

Document `yes` switch for custom (time) printer

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.

TypeScript declaration files export 'null' symbol

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.

null: ololog,

Before you ask, yes, I am too lazy to type the word 'null' ๐Ÿ˜„

Intercepting the 'time' section of the log message?

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:

  • Add [ to the start and ] to the end of the timestamp.
  • Change the color of the timestamp (I know I can do that through the custom printer, but the custom printer is changing the look of the date)
  • Adding a (INFO) signature between the timestamp and the message block, so the second line of the message does not spill below the (INFO) signature.

So it looks a bit like this:
format

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 :)

React native support?

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:

  1. react-native does not support synchronous XMLHttpRequests
  2. 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.

How to use with blessed library

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?

ololog/reporter: TypeError: (intermediate value).clean.at is not a function

TypeError: (intermediate value).clean.at is not a function

How to repeat:

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

Result:

            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)

Expected:

Formatted exception
https://github.com/xpl/ololog#using-with-mocha

Env:

Chrome Console output does not output location correctly

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 

background color

is that possible to get a background color for the printed string? how to achieve this effect?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.