ostrio:loggermongo

v2.0.0Published 7 years ago

This package has not had recent updates. Please investigate it's current state before committing to using it in your project.

Logging: To MongoDB

MongoDB adapter for logger driver. Store application's logs and messages in MongoDB.

Whenever you log message(s) on Client or Sever, it goes directly into MongoDB.

Features:

  • 100% tests coverage;
  • Flexible log level filters;
  • userId is automatically passed and logged if logs is associated with logged-in user;
  • Pass logs from Client to MongoDB on Server;
  • Catch all browser's errors.

Installation:

meteor add ostrio:logger # If not yet installed
meteor add ostrio:loggermongo

ES6 Import:

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';

Support this awesome package:

Usage

Initialization [Isomorphic]

new LoggerMongo(LoggerInstance, options)

  • LoggerInstance {Logger} - from new Logger()
  • options {Object}
  • options.format {Function} - Must return plain object, which will be used as log-record. Arguments:
    • opts {Object}
    • opts.userId {String}
    • opts.date {Date} - Report date
    • opts.timestamp {Number} - Report timestamp in milliseconds
    • opts.level {String} - Message level, one of: ERROR, FATAL, WARN, DEBUG, INFO, TRACE, *
    • opts.message {String} - Report message
    • opts.additional {Object} - Additional info passed as object
  • options.collection {Mongo.Collection} - Use to pass your own MongoDB collection instance, {Mongo.Collection} returned from new Mongo.Collection()
  • options.collectionName {String} - MongoDB collection name, default: ostrioMongoLogger
  • Note: You can't pass both collection and collectionName simultaneously. Set only one of those options. If both options is presented collection is more prioritized

Example:

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4// Initialize Logger:
5const log = new Logger();
6
7// Initialize and enable LoggerMongo with default settings:
8(new LoggerMongo(log)).enable();

Example 2:

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4// Initialize Logger:
5const log = new Logger();
6const AppLogs = new Mongo.Collection('AppLogs');
7
8// Initialize LoggerMongo with collection instance:
9const LogMongo = new LoggerMongo(log, {
10  collection: AppLogs
11});
12
13// Enable LoggerMongo with default settings:
14LogMongo.enable();

Example 3:

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4// Initialize Logger:
5const log = new Logger();
6
7// Initialize LoggerMongo with custom collection name:
8const LogMongo = new LoggerMongo(log, {
9  collectionName: 'AppLogs'
10});
11
12// Enable LoggerMongo with default settings:
13LogMongo.enable();

Activate with custom adapter settings: [Isomorphic]

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4const log = new Logger();
5(new LoggerMongo(log)).enable({
6  enable: true,
7  filter: ['ERROR', 'FATAL', 'WARN'], // Filters: 'ERROR', 'FATAL', 'WARN', 'DEBUG', 'INFO', 'TRACE', '*'
8  client: true, // Set to `false` to avoid Client to Server logs transfer
9  server: true  // Allow logging on Server
10});

Logging Collection Schema:

1({
2  userId: {
3    type: String
4  },
5  date: {
6    type: Date
7  },
8  timestamp: {
9    type: Number
10  },
11  level: {
12    type: String
13  },
14  message: {
15    type: String
16  },
17  additional: {
18    type: Object
19  }
20});

Set custom indexes on collection: [Server]

Read more at: ensureIndex docs

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4const log = new Logger();
5const LogMongo = new LoggerMongo(log, {
6  collectionName: 'AppLogs' // Use custom collection name
7});
8
9if (Meteor.isServer) {
10  LogMongo.collection._ensureIndex({level: 1}, {background: true});
11  LogMongo.collection._ensureIndex({userId: 1}, {background: true});
12  LogMongo.collection._ensureIndex({date: 1}, {background: true});
13  LogMongo.collection._ensureIndex({timestamp: 1}, {background: true});
14}

Log message: [Isomorphic]

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4const log = new Logger();
5(new LoggerMongo(log)).enable();
6
7/*
8  message {String} - Any text message
9  data    {Object} - [optional] Any additional info as object
10  userId  {String} - [optional] Current user id
11 */
12log.info(message, data, userId);
13log.debug(message, data, userId);
14log.error(message, data, userId);
15log.fatal(message, data, userId);
16log.warn(message, data, userId);
17log.trace(message, data, userId);
18log._(message, data, userId); // Shortcut
19
20// Use with throw
21throw log.error(message, data, userId);

Catch-all Client's errors example: [Client]

1/* Store original window.onerror */
2const _GlobalErrorHandler = window.onerror;
3
4window.onerror = (msg, url, line) => {
5  log.error(msg, {file: url, onLine: line});
6  if (_GlobalErrorHandler) {
7    _GlobalErrorHandler.apply(this, arguments);
8  }
9};

Use multiple logger(s) with different settings: [Isomorphic]

1import { Logger }      from 'meteor/ostrio:logger';
2import { LoggerMongo } from 'meteor/ostrio:loggermongo';
3
4const log1 = new Logger();
5const log2 = new Logger();
6
7/* 
8 * Separate settings and collection
9 * for info, debug and other messages
10 */
11(new LoggerMongo(log1, {
12  collectionName: 'AppLogs'
13})).enable({
14  filter: ['DEBUG', 'INFO', 'LOG', 'TRACE'],
15  client: true,
16  server: true
17});
18
19/* 
20 * Separate settings and collection
21 * for errors, exceptions, warnings and etc.
22 */
23(new LoggerMongo(log2, {
24  collectionName: 'AppErrors'
25})).enable({
26  filter: ['ERROR', 'FATAL', 'WARN'],
27  client: true,
28  server: true
29});