**src/assets/config.json**:
-| Key | Value(s) | Default Value | Value type | Description |
-| -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| supervisionUrls | | [] | string \| string[] | string or array of global connection URIs to OCPP-J servers |
-| supervisionUrlDistribution | round-robin/random/charging-station-affinity | charging-station-affinity | boolean | supervision urls distribution policy to simulated charging stations |
-| logStatisticsInterval | | 60 | integer | seconds between charging stations statistics output in the logs |
-| logEnabled | true/false | true | boolean | enable logging |
-| logConsole | true/false | false | boolean | output logs on the console |
-| logFormat | | simple | string | [winston](https://github.com/winstonjs/winston) log format |
-| logRotate | true/false | true | boolean | enable daily log files rotation |
-| logMaxFiles | x/"xd" where x is an integer | undefined | integer \| string | maximum number of log files: https://github.com/winstonjs/winston-daily-rotate-file#options |
-| logMaxSize | x/"xk"/"xm"/"xg" where x is a number | undefined | number \| string | maximum size of log files in bytes, or units of kb, mb, and gb: https://github.com/winstonjs/winston-daily-rotate-file#options |
-| logLevel | emerg/alert/crit/error/warning/notice/info/debug | info | string | [winston](https://github.com/winstonjs/winston) logging level |
-| logFile | | combined.log | string | log file relative path |
-| logErrorFile | | error.log | string | error log file relative path |
-| worker | | {<br />"processType": "workerSet",<br />"startDelay": 500,<br />"elementStartDelay": 0,<br />"elementsPerWorker": 1,<br />"poolMinSize": 4,<br />"poolMaxSize": 16,<br />"poolStrategy": "ROUND_ROBIN"<br />} | {<br />processType: WorkerProcessType;<br />startDelay: number;<br />elementStartDelay: number;<br />elementsPerWorker: number;<br />poolMinSize: number;<br />poolMaxSize: number;<br />poolStrategy: WorkerChoiceStrategy;<br />} | Worker configuration section:<br />- processType: worker threads process type (workerSet/staticPool/dynamicPool)<br />- startDelay: milliseconds to wait at worker threads startup (only for workerSet threads process type)<br />- elementStartDelay: milliseconds to wait at charging station startup<br />- elementsPerWorker: number of charging stations per worker threads for the `workerSet` process type<br />- poolMinSize: worker threads pool minimum number of threads</br >- poolMaxSize: worker threads pool maximum number of threads<br />- poolStrategy: worker threads pool [poolifier](https://github.com/poolifier/poolifier) worker choice strategy |
-| uiServer | | {<br />"enabled": false,<br />"type": "ws",<br />"options": {<br />"host": "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled: boolean;<br />type: ApplicationProtocol;<br />options: ServerOptions;<br />authentication: {<br />enabled: boolean;<br />type: AuthenticationType;<br />username: string;<br />password: string;<br />}<br />} | UI server configuration section |
-| performanceStorage | | {<br />"enabled": false,<br />"type": "jsonfile",<br />"file:///performanceRecords.json"<br />} | {<br />enabled: boolean;<br />type: string;<br />URI: string;<br />}<br />where type can be 'jsonfile' or 'mongodb' | performance storage configuration section |
-| stationTemplateUrls | | {}[] | {<br />file: string;<br />numberOfStations: number;<br />}[] | array of charging station configuration templates URIs configuration section (charging station configuration template file name and number of stations) |
+| Key | Value(s) | Default Value | Value type | Description |
+| -------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| supervisionUrls | | [] | string \| string[] | string or array of global connection URIs to OCPP-J servers |
+| supervisionUrlDistribution | round-robin/random/charging-station-affinity | charging-station-affinity | string | supervision urls distribution policy to simulated charging stations |
+| log | | {<br />"enabled": true,<br />"file": "logs/combined.log",<br />"errorFile": "logs/error.log",<br />"statisticsInterval": 60,<br />"level": "info",<br />"console": false,<br />"format": "simple",<br />"rotate": true<br />} | {<br />enabled: boolean;<br />file: string;<br />errorFile: string;<br />statisticsInterval: number;<br />level: string;<br />console: boolean;<br />format: string;<br />rotate: boolean;<br />maxFiles: string \| number;<br />maxSize: string \| number;<br />} | Log configuration section:<br />- enabled: enable logging<br />- file: log file relative path<br />- errorFile: error log file relative path<br />- statisticsInterval: seconds between charging stations statistics output in the logs<br />- level: emerg/alert/crit/error/warning/notice/info/debug [winston](https://github.com/winstonjs/winston) logging level</br >- console: output logs on the console<br />- format: [winston](https://github.com/winstonjs/winston) log format<br />- rotate: enable daily log files rotation<br />- maxFiles: maximum number of log files: https://github.com/winstonjs/winston-daily-rotate-file#options<br />- maxSize: maximum size of log files in bytes, or units of kb, mb, and gb: https://github.com/winstonjs/winston-daily-rotate-file#options |
+| worker | | {<br />"processType": "workerSet",<br />"startDelay": 500,<br />"elementStartDelay": 0,<br />"elementsPerWorker": 1,<br />"poolMinSize": 4,<br />"poolMaxSize": 16,<br />"poolStrategy": "ROUND_ROBIN"<br />} | {<br />processType: WorkerProcessType;<br />startDelay: number;<br />elementStartDelay: number;<br />elementsPerWorker: number;<br />poolMinSize: number;<br />poolMaxSize: number;<br />poolStrategy: WorkerChoiceStrategy;<br />} | Worker configuration section:<br />- processType: worker threads process type (workerSet/staticPool/dynamicPool)<br />- startDelay: milliseconds to wait at worker threads startup (only for workerSet threads process type)<br />- elementStartDelay: milliseconds to wait at charging station startup<br />- elementsPerWorker: number of charging stations per worker threads for the `workerSet` process type<br />- poolMinSize: worker threads pool minimum number of threads</br >- poolMaxSize: worker threads pool maximum number of threads<br />- poolStrategy: worker threads pool [poolifier](https://github.com/poolifier/poolifier) worker choice strategy |
+| uiServer | | {<br />"enabled": false,<br />"type": "ws",<br />"options": {<br />"host": "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled: boolean;<br />type: ApplicationProtocol;<br />options: ServerOptions;<br />authentication: {<br />enabled: boolean;<br />type: AuthenticationType;<br />username: string;<br />password: string;<br />}<br />} | UI server configuration section |
+| performanceStorage | | {<br />"enabled": false,<br />"type": "jsonfile",<br />"file:///performanceRecords.json"<br />} | {<br />enabled: boolean;<br />type: string;<br />URI: string;<br />}<br />where type can be 'jsonfile' or 'mongodb' | performance storage configuration section |
+| stationTemplateUrls | | {}[] | {<br />file: string;<br />numberOfStations: number;<br />}[] | array of charging station configuration templates URIs configuration section (charging station configuration template file name and number of stations) |
#### Worker process model
ApplicationProtocol,
type ConfigurationData,
FileType,
+ type LogConfiguration,
type StationTemplateUrl,
type StorageConfiguration,
StorageType,
Configuration.configurationChangeCallback = cb;
}
- public static getLogStatisticsInterval(): number | undefined {
- Configuration.warnDeprecatedConfigurationKey(
- 'statisticsDisplayInterval',
- undefined,
- "Use 'logStatisticsInterval' instead"
- );
- // Read conf
- return Utils.hasOwnProp(Configuration.getConfig(), 'logStatisticsInterval')
- ? Configuration.getConfig()?.logStatisticsInterval
- : Constants.DEFAULT_LOG_STATISTICS_INTERVAL;
- }
-
public static getUIServer(): UIServerConfiguration {
if (Utils.hasOwnProp(Configuration.getConfig(), 'uiWebSocketServer')) {
console.error(
return Configuration.getConfig()?.stationTemplateUrls;
}
+ public static getLog(): LogConfiguration {
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logEnabled',
+ undefined,
+ "Use 'log' section to define the logging enablement instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logFile',
+ undefined,
+ "Use 'log' section to define the log file instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logErrorFile',
+ undefined,
+ "Use 'log' section to define the log error file instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logConsole',
+ undefined,
+ "Use 'log' section to define the console logging enablement instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logStatisticsInterval',
+ undefined,
+ "Use 'log' section to define the log statistics interval instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logLevel',
+ undefined,
+ "Use 'log' section to define the log level instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logFormat',
+ undefined,
+ "Use 'log' section to define the log format instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logRotate',
+ undefined,
+ "Use 'log' section to define the log rotation instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logMaxFiles',
+ undefined,
+ "Use 'log' section to define the log maximum files instead"
+ );
+ Configuration.warnDeprecatedConfigurationKey(
+ 'logMaxSize',
+ undefined,
+ "Use 'log' section to define the log maximum size instead"
+ );
+ const defaultLogConfiguration: LogConfiguration = {
+ enabled: true,
+ file: 'logs/combined.log',
+ errorFile: 'logs/error.log',
+ statisticsInterval: Constants.DEFAULT_LOG_STATISTICS_INTERVAL,
+ level: 'info',
+ format: 'simple',
+ rotate: true,
+ };
+ const deprecatedLogConfiguration: LogConfiguration = {
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logEnabled') && {
+ enabled: Configuration.getConfig()?.logEnabled,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logFile') && {
+ file: Configuration.getConfig()?.logFile,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logErrorFile') && {
+ errorFile: Configuration.getConfig()?.logErrorFile,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logStatisticsInterval') && {
+ statisticsInterval: Configuration.getConfig()?.logStatisticsInterval,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logLevel') && {
+ level: Configuration.getConfig()?.logLevel,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logConsole') && {
+ console: Configuration.getConfig()?.logConsole,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logFormat') && {
+ format: Configuration.getConfig()?.logFormat,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logRotate') && {
+ rotate: Configuration.getConfig()?.logRotate,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logMaxFiles') && {
+ maxFiles: Configuration.getConfig()?.logMaxFiles,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'logMaxSize') && {
+ maxSize: Configuration.getConfig()?.logMaxSize,
+ }),
+ };
+ const logConfiguration: LogConfiguration = {
+ ...defaultLogConfiguration,
+ ...deprecatedLogConfiguration,
+ ...Configuration.getConfig()?.log,
+ };
+ return logConfiguration;
+ }
+
public static getWorker(): WorkerConfiguration {
Configuration.warnDeprecatedConfigurationKey(
'useWorkerPool',
undefined,
"Use 'worker' section to define the worker pool strategy instead"
);
- let workerConfiguration: WorkerConfiguration = {
- processType: Utils.hasOwnProp(Configuration.getConfig(), 'workerProcess')
- ? Configuration.getConfig()?.workerProcess
- : WorkerProcessType.workerSet,
- startDelay: Utils.hasOwnProp(Configuration.getConfig(), 'workerStartDelay')
- ? Configuration.getConfig()?.workerStartDelay
- : WorkerConstants.DEFAULT_WORKER_START_DELAY,
- elementsPerWorker: Utils.hasOwnProp(Configuration.getConfig(), 'chargingStationsPerWorker')
- ? Configuration.getConfig()?.chargingStationsPerWorker
- : WorkerConstants.DEFAULT_ELEMENTS_PER_WORKER,
- elementStartDelay: Utils.hasOwnProp(Configuration.getConfig(), 'elementStartDelay')
- ? Configuration.getConfig()?.elementStartDelay
- : WorkerConstants.DEFAULT_ELEMENT_START_DELAY,
- poolMinSize: Utils.hasOwnProp(Configuration.getConfig(), 'workerPoolMinSize')
- ? Configuration.getConfig()?.workerPoolMinSize
- : WorkerConstants.DEFAULT_POOL_MIN_SIZE,
- poolMaxSize: Utils.hasOwnProp(Configuration.getConfig(), 'workerPoolMaxSize')
- ? Configuration.getConfig()?.workerPoolMaxSize
- : WorkerConstants.DEFAULT_POOL_MAX_SIZE,
- poolStrategy:
- Configuration.getConfig()?.workerPoolStrategy ?? WorkerChoiceStrategies.ROUND_ROBIN,
+ const defaultWorkerConfiguration: WorkerConfiguration = {
+ processType: WorkerProcessType.workerSet,
+ startDelay: WorkerConstants.DEFAULT_WORKER_START_DELAY,
+ elementsPerWorker: WorkerConstants.DEFAULT_ELEMENTS_PER_WORKER,
+ elementStartDelay: WorkerConstants.DEFAULT_ELEMENT_START_DELAY,
+ poolMinSize: WorkerConstants.DEFAULT_POOL_MIN_SIZE,
+ poolMaxSize: WorkerConstants.DEFAULT_POOL_MAX_SIZE,
+ poolStrategy: WorkerChoiceStrategies.ROUND_ROBIN,
+ };
+ const deprecatedWorkerConfiguration: WorkerConfiguration = {
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'workerProcess') && {
+ processType: Configuration.getConfig()?.workerProcess,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'workerStartDelay') && {
+ startDelay: Configuration.getConfig()?.workerStartDelay,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'chargingStationsPerWorker') && {
+ elementsPerWorker: Configuration.getConfig()?.chargingStationsPerWorker,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'elementStartDelay') && {
+ elementStartDelay: Configuration.getConfig()?.elementStartDelay,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'workerPoolMinSize') && {
+ poolMinSize: Configuration.getConfig()?.workerPoolMinSize,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'workerPoolMaxSize') && {
+ poolMaxSize: Configuration.getConfig()?.workerPoolMaxSize,
+ }),
+ ...(Utils.hasOwnProp(Configuration.getConfig(), 'workerPoolStrategy') && {
+ poolStrategy:
+ Configuration.getConfig()?.workerPoolStrategy ?? WorkerChoiceStrategies.ROUND_ROBIN,
+ }),
+ };
+ const workerConfiguration: WorkerConfiguration = {
+ ...defaultWorkerConfiguration,
+ ...deprecatedWorkerConfiguration,
+ ...Configuration.getConfig()?.worker,
};
- if (Utils.hasOwnProp(Configuration.getConfig(), 'worker')) {
- workerConfiguration = { ...workerConfiguration, ...Configuration.getConfig()?.worker };
- }
return workerConfiguration;
}
return Configuration.getWorker().processType === WorkerProcessType.dynamicPool;
}
- public static getLogEnabled(): boolean | undefined {
- return Utils.hasOwnProp(Configuration.getConfig(), 'logEnabled')
- ? Configuration.getConfig()?.logEnabled
- : true;
- }
-
- public static getLogConsole(): boolean | undefined {
- Configuration.warnDeprecatedConfigurationKey(
- 'consoleLog',
- undefined,
- "Use 'logConsole' instead"
- );
- return Utils.hasOwnProp(Configuration.getConfig(), 'logConsole')
- ? Configuration.getConfig()?.logConsole
- : false;
- }
-
- public static getLogFormat(): string | undefined {
- return Utils.hasOwnProp(Configuration.getConfig(), 'logFormat')
- ? Configuration.getConfig()?.logFormat
- : 'simple';
- }
-
- public static getLogRotate(): boolean | undefined {
- return Utils.hasOwnProp(Configuration.getConfig(), 'logRotate')
- ? Configuration.getConfig()?.logRotate
- : true;
- }
-
- public static getLogMaxFiles(): number | string | false | undefined {
- return (
- Utils.hasOwnProp(Configuration.getConfig(), 'logMaxFiles') &&
- Configuration.getConfig()?.logMaxFiles
- );
- }
-
- public static getLogMaxSize(): number | string | false | undefined {
- return (
- Utils.hasOwnProp(Configuration.getConfig(), 'logMaxFiles') &&
- Configuration.getConfig()?.logMaxSize
- );
- }
-
- public static getLogLevel(): string | undefined {
- return Utils.hasOwnProp(Configuration.getConfig(), 'logLevel')
- ? Configuration.getConfig()?.logLevel?.toLowerCase()
- : 'info';
- }
-
- public static getLogFile(): string | undefined {
- return Utils.hasOwnProp(Configuration.getConfig(), 'logFile')
- ? Configuration.getConfig()?.logFile
- : 'combined.log';
- }
-
- public static getLogErrorFile(): string | undefined {
- Configuration.warnDeprecatedConfigurationKey(
- 'errorFile',
- undefined,
- "Use 'logErrorFile' instead"
- );
- return Utils.hasOwnProp(Configuration.getConfig(), 'logErrorFile')
- ? Configuration.getConfig()?.logErrorFile
- : 'error.log';
- }
-
public static getSupervisionUrls(): string | string[] | undefined {
Configuration.warnDeprecatedConfigurationKey(
'supervisionURLs',
import { Utils } from './Utils';
let transports: transport[];
-if (Configuration.getLogRotate() === true) {
- const logMaxFiles = Configuration.getLogMaxFiles();
- const logMaxSize = Configuration.getLogMaxSize();
+if (Configuration.getLog().rotate === true) {
+ const logMaxFiles = Configuration.getLog().maxFiles;
+ const logMaxSize = Configuration.getLog().maxSize;
transports = [
new DailyRotateFile({
filename: Utils.insertAt(
- Configuration.getLogErrorFile(),
+ Configuration.getLog().errorFile,
'-%DATE%',
- Configuration.getLogErrorFile()?.indexOf('.log')
+ Configuration.getLog().errorFile?.indexOf('.log')
),
level: 'error',
...(logMaxFiles && { maxFiles: logMaxFiles }),
}),
new DailyRotateFile({
filename: Utils.insertAt(
- Configuration.getLogFile(),
+ Configuration.getLog().file,
'-%DATE%',
- Configuration.getLogFile()?.indexOf('.log')
+ Configuration.getLog().file?.indexOf('.log')
),
...(logMaxFiles && { maxFiles: logMaxFiles }),
...(logMaxSize && { maxSize: logMaxSize }),
];
} else {
transports = [
- new TransportType.File({ filename: Configuration.getLogErrorFile(), level: 'error' }),
- new TransportType.File({ filename: Configuration.getLogFile() }),
+ new TransportType.File({ filename: Configuration.getLog().errorFile, level: 'error' }),
+ new TransportType.File({ filename: Configuration.getLog().file }),
];
}
export const logger = createLogger({
- silent: !Configuration.getLogEnabled(),
- level: Configuration.getLogLevel(),
- format: format.combine(format.splat(), (format[Configuration.getLogFormat()] as FormatWrap)()),
+ silent: !Configuration.getLog().enabled,
+ level: Configuration.getLog().level,
+ format: format.combine(format.splat(), (format[Configuration.getLog().format] as FormatWrap)()),
transports,
});
// If enabled, log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
-if (Configuration.getLogConsole()) {
+if (Configuration.getLog().console) {
logger.add(
new TransportType.Console({
format: format.combine(
format.splat(),
- (format[Configuration.getLogFormat()] as FormatWrap)()
+ (format[Configuration.getLog().format] as FormatWrap)()
),
})
);