{"id":19389052,"url":"https://github.com/yyyar/loginator","last_synced_at":"2025-04-23T23:31:56.899Z","repository":{"id":29197067,"uuid":"32728306","full_name":"yyyar/loginator","owner":"yyyar","description":"Agile \u0026 Configurable Logger for Node.js","archived":false,"fork":false,"pushed_at":"2025-03-30T19:53:26.000Z","size":147,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-30T20:28:55.404Z","etag":null,"topics":["logger","logging","logging-library","logs","nodejs","nodejs-logger","nodejs-logging","nodejs-logs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yyyar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-03-23T11:33:02.000Z","updated_at":"2025-03-30T19:53:22.000Z","dependencies_parsed_at":"2022-08-17T19:41:01.591Z","dependency_job_id":"dac8c97e-a21c-47fd-9ee2-c3763df47ee4","html_url":"https://github.com/yyyar/loginator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Floginator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Floginator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Floginator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Floginator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yyyar","download_url":"https://codeload.github.com/yyyar/loginator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250532186,"owners_count":21446133,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["logger","logging","logging-library","logs","nodejs","nodejs-logger","nodejs-logging","nodejs-logs"],"created_at":"2024-11-10T10:14:37.617Z","updated_at":"2025-04-23T23:31:56.882Z","avatar_url":"https://github.com/yyyar.png","language":"JavaScript","readme":"## loginator\n\n[![Build Status](https://travis-ci.org/yyyar/loginator.svg?branch=master)](https://travis-ci.org/yyyar/loginator) [![NPM version](https://badge.fury.io/js/loginator.svg)](http://badge.fury.io/js/loginator)\n\nLoginator is simple and configurable logger for Node.js.\n\n* **Configurable**: Logging format, level, multiple appenders, formatters and overrides\n* **Formatters**: Configurable Text and JSON formatters\n* **Appenders**: Configurable Stdout, File \u0026 Redis appenders\n* **Custom Vars**: Inherit bound loggers overriding custom variables\n\n### Installation\n```bash\n$ npm install loginator\n```\n\n### Usage\n\n#### Simple example\n\n```javascript\nvar loginator = require('loginator');\n\n// create new logger\nvar log = loginator.createLogger({\n  // Example with date format options\n  formatter: {\n    type: 'text',\n    options: {\n      pattern: '[%dtime] [%level] - %message',\n      dateFormat: 'yyyy-mm-dd',\n      timeFormat: 'HH:MM:ss',\n      dtimeFormat: 'yyyy-mm-dd HH:MM:ss'\n    }\n  }\n});\n\n// or get logger, and cache it for future calls\n// var log = loginator.getLogger('mylogger' /* , {optional configuration } */);\n\n/* Logging levels example */\n\nlog.debug('Hello world!');\n// -\u003e [2015-03-28 11:54:31] [DEBUG] - Hello world!\n\nlog.info('Hello world!');\n// -\u003e [2015-03-28 11:54:31] [INFO] - Hello world!\n\nlog.warn('Hello world!');\n// -\u003e [2015-03-28 11:54:31] [WARN] - Hello world!\n\nlog.error('Hello world!');\n// -\u003e [2015-03-28 11:54:31] [ERROR] - Hello world!\n\nlog.fatal('Hello world!');\n// -\u003e [2015-03-28 11:54:31] [FATAL] - Hello world!\n\n\n/* Logging objects */\n\nlog.info('Hello world!', {'some': 'object'}, new Date(), new Error('Error!!!'));\n// -\u003e [2015-03-28 11:54:31] [INFO] - Hello world! {\"some\":\"object\"} \"2015-03-28T09:54:31.096Z\" Error: Error!!!\n```\n\n#### Configuration\n`loginator.createLogger()` accepts one optional configuration object.\n*Note*. Loginator configuration object may be a simple JSON so you can easily store logger configuration in external JSON file.\n\n```javascript\nvar log = loginator.createLogger({\n\n    // Logger name\n    name: 'mylogger',\n\n    // logging level. Logs with less logging level will be omitted.\n    // Supported values are: 'TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR' and 'FATAL':\n    level: 'DEBUG',\n\n    // truncate 'message' to limitMessageLength chars.\n    // 0, if leave message as it is without truncation\n    limitMessageLength: 0,\n\n    // formatter defines how to format log output.\n    // this is a default formatter that will apply to all appenders by default,\n    // and it can be overwritten in any concrete appender configuration\n    // (see following paragraphs for more examples)\n    formatter: {\n        type: 'text',\n        options: {\n            pattern: '[%level] %dtime (%name) (%location) ~ %message',\n            dateFormat: 'yyyy-mm-dd',       // optional, format for %date\n            timeFormat: 'HH:MM:ss',         // optional, format for %time\n            dtimeFormat: 'yyyy-mm-dd HH:MM:ss' // optional, format for %dtime\n        }\n    },\n\n    // appenders defines a list of destinations\n    // where log messages will go\n    // (see following paragraphs for more examples)\n    appenders: [\n        {\n            type: 'stdout',\n            level: 'INFO', // optional level override\n            options: {\n                formatter: { /* ... */ } // optional formatter override\n            }\n        }\n    ],\n\n    // (optional) loglog - function that is called by loginator to log its own messages\n    // it may happen in case of some problem in appender and we have no other way to log it.\n    loglog: console.error\n});\n```\n\n#### Default configuration\nYou can set default configuration:\n\n```javascript\nloginator.configure({\n    // configuration\n});\n```\nIn this case configuration fields passed to `loginator.createLogger` will override default ones.\n\n\n#### Formatters\nFormatter defines how log output will be formated. Formatter can be configured:\n- Globally for logger. It's configuration should be passed into logger config.\n- Per appender. By defaults all appenders inherit logger's formatter, but you can\noverwrite formatter for concrete appender (see Appenders section for more details).\n\nThere are several predefined variables that can be used in formatters config:\n```\nmessage       -  logging message (joined arguments)\ndate          -  date only\ndtime         -  date with time\ntime          -  time only\nlevel         -  logging level\nprocess       -  process name\nhostname      -  host name (from `os.hostname()`)\nname          -  logger name\nlocation      -  location (filename:line) of log call\nlonglocation  -  long location (/full/path/to/filename:line) of log call\n```\n\n##### Text Formatter\n```javascript\n{\n    type: 'text',\n    options: {\n        pattern: '[%dtime] [%level] - %message',\n        dateFormat: 'yyyy-mm-dd',       // optional, format for %date\n        timeFormat: 'HH:MM:ss',         // optional, format for %time\n        dtimeFormat: 'yyyy-mm-dd HH:MM:ss', // optional, format for %dtime\n    }\n}\n```\n\nWhere `pattern` may be any mix of variables prefixed by `%`. You can customize date and time formats using `dateFormat`, `timeFormat`, and `dtimeFormat` options. These formats use the [dateformat](https://www.npmjs.com/package/dateformat) library's formatting tokens.\n\n###### Using 12-hour Time Format\n\nFor 12-hour time format with AM/PM indicator, use:\n\n```javascript\n{\n    type: 'text',\n    options: {\n        pattern: '[%dtime] [%level] - %message',\n        timeFormat: 'h:MM:ss TT',        // 12-hour format with seconds and AM/PM\n        dtimeFormat: 'yyyy-mm-dd h:MM TT' // date with 12-hour time\n    }\n}\n```\n\n##### JSON Formatter\n```javascript\n{\n    type: 'json',\n    options: {\n        fields: ['dtime', 'message', 'level', 'process'],\n        pretty: true | false,  // default: false\n        stringifyMessage: true | false,   // default: false\n        dateFormat: 'yyyy-mm-dd',       // optional, format for %date\n        timeFormat: 'HH:MM:ss',         // optional, format for %time\n        dtimeFormat: 'yyyy-mm-dd HH:MM:ss' // optional, format for %dtime\n    }\n}\n```\n\nWhere `fields` is an array of variables to include to resulting json.\n`pretty` is indicator that you want pretty-printed multi-line json.\n`stringifyMessage` means that we want stringify message array instead\nof pushing it as JSON subtree.\nAdditionally, you can customize date and time formats using `dateFormat`, `timeFormat`, and `dtimeFormat` options.\n\n\n##### Custom Formatters\nFeature will be added soon.\n\n\n#### Appenders\nAppender is a destination of where log output will go.\n\n##### Appender Overrides\nYou can override logging level and formatter of any appender options:\n```javascript\n{\n    type: '\u003ctype\u003e',\n    level: 'INFO', // optional, will override default logger level\n    options: {\n        formatter: { /* ... */ } // optional\n    }\n}\n```\n\n##### Stdout Appender\n```javascript\n{\n    type: 'stdout',\n    options: {\n        formatter: { /* ... */ } // optional\n    }\n}\n```\n\n##### File Appender\n```javascript\n{\n    type: 'file',\n    options: {\n        path: '/tmp/out.log',\n        rollingSize: '100kb', // max size of file before rolling\n        formatter: { /* ... */ } // optional\n    }\n}\n```\nWhere `path (string)` is path to log output file,\nand `rollingSize (string)` is a maximum output file size before it will be rolled. Unlimited by default.\nPossible units are: b, kb, mb, gb.\n\n##### Redis Appender\nWhen using Redis Appenders messages would be PUBLISHed to `loginator:\u003cnamespace\u003e` channel.\n\n```javascript\n{\n    type: 'redis',\n    options: {\n\n        // redis client configuration\n        host: 'localhost',\n        port: 6379,\n        options: {},\n\n        // other\n        namespace: 'default',\n        formatter: { /* ... */ }, // optional\n        shareConnection: false    // optional Share redis connection between namespaces (since 0.0.26)\n    }\n}\n```\nWhere `host`, `port` and `options` are redis configuration params.\n`shareConnection` option enables internal cache of redis clients, so that multiple instances of\nthe redis appender with the same `host` and `port` will use one redis client.\n\n##### Web Appender\nWhen using Web appender, messages would be sent over http/https as request body to the specified URL.\nFor an example, see `tests/web.js`.\n\n```javascript\n{\n    type: 'web',\n    options: {\n\n        // request configuration\n        url: 'http://some.url.com/log',\n        method: 'POST', // optional, default GET\n        headers: {},    // optional\n\n        // other\n        formatter: { /* ... */ } // optional\n    }\n}\n```\n\n##### Custom Appenders\nYou can register you custom appender and then use it in configuration in the\nsame way as build-in appenders.\n\nTo do so you need to inherit you custom appender from `loginator.BaseAppender` first\noverriding `performWrite` and (optionally) `close` functions.\n\nCheckout `tests/custom/customAppender.js` for custom appender example and\n`tests/registerAppender.js` file for it's usage.\n\n##### Custom Formatters\nWill come soon...\n\n#### Custom Variables \u0026 Bound Loggers\nBound logger is logger that inherits all base logger instence properties and\noverrides custom variables.\n\n```javascript\nvar log = loginator.createLogger({\n    customVars: {\n        'myVar': 'nothing'\n    },\n    formatter: {\n        type: 'text',\n        options: {\n            pattern: '%dtime (%myVar): %message',\n            dateFormat: 'yyyy-mm-dd',\n            timeFormat: 'HH:MM:ss',\n            dtimeFormat: 'yyyy-mm-dd HH:MM:ss'\n        }\n    }\n});\n\nvar boundLog = log.bind({\n    'myVar': 'MY1'\n});\n\nvar boundLog2 = log.bind({\n    'myVar': 'MY2'\n});\n\nlog.info('Not bound');\n// -\u003e 2015-03-29 05:41:50 (nothing): Not bound\n\nboundLog.info('Bound 1');\n// -\u003e 2015-03-29 05:41:50 (MY1): Bound 1\n\nboundLog2.info('Bound 2');\n// -\u003e 2015-03-29 05:41:50 (MY2): Bound 2\n\n```\n\n#### Reusing Appenders\nFor example, you want to create several logs sharing the same appender (this is common in case\nof file), not forcing to open stream (for file appenders) or connection (for redis appenders) several times.\nIn this can you can create appender and then reuse it in several loggers. In this case you'll pass\nappender instance insteof of configuration object to `logger.appenders` array.\n\n```javascript\nvar loginator = require('loginator');\n\nvar stdoutAppender = loginator.createAppender({\n    type: 'stdout'\n});\n\nvar log = loginator.createLogger({\n    name: 'log',\n    appenders: [\n        stdoutAppender\n    ]\n});\n\nvar log2 = loginator.createLogger({\n    name: 'log2',\n    appenders: [\n        stdoutAppender\n    ]\n});\n\nlog.debug('Hello world!');\n// -\u003e 2015-03-30 03:48:49 [DEBUG] [node] (log) : Hello world!\n\nlog2.debug('Bye world!');\n// -\u003e 2015-03-30 03:48:49 [DEBUG] [node] (log2) : Bye world!\n```\n\n#### Examples\nSee `tests` directory for examples.\n\n#### Tests\n```bash\n$ sudo npm install nodeunit -g\n$ npm test\n```\n\n#### Author\n* [Yaroslav Pogrebnyak](https://github.com/yyyar/)\n\n#### License\nMIT\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyyyar%2Floginator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyyyar%2Floginator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyyyar%2Floginator/lists"}