Improve logging with Winston

This commit is contained in:
Mike Rode
2019-09-09 22:05:33 -05:00
parent f25d163878
commit b7cc195a97
6 changed files with 50 additions and 54 deletions

View File

@@ -1,4 +1,5 @@
var appRoot = require('app-root-path');
import { inspect } from 'util';
import path from 'path';
const { createLogger, format, transports } = require('winston');
const {
@@ -7,27 +8,32 @@ const {
label,
prettyPrint,
colorize,
json,
printf,
splat,
errors,
simple,
} = format;
function formatParams(info) {
let { timestamp, level, message, label, ...args } = info;
const ts = timestamp.slice(0, 19).replace('T', ' ');
if (!label) label = 'App';
return `${ts} ${label} ${level}: ${message} ${
Object.keys(args).length ? JSON.stringify(args, '', '') : ''
}`;
}
const prettyJson = format.printf(info => {
if (info.message.constructor === Object) {
info.message = inspect(info.message, {
depth: 3,
colors: true,
});
}
return `WINSTON: ${info.timestamp} ${info.level}: ${info.message}`;
});
const logger = createLogger({
level: 'debug',
level: 'info',
format: combine(
colorize(),
prettyPrint(),
json(),
errors({ stack: true }),
splat(),
label(),
timestamp(),
printf(formatParams),
simple(),
prettyJson,
),
transports: [
new transports.File({ filename: `${appRoot}/logs/app.log` }),
@@ -38,7 +44,7 @@ const logger = createLogger({
logger.stream = {
write: function(message, encoding) {
logger.info(message, { label: 'HTTP' });
logger.info(message, { level: 'HTTP' });
},
};

View File

@@ -4,7 +4,6 @@ import { json, urlencoded } from 'body-parser';
import passport from 'passport';
import cookieSession from 'cookie-session';
import cookieParser from 'cookie-parser';
import morgan from 'morgan';
import morganBody from 'morgan-body';
import models from './db/models';
import keys from '../config';
@@ -31,25 +30,20 @@ export default () => {
// Returns middleware that parses json
server.use(json());
server.use(urlencoded({ extended: true }));
morganBody(server);
morganBody(server, {
stream: winston.stream,
});
server.use(cookieParser(keys.server.cookieKey));
server.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [keys.server.cookieKey],
}),
);
server.use(cookieParser(keys.server.cookieKey));
server.use(passport.initialize());
server.use(passport.session());
server.use(
morgan(
'Method: :method URL: :url Status: :status Content Length: :res[content-length] Request Header: :req[header] Response Header: :res[header] Response Time: :response-time ms',
{ stream: winston.stream },
),
);
// Set up routes
server.use('/api/plex', plex);
server.use('/api/tdaw', tdaw);

View File

@@ -2,8 +2,22 @@ import axios from 'axios';
import parser from 'xml2json';
import buildUrlPackage from 'build-url';
import logger from '../../config/winston';
import { inspect } from 'util';
const formatResponse = response => {
logger.info(
`API request url: ${response.config.method} ${inspect(
response.config.url,
)}`,
);
logger.info(
`API response status: ${inspect(
response.status,
)} API response length: ${inspect(
response.headers['content-length'],
)}`,
);
logger.silly(`API response data: ${inspect(response.data)}`);
const xmlResponse = response.headers['content-type'].includes(
'xml',
);
@@ -29,8 +43,6 @@ const buildUrl = function(urlParams) {
delete params.host;
const urlHash = params;
console.log('hash', urlHash);
if (typeof urlHash !== 'object') {
throw new Error(`Invalid urlParams: ${urlHash}`);
}
@@ -41,31 +53,29 @@ const buildUrl = function(urlParams) {
};
const request = async function(url) {
console.log('Request URL', url);
return new Promise((resolve, reject) => {
const httpClient = axios;
httpClient
.get(url)
.then(response => {
logger.info(response);
return resolve(formatResponse(response));
})
.catch(error => {
if (error.response) {
console.log('Error: Response --', error.response);
console.log('Error: Status--', error.response.status);
console.log('Error: Headers--', error.response.headers);
logger.error(`Error: Status --, ${error.response.status}`);
logger.error(
`Error: Headers --, ${error.response.headers}`,
);
logger.error(`Error: Response --, ${error.response}`);
return reject(error.response);
}
if (error.request) {
// eslint-disable-next-line no-underscore-dangle
console.log(error);
console.log(
'Error: Request Path--',
error.request._options.path,
logger.error(
`Error request path: ${error.request._options.path} ${error}`,
);
} else {
console.log('Error:', error.message);
logger.error(`Error: ${error.message}`);
}
return reject(error);
});
@@ -73,7 +83,7 @@ const request = async function(url) {
};
const handleError = (res, method) => err => {
console.log('Error in', method);
logger.error(`Error in ${method}`);
const { code, message } = err.responseData || {
code: 500,
message: 'An unknown error occurred.',

View File

@@ -101,11 +101,7 @@ const importMostWatched = async (req, res) => {
};
const importAll = async (req, res) => {
console.log(
'Beginning to import all data for req.user',
req.user.email,
req.user.id,
);
logger.info(`Beginning to import all data for ${req.user.email}`);
try {
await importData.importSections(req.user);
await importData.importLibraries(req.user);

View File

@@ -1,6 +1,6 @@
import config from '../../../config';
import helpers from '../helpers';
import logger from '../../../config/winston';
const getUsers = async function(user) {
try {
const urlParams = getUsersUrlParams(user);
@@ -97,6 +97,7 @@ const getMostWatched = async function(
return [];
}
} catch (error) {
logger('getMostWatched plexAPI', error);
console.log('getMostWatched plexAPI error', error);
return {
code: error.status,

View File

@@ -1,19 +1,8 @@
import chai from 'chai';
import chaiHttp from 'chai-http';
chai.use(chaiHttp);
var expect = require('chai').expect;
import models from './../../server/db/models';
import app from '../../index';
const agent = chai.request.agent(app);
const createUserWithNoPin = () => {
return models.User.create({
email: 'testuser@email.com',
password: 'password',
});
};
export const authorizedAgent = async email => {
var agent = chai.request.agent(app);
const res = await agent