day_rotator.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use strict';
  2. const path = require('path');
  3. const moment = require('moment');
  4. const fs = require('mz/fs');
  5. const debug = require('debug')('egg-logrotator:day_rotator');
  6. const Rotator = require('./rotator');
  7. const utils = require('../../utils');
  8. // rotate log by day
  9. // rename from foo.log to foo.log.YYYY-MM-DD
  10. class DayRotator extends Rotator {
  11. constructor(options) {
  12. super(options);
  13. this.filesRotateBySize = this.app.config.logrotator.filesRotateBySize || [];
  14. this.filesRotateByHour = this.app.config.logrotator.filesRotateByHour || [];
  15. }
  16. async getRotateFiles() {
  17. const files = new Map();
  18. const logDir = this.app.config.logger.dir;
  19. const loggers = this.app.loggers;
  20. const loggerFiles = utils.walkLoggerFile(loggers);
  21. loggerFiles.forEach(file => {
  22. // support relative path
  23. if (!path.isAbsolute(file)) file = path.join(logDir, file);
  24. this._setFile(file, files);
  25. });
  26. // Should rotate agent log, because schedule is running under app worker,
  27. // agent log is the only differece between app worker and agent worker.
  28. // - app worker -> egg-web.log
  29. // - agent worker -> egg-agent.log
  30. const agentLogName = this.app.config.logger.agentLogName;
  31. this._setFile(path.join(logDir, agentLogName), files);
  32. // rotateLogDirs is deprecated
  33. const rotateLogDirs = this.app.config.logger.rotateLogDirs;
  34. if (rotateLogDirs && rotateLogDirs.length > 0) {
  35. this.app.deprecate('[egg-logrotator] Do not use app.config.logger.rotateLogDirs, only rotate core loggers and custom loggers');
  36. for (const dir of rotateLogDirs) {
  37. const exists = await fs.exists(dir);
  38. if (!exists) continue;
  39. try {
  40. const names = await fs.readdir(dir);
  41. for (const name of names) {
  42. if (!name.endsWith('.log')) {
  43. continue;
  44. }
  45. this._setFile(path.join(dir, name), files);
  46. }
  47. } catch (err) {
  48. this.logger.error(err);
  49. }
  50. }
  51. }
  52. return files;
  53. }
  54. _setFile(srcPath, files) {
  55. // don't rotate logPath in filesRotateBySize
  56. if (this.filesRotateBySize.indexOf(srcPath) > -1) {
  57. return;
  58. }
  59. // don't rotate logPath in filesRotateByHour
  60. if (this.filesRotateByHour.indexOf(srcPath) > -1) {
  61. return;
  62. }
  63. if (!files.has(srcPath)) {
  64. // allow 2 minutes deviation
  65. const targetPath = srcPath + moment()
  66. .subtract(23, 'hours')
  67. .subtract(58, 'minutes')
  68. .format('.YYYY-MM-DD');
  69. debug('set file %s => %s', srcPath, targetPath);
  70. files.set(srcPath, { srcPath, targetPath });
  71. }
  72. }
  73. }
  74. module.exports = DayRotator;