mirror of
https://github.com/mjrode/WhatToWatch.git
synced 2025-12-30 01:59:39 -06:00
Improve logging with Winston
This commit is contained in:
@@ -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' });
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user