AgentStack
What is this?
- Application Stack for Enterprise Applications
What is this actually???
-
Read configuration from
conf/settings.yml
-
Merge configuration from
conf/${NODE_ENV}.yml
,conf/${NODE_ENV}.local.yml
and environment variables. (if have) - Print merged configuration on application start
-
Do not print sensitive configuration name with
_KEY
,_PASSWORD
,_SECRET
or_TOKEN
postfix -
Auto create missing dir if the configuration name ends with
_DIR
. (e.g. LOG_DIR folder) -
Provide a
app.settings
object for application to access the final configuration -
Configuration with
_DIR
or_FILE
will resolve to absolute path automatically -
Provide a
app.logger
object for application to use, available transporters: Console, File or Webhook -
Provide nested error object
Exception
which will concat all the stacktrace for nested errors - When transporter itself got errors. It will automatically fallback to another available transporter
-
Log nodejs process events
beforeExit
,exit
,warning
,uncaughtException
,unhandledPromiseRejection
-
Trap linux signals
SIGHUP
,SIGINT
,SIGQUIT
,SIGTERM
- Provide minimal system monitoring; disk full, memory full, cpu full or network error
Why doing this?
- Because the things above is required for most enterprise applications. It should be shared across projects.
- It's very important. But it's not as important as application logic. It can save your time to bootstrap a new project.
- The same structure will make DevOps happy when doing deployment/monitoring on many projects. It should be standardized.
- Together with Agent Framework; it can be automatically inject into other classes when required. It should be easy to use.
Installation
npm install agentstack --save
OR
yarn add agentstack
Show me the code
import { Application } from 'agentstack';
const app = new Application();
// enable config, logger support
app.init(); // default, same with `app.init({ confDir: 'conf', root: process.cwd() })`
// or
app.init({ confDir: 'settings' }); // if your configuration folder is not 'conf'
// or
app.init({ confDir: 'settings', root: '/usr/share/myapp' }); // if your root folder is not current working folder
console.log(app.settings);
app.logger.info('Hi, I am agent stack'); // the log will be automatically save in `LOG_DIR` folder
or if you prefer using factory function instead of 'new'
import { CreateApplication } from 'agentstack';
var app = CreateApplication();
// or
var app = CreateApplication({ confDir: 'settings' });
// or
var app = CreateApplication({ confDir: 'settings', root: '/usr/share/myapp' });
console.log(app.settings);
app.logger.info('Hi, I am agent stack'); // the log will be automatically save in `LOG_DIR` folder in JSON format
Others
How do I rotate log files?
Consider we output our logs to /usr/share/myapp/logs/agent.log
We would rotate our log files with logrotate, by adding the following to /etc/logrotate.d/myapp
:
/usr/share/myapp/logs/agent.log {
su root
daily
rotate 7
delaycompress
compress
notifempty
missingok
copytruncate
}