diff --git a/agent.js b/agent.js new file mode 100644 index 0000000..43c9203 --- /dev/null +++ b/agent.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = agent => { + // reload logger to new fd after rotating + agent.messenger.on('log-reload', () => { + agent.loggers.reload('got log-reload message'); + agent.coreLogger.info('[egg-logrotator] agent logger reload: got log-reload message'); + }); +}; diff --git a/app.js b/app.js new file mode 100644 index 0000000..d4982bc --- /dev/null +++ b/app.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = app => { + // reload logger to new fd after rotating + app.messenger.on('log-reload', () => { + app.loggers.reload('got log-reload message'); + app.coreLogger.info('[egg-logrotator] app logger reload: got log-reload message'); + }); +}; diff --git a/test/fixtures/logger-reload/agent.js b/test/fixtures/logger-reload/agent.js new file mode 100644 index 0000000..6b822f2 --- /dev/null +++ b/test/fixtures/logger-reload/agent.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = agent => { + agent.coreLogger.warn('agent warn'); + agent.coreLogger.error('agent error'); +}; diff --git a/test/fixtures/logger-reload/app/router.js b/test/fixtures/logger-reload/app/router.js new file mode 100644 index 0000000..473ceb0 --- /dev/null +++ b/test/fixtures/logger-reload/app/router.js @@ -0,0 +1,22 @@ +'use strict'; + +const path = require('path'); + + +module.exports = app => { + app.get('/log', function* () { + this.logger.warn('%s %s', this.method, this.path); + this.logger.error(new Error('error')); + this.body = { + method: this.method, + path: this.path, + }; + }); + + app.get('/rotate', function* () { + const schedule = path.join(__dirname, '../../../../app/schedule/rotate_by_file'); + console.log(schedule); + yield app.runSchedule(schedule); + this.body = 'done'; + }); +}; diff --git a/test/fixtures/logger-reload/package.json b/test/fixtures/logger-reload/package.json new file mode 100644 index 0000000..f767e3a --- /dev/null +++ b/test/fixtures/logger-reload/package.json @@ -0,0 +1,3 @@ +{ + "name": "logger-reload" +} diff --git a/test/logrotator.test.js b/test/logrotator.test.js index 2d6a73e..9d4dbee 100644 --- a/test/logrotator.test.js +++ b/test/logrotator.test.js @@ -5,6 +5,8 @@ const mm = require('egg-mock'); const fs = require('fs'); const glob = require('glob'); const moment = require('moment'); +const request = require('supertest'); + require('should'); @@ -239,6 +241,59 @@ describe('test/logrotator.test.js', () => { }); }); + describe('reload logger', () => { + let app; + const baseDir = path.join(__dirname, 'fixtures/logger-reload'); + before(() => { + app = mm.cluster({ + baseDir: 'logger-reload', + }); + return app.ready(); + }); + // logging to files + before(() => { + return request(app.callback()) + .get('/log') + .expect({ + method: 'GET', + path: '/log', + }) + .expect(200); + }); + // start rotating + before(() => { + return request(app.callback()) + .get('/rotate') + .expect(200); + }); + + after(() => app.close()); + + it('should reload worker loggers', function* () { + yield sleep(2000); + + const logname = moment().subtract(1, 'days').format('.YYYY-MM-DD'); + const logfile1 = path.join(baseDir, 'logs/logger-reload/logger-reload-web.log'); + const content1 = fs.readFileSync(logfile1, 'utf8'); + content1.should.equal(''); + + const logfile2 = path.join(baseDir, `logs/logger-reload/logger-reload-web.log${logname}`); + const content2 = fs.readFileSync(logfile2, 'utf8'); + content2.should.containEql('GET /'); + + const logfile3 = path.join(baseDir, `logs/logger-reload/egg-agent.log${logname}`); + const content3 = fs.readFileSync(logfile3, 'utf8'); + content3.should.containEql('agent warn'); + + yield request(app.callback()) + .get('/log') + .expect(200); + + // will logging to new file + const content4 = fs.readFileSync(logfile1, 'utf8'); + content4.should.containEql('GET /'); + }); + }); }); function sleep(ms) {