{"id":15013413,"url":"https://github.com/veliovgroup/meteor-logger-file","last_synced_at":"2026-05-31T23:00:48.154Z","repository":{"id":27252900,"uuid":"30725263","full_name":"veliovgroup/Meteor-logger-file","owner":"veliovgroup","description":"🔖 Meteor Logging: Store application log messages into file (FS)","archived":false,"fork":false,"pushed_at":"2026-05-31T21:16:03.000Z","size":92,"stargazers_count":24,"open_issues_count":1,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-05-31T21:20:36.648Z","etag":null,"topics":["file-logs","filesystem","javascript","log-file","logger","logging","meteor","meteor-package","meteorjs"],"latest_commit_sha":null,"homepage":"https://atmospherejs.com/ostrio/loggerfile","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veliovgroup.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"dr-dimitru","custom":"https://paypal.me/veliovgroup"}},"created_at":"2015-02-12T21:38:35.000Z","updated_at":"2026-05-31T21:16:07.000Z","dependencies_parsed_at":"2022-09-01T19:01:05.223Z","dependency_job_id":null,"html_url":"https://github.com/veliovgroup/Meteor-logger-file","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/veliovgroup/Meteor-logger-file","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veliovgroup%2FMeteor-logger-file","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veliovgroup%2FMeteor-logger-file/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veliovgroup%2FMeteor-logger-file/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veliovgroup%2FMeteor-logger-file/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veliovgroup","download_url":"https://codeload.github.com/veliovgroup/Meteor-logger-file/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veliovgroup%2FMeteor-logger-file/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33752286,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["file-logs","filesystem","javascript","log-file","logger","logging","meteor","meteor-package","meteorjs"],"created_at":"2024-09-24T19:44:15.247Z","updated_at":"2026-05-31T23:00:48.147Z","avatar_url":"https://github.com/veliovgroup.png","language":"JavaScript","funding_links":["https://github.com/sponsors/dr-dimitru","https://paypal.me/veliovgroup"],"categories":[],"sub_categories":[],"readme":"[![support](https://img.shields.io/badge/support-GitHub-white)](https://github.com/sponsors/dr-dimitru)\n[![support](https://img.shields.io/badge/support-PayPal-white)](https://paypal.me/veliovgroup)\n\u003ca href=\"https://ostr.io/info/built-by-developers-for-developers\"\u003e\n  \u003cimg src=\"https://ostr.io/apple-touch-icon-60x60.png\" height=\"20\"\u003e\n\u003c/a\u003e\n\n# Logging: To File\n\nFile adapter for [logger driver](https://github.com/veliovgroup/Meteor-logger). Store application log messages (from both *Client* and *Server*) in the file. By default log file is rotated daily, you can easily adjust it to hourly, monthly, or any other period, via `fileNameFormat`.\n\n*Whenever you log message(s) on Client or Sever, it goes directly to a log file on your Server.*\n\nFeatures:\n\n- 🤓 Support Windows, Linux, and MacOS environments;\n- 👷‍♂️ 100% tests coverage;\n- 💪 Flexible log level filters;\n- 👨‍💻 `userId` is automatically passed and logged, data is associated with logged-in user;\n- 📟 Pass logs from *Client* to *Server*;\n- 🕷 Catch all browser's errors and exceptions.\n\n## Installation:\n\n```shell\nmeteor add ostrio:logger # If not yet installed\nmeteor add ostrio:loggerfile\n```\n\n### Compatibility\n\n- Meteor **2.14–3.4**\n- Meteor 3 requires `ostrio:logger` **≥ 2.2.0**\n\n### Agent skill\n\n```bash\nnpx skills add veliovgroup/Meteor-logger --skill meteor-logger -g\n```\n\nCovers `ostrio:logger` and all adapters.\n\n## ES6 Import:\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n```\n\n## FAQ:\n\n- __Q__: Where to find the log file?\n  - __A__: On dev stage: `/static/logs`. On prod stage: `/assets/app/logs`. Change this behavior with `options.path` (*see below*)\n- __Q__: Log files are gone, why?\n  - __A__: __All logs will be removed as soon as your application rebuilds or you run__ `meteor reset`. To keep your logs persistent during development use an absolute `path` outside of your project folder, e.g. `/logs` directory. Make sure selected directory is writable by node/meteor's process owner\n- __Q__: Meteor Up / Docker — folder exists but no `.log` files?\n  - __A__: Use an **absolute** path outside the bundle (e.g. `/var/log/myapp`), not `./logs/` relative to the server process. Enable `debug: true` to print the resolved path at startup. Handle failures with `onError` (*see below*)\n\n## Usage\n\nInitialize `Logger` instance and pass it into `LoggerInstance` constructor to enable logging into the log file.\n\n### Initialization [*Isomorphic*]\n\n`new LoggerFile(LoggerInstance, options)`\n\n- `LoggerInstance` {*Logger*} - from `new Logger()`\n- `options` {*Object*}\n- `options.path` {*String*} - Log directory. Prefer an **absolute** path (e.g. `/data/logs`) in production; relative paths resolve against the Node process CWD (Meteor Up: often `programs/server` inside the bundle). Do not use `~`\n- `options.debug` {*Boolean*} - If `true`, log resolved `path` to stdout after the write test succeeds (default: `false`)\n- `options.onError` {*Function*} - `(error, context) =\u003e void` — called on `mkdir`, `writeTest`, or `appendFile` failures (`context` is one of those strings). Default: `console.error`\n- `options.fileNameFormat` {*Function*} - Log file name, use to adjust file creation frequency, arguments:\n  - `time` {*Date*}\n- `options.format` {*Function*} - Log record format, arguments:\n  - `time` {*Date*}\n  - `level` {*String*} - 'ERROR', 'FATAL', 'WARN', 'DEBUG', 'INFO', 'TRACE'\n  - `message` {*String*}\n  - `data` {*Object*}\n  - `userId` {*String*} - set if user is logged in and package `accounts-base` is installed\n  - __Note:__ Do not forget `\\r\\n` at the end of record-line\n\n#### Example:\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n// Initialize Logger:\nconst log = new Logger();\n// Initialize and enable LoggerFile with default settings:\n(new LoggerFile(log)).enable();\n```\n\n#### Example 2:\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n// Initialize Logger:\nconst log = new Logger();\n\n// Initialize LoggerFile:\nconst logFile = new LoggerFile(log, {\n  fileNameFormat(time) {\n    // Create/Rotate log-files hourly\n    return `${time.getDate()}-${time.getMonth() + 1}-${time.getFullYear()}_${time.getHours()}.log`;\n  },\n  format(time, level, message, data, userId) {\n    // Omit Date and hours from messages\n    return `[${level}] | ${time.getMinutes()}:${time.getSeconds()} | ${message}' | User: ${userId}\\n`;\n  },\n  path: '/data/logs/', // Absolute path (recommended for production / MUP)\n  debug: true,\n  onError(error, context) {\n    console.error('[LoggerFile]', context, error);\n  }\n});\n\n// Enable LoggerFile with default settings\nlogFile.enable();\n```\n\n### Activate and set adapter settings: [*Isomorphic*]\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n\nconst log = new Logger();\n(new LoggerFile(log)).enable({\n  enable: true,\n  filter: ['ERROR', 'FATAL', 'WARN'], // Filters: 'ERROR', 'FATAL', 'WARN', 'DEBUG', 'INFO', 'TRACE', '*'\n  client: true, // Set to `false` to avoid Client to Server logs transfer\n  server: true  // Allow logging on server\n});\n```\n\n### Log message: [*Isomorphic*]\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n\nconst log = new Logger();\n(new LoggerFile(log)).enable();\n\n/*\n  message {String} - Any text message\n  data    {Object} - [optional] Any additional info as object\n  userId  {String} - [optional] Current user id\n */\nlog.info(message, data, userId);\nlog.debug(message, data, userId);\nlog.error(message, data, userId);\nlog.fatal(message, data, userId);\nlog.warn(message, data, userId);\nlog.trace(message, data, userId);\nlog._(message, data, userId); // Shortcut\n\n// Use with throw\nthrow log.error(message, data, userId);\n```\n\n### Catch-all Client's errors example: [*Client*]\n\n```js\n/* Store original window.onerror */\nconst _GlobalErrorHandler = window.onerror;\n\nwindow.onerror = function (msg, url, line) {\n  log.error(msg, {file: url, onLine: line});\n  if (_GlobalErrorHandler) {\n    _GlobalErrorHandler.apply(this, arguments);\n  }\n};\n```\n\n### Catch-all Server's errors example: [*Server*]\n\n```js\nconst bound = Meteor.bindEnvironment((callback) =\u003e {callback();});\nprocess.on('uncaughtException', (err) =\u003e {\n  bound(() =\u003e {\n    log.error('Server Crashed!', err);\n    console.error(err.stack);\n    process.exit(7);\n  });\n});\n```\n\n### Catch-all Meteor's errors example: [*Server*]\n\n```js\n// store original Meteor error\nconst originalMeteorDebug = Meteor._debug;\nMeteor._debug = function (message, stack) {\n  const error = new Error(message);\n  error.stack = stack;\n  log.error('Meteor Error!', error);\n  return originalMeteorDebug.apply(this, arguments);\n};\n```\n\n### Use multiple logger(s) with different settings:\n\n```js\nimport { Logger } from 'meteor/ostrio:logger';\nimport { LoggerFile } from 'meteor/ostrio:loggerfile';\n\nconst log1 = new Logger();\nconst log2 = new Logger();\n\n(new LoggerFile(log1)).enable();\n\n(new LoggerFile(log2, {\n  fileNameFormat(time) {\n    return (time.getDate()) + '-' + (time.getMonth() + 1) + '-' + (time.getFullYear()) + '_' + (time.getHours()) + '.log';\n  },\n  format(time, level, message, data, userId) {\n    return `[${level}] | ${time.getMinutes()}:${time.getSeconds()} | ${message}' | User: ${userId}\\n`;\n  },\n  path: '/data/logs/'\n})).enable();\n```\n\n## Running Tests\n\n1. Clone this package\n2. In Terminal (*Console*) go to directory where package is cloned\n3. Then run:\n\n### Meteor/Tinytest\n\n```shell\nmeteor test-packages ./\n```\n\n## Support this awesome package:\n\n- Star on [GitHub](https://github.com/veliovgroup/Meteor-logger-file)\n- Star on [Atmosphere](https://atmospherejs.com/ostrio/loggerfile)\n- [Tweet](https://twitter.com/share?url=https://github.com/veliovgroup/Meteor-logger-file\u0026text=Store%20%23meteorjs%20log%20messages%20in%20the%20file%20%23javascript%20%23programming%20%23webdev%20via%20%40veliovgroup)\n- Share on [Facebook](https://www.facebook.com/sharer.php?u=https://github.com/veliovgroup/Meteor-logger-file)\n\n## Support our open source contribution:\n\n- [Sponsor via GitHub](https://github.com/sponsors/dr-dimitru)\n- [Support via PayPal](https://paypal.me/veliovgroup)\n- Use [ostr.io](https://ostr.io) — [Monitoring](https://snmp-monitoring.com), [Analytics](https://ostr.io/info/web-analytics), [WebSec](https://domain-protection.info), [Web-CRON](https://web-cron.info) and [Pre-rendering](https://prerendering.com) for a website\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveliovgroup%2Fmeteor-logger-file","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveliovgroup%2Fmeteor-logger-file","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveliovgroup%2Fmeteor-logger-file/lists"}