Skip to content

Commit e3ed429

Browse files
committed
Imporved logger
1 parent 5ae4d6e commit e3ed429

File tree

12 files changed

+85
-51
lines changed

12 files changed

+85
-51
lines changed

.dockerignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
2-
github
2+
github
3+
public

.gitignore

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
node_modules/
2-
data/
1+
node_modules
2+
data
3+
public

Socket.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
const WebSocket = require('ws');
2+
const Logger = require('./utils/Logger');
3+
const logger = new Logger();
24

35
class Socket {
46
constructor(server) {
57
this.webSocketServer = new WebSocket.Server({ server })
68

79
this.webSocketServer.on('listening', () => {
8-
console.log('Socket: listen');
10+
logger.log('Socket: listen');
911
})
1012

1113
this.webSocketServer.on('connection', (webSocketClient) => {

client/.env

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
REACT_APP_VERSION=1.4.1
1+
REACT_APP_VERSION=1.4.2

client/src/components/Settings/StyleSettings/StyleSettings.tsx

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
import { useState, useEffect, ChangeEvent, FormEvent } from 'react';
22
import axios from 'axios';
33

4+
// Redux
5+
import { connect } from 'react-redux';
6+
import { createNotification } from '../../../store/actions';
7+
8+
// Typescript
9+
import { ApiResponse, NewNotification } from '../../../interfaces';
10+
11+
// UI
412
import InputGroup from '../../UI/Forms/InputGroup/InputGroup';
513
import Button from '../../UI/Buttons/Button/Button';
6-
import { ApiResponse } from '../../../interfaces';
714

8-
const StyleSettings = (): JSX.Element => {
15+
interface ComponentProps {
16+
createNotification: (notification: NewNotification) => void;
17+
}
18+
19+
const StyleSettings = (props: ComponentProps): JSX.Element => {
920
const [customStyles, setCustomStyles] = useState<string>('');
1021

1122
useEffect(() => {
1223
axios.get<ApiResponse<string>>('/api/config/0/css')
1324
.then(data => setCustomStyles(data.data.data))
14-
.catch(err => console.log(err));
25+
.catch(err => console.log(err.response));
1526
}, [])
1627

1728
const inputChangeHandler = (e: ChangeEvent<HTMLTextAreaElement>) => {
@@ -22,7 +33,14 @@ const StyleSettings = (): JSX.Element => {
2233
const formSubmitHandler = (e: FormEvent) => {
2334
e.preventDefault();
2435

25-
axios.put<ApiResponse<{}>>('/api/config/0/css', { styles: customStyles });
36+
axios.put<ApiResponse<{}>>('/api/config/0/css', { styles: customStyles })
37+
.then(() => {
38+
props.createNotification({
39+
title: 'Success',
40+
message: 'CSS saved. Reload page to see changes'
41+
})
42+
})
43+
.catch(err => console.log(err.response));
2644
}
2745

2846
return (
@@ -34,11 +52,12 @@ const StyleSettings = (): JSX.Element => {
3452
name='customStyles'
3553
value={customStyles}
3654
onChange={(e) => inputChangeHandler(e)}
55+
spellCheck={false}
3756
></textarea>
3857
</InputGroup>
3958
<Button>Save CSS</Button>
4059
</form>
4160
)
4261
}
4362

44-
export default StyleSettings;
63+
export default connect(null, { createNotification })(StyleSettings);

db.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const { Sequelize } = require('sequelize');
2+
const Logger = require('./utils/Logger');
3+
const logger = new Logger();
24

35
const sequelize = new Sequelize({
46
dialect: 'sqlite',
@@ -9,17 +11,18 @@ const sequelize = new Sequelize({
911
const connectDB = async () => {
1012
try {
1113
await sequelize.authenticate();
12-
console.log('Connected to database');
14+
logger.log('Connected to database');
15+
16+
const syncModels = false;
1317

14-
const syncModels = true;
15-
1618
if (syncModels) {
17-
console.log('Starting model synchronization');
19+
logger.log('Starting model synchronization');
1820
await sequelize.sync({ alter: true });
19-
console.log('All models were synchronized');
21+
logger.log('All models were synchronized');
2022
}
2123
} catch (error) {
22-
throw new Error(`Unable to connect to the database: ${error.message}`);
24+
logger.log(`Unable to connect to the database: ${error.message}`, 'ERROR');
25+
process.exit(1);
2326
}
2427
}
2528

middleware/errorHandler.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const ErrorResponse = require('../utils/ErrorResponse');
22
const colors = require('colors');
3+
const Logger = require('../utils/Logger');
4+
const logger = new Logger();
35

46
const errorHandler = (err, req, res, next) => {
57
let error = { ...err };
@@ -10,8 +12,7 @@ const errorHandler = (err, req, res, next) => {
1012
// error = new ErrorResponse(`Field ${msg}`, 400);
1113
// }
1214

13-
console.log(error);
14-
console.log(`${err}`);
15+
logger.log(error.message.split(',')[0], 'ERROR');
1516

1617
res.status(err.statusCode || 500).json({
1718
success: false,

server.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const Socket = require('./Socket');
77
const Sockets = require('./Sockets');
88
const associateModels = require('./models/associateModels');
99
const initConfig = require('./utils/initConfig');
10+
const Logger = require('./utils/Logger');
11+
const logger = new Logger();
1012

1113
const PORT = process.env.PORT || 5005;
1214

@@ -24,6 +26,6 @@ const PORT = process.env.PORT || 5005;
2426
Sockets.registerSocket('weather', weatherSocket);
2527

2628
server.listen(PORT, () => {
27-
console.log(`Server is running on port ${PORT} in ${process.env.NODE_ENV} mode`);
29+
logger.log(`Server is running on port ${PORT} in ${process.env.NODE_ENV} mode`);
2830
})
2931
})();

utils/Logger.js

+27-28
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,39 @@
1-
const fs = require('fs');
2-
31
class Logger {
4-
constructor() {
5-
this.logFileHandler();
2+
log(message, level = 'INFO') {
3+
console.log(`[${this.generateTimestamp()}] [${level}] ${message}`)
64
}
75

8-
logFileHandler() {
9-
if (!fs.existsSync('./flame.log')) {
10-
fs.writeFileSync('./flame.log', '');
11-
} else {
12-
console.log('file exists');
13-
}
14-
}
6+
generateTimestamp() {
7+
const d = new Date();
158

16-
writeLog(logMsg, logType) {
9+
// Date
10+
const year = d.getFullYear();
11+
const month = this.parseDate(d.getMonth() + 1);
12+
const day = this.parseDate(d.getDate());
1713

18-
}
14+
// Time
15+
const hour = this.parseDate(d.getHours());
16+
const minutes = this.parseDate(d.getMinutes());
17+
const seconds = this.parseDate(d.getSeconds());
18+
const miliseconds = this.parseDate(d.getMilliseconds(), true);
1919

20-
generateLog(logMsg, logType) {
21-
const now = new Date();
22-
const date = `${this.parseNumber(now.getDate())}-${this.parseNumber(now.getMonth() + 1)}-${now.getFullYear()}`;
23-
const time = `${this.parseNumber(now.getHours())}:${this.parseNumber(now.getMinutes())}:${this.parseNumber(now.getSeconds())}.${now.getMilliseconds()}`;
24-
const log = `[${date} ${time}]: ${logType} ${logMsg}`;
25-
return log;
26-
// const timestamp = new Date().toISOString();
20+
// Timezone
21+
const tz = -d.getTimezoneOffset() / 60;
22+
23+
return `${year}-${month}-${day} ${hour}:${minutes}:${seconds}.${miliseconds} UTC${tz > 0 ? '+' + tz : tz}`;
2724
}
2825

29-
parseNumber(number) {
30-
if (number > 9) {
31-
return number;
32-
} else {
33-
return `0${number}`;
26+
parseDate(date, ms = false) {
27+
if (ms) {
28+
if (date >= 10 && date < 100) {
29+
return `0${date}`;
30+
} else if (date < 10) {
31+
return `00${date}`;
32+
}
3433
}
34+
35+
return date < 10 ? `0${date}` : date.toString();
3536
}
3637
}
3738

38-
// console.log(logger.generateLog('testMsg', 'INFO'));
39-
40-
module.exports = new Logger();
39+
module.exports = Logger;

utils/clearWeatherData.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const { Op } = require('sequelize');
22
const Weather = require('../models/Weather');
3+
const Logger = require('./Logger');
4+
const logger = new Logger();
35

46
const clearWeatherData = async () => {
57
const weather = await Weather.findOne({
@@ -16,7 +18,7 @@ const clearWeatherData = async () => {
1618
})
1719
}
1820

19-
console.log('Old weather data was deleted');
21+
logger.log('Old weather data was deleted');
2022
}
2123

2224
module.exports = clearWeatherData;

utils/initConfig.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const { Op } = require('sequelize');
22
const Config = require('../models/Config');
33
const { config } = require('./initialConfig.json');
4+
const Logger = require('./Logger');
5+
const logger = new Logger();
46

57
const initConfig = async () => {
68
// Get config values
@@ -26,7 +28,7 @@ const initConfig = async () => {
2628
}
2729
})
2830

29-
console.log('Initial config created');
31+
logger.log('Initial config created');
3032
return;
3133
}
3234

utils/jobs.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ const schedule = require('node-schedule');
22
const getExternalWeather = require('./getExternalWeather');
33
const clearWeatherData = require('./clearWeatherData');
44
const Sockets = require('../Sockets');
5+
const Logger = require('./Logger');
6+
const logger = new Logger();
57

68
// Update weather data every 15 minutes
79
const weatherJob = schedule.scheduleJob('updateWeather', '0 */15 * * * *', async () => {
810
try {
911
const weatherData = await getExternalWeather();
10-
console.log('weather updated');
12+
logger.log('Weather updated');
1113
Sockets.getSocket('weather').socket.send(JSON.stringify(weatherData));
1214
} catch (err) {
13-
console.log(err.message);
15+
logger.log(err.message, 'ERROR');
1416
}
1517
})
1618

0 commit comments

Comments
 (0)