Skip to content

Commit 4bc66b9

Browse files
authored
refactor: logging [BREAKING CHANGE] (#749)
* feat(option): logger * refactor(router, path-rewriter): log with debug [BREAKING CHANGE] * refactor(logger): log request and response with logger plugin * refactor(logger): replace logLevel and logProvider with logger option [BREAKING CHANGE]
1 parent 33f9f5a commit 4bc66b9

21 files changed

+211
-683
lines changed

README.md

+7-30
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ _All_ `http-proxy` [options](https://github.com/nodejitsu/node-http-proxy#option
7373
- [`pathRewrite` (object/function)](#pathrewrite-objectfunction)
7474
- [`router` (object/function)](#router-objectfunction)
7575
- [`plugins` (Array)](#plugins-array)
76-
- [`logLevel` (string)](#loglevel-string)
77-
- [`logProvider` (function)](#logprovider-function)
76+
- [`logger` (Object)](#logger-object)
7877
- [`http-proxy` events](#http-proxy-events)
7978
- [`http-proxy` options](#http-proxy-options)
8079
- [WebSocket](#websocket)
@@ -287,38 +286,16 @@ const config = {
287286
};
288287
```
289288

290-
### `logLevel` (string)
289+
### `logger` (Object)
291290

292-
Default: `'info'`
291+
Configure a logger to output information from http-proxy-middleware: ie. `console`, `winston`, `pino`, `bunyan`, `log4js`, etc...
293292

294-
Values: ['debug', 'info', 'warn', 'error', 'silent'].
295-
296-
### `logProvider` (function)
297-
298-
Modify or replace log provider. Default: `console`.
299-
300-
```javascript
301-
// simple replace
302-
function logProvider(provider) {
303-
// replace the default console log provider.
304-
return require('winston');
305-
}
306-
```
293+
See also logger recipes ([recipes/logger.md](https://github.com/chimurai/http-proxy-middleware/blob/master/recipes/logger.md)) for more details.
307294

308295
```javascript
309-
// verbose replacement
310-
function logProvider(provider) {
311-
const logger = new (require('winston').Logger)();
312-
313-
const myCustomProvider = {
314-
log: logger.log,
315-
debug: logger.debug,
316-
info: logger.info,
317-
warn: logger.warn,
318-
error: logger.error,
319-
};
320-
return myCustomProvider;
321-
}
296+
createProxyMiddleware({
297+
logger: console,
298+
});
322299
```
323300

324301
## `http-proxy` events

cspell.json

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"nextjs",
2929
"Nodejitsu",
3030
"ntlm",
31+
"pino",
3132
"proxied",
3233
"proxying",
3334
"rawbody",

examples/browser-sync/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const jsonPlaceholderProxy = createProxyMiddleware({
1111
target: 'http://jsonplaceholder.typicode.com',
1212
pathFilter: '/users',
1313
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
14-
logLevel: 'debug',
14+
logger: console,
1515
});
1616

1717
/**

examples/express/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const jsonPlaceholderProxy = createProxyMiddleware({
1111
target: 'http://jsonplaceholder.typicode.com/users',
1212
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
1313
logLevel: 'debug',
14+
logger: console,
1415
});
1516

1617
const app = express();

examples/response-interceptor/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ const jsonPlaceholderProxy = createProxyMiddleware({
6464
return JSON.stringify(favoriteFoods);
6565
}),
6666
},
67-
logLevel: 'debug',
67+
logger: console,
6868
});
6969

7070
const app = express();

examples/websocket/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const wsProxy = createProxyMiddleware({
1515
// },
1616
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
1717
ws: true, // enable websocket proxy
18-
logLevel: 'debug',
18+
logger: console,
1919
});
2020

2121
const app = express();

recipes/logLevel.md

+3-39
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,5 @@
1-
# Log Level
1+
# [BREAKING CHANGE]
22

3-
Control the amount of logging of http-proxy-middleware.
3+
This functionality is removed in v3.
44

5-
Possible values:
6-
7-
- `debug`
8-
- `info`
9-
- `warn` (default)
10-
- `error`
11-
- `silent`
12-
13-
## Level: debug
14-
15-
Log everything.
16-
17-
```javascript
18-
const { createProxyMiddleware } = require('http-proxy-middleware');
19-
20-
const options = {
21-
target: 'http://localhost:3000',
22-
logLevel: 'debug',
23-
};
24-
25-
const apiProxy = createProxyMiddleware(options);
26-
```
27-
28-
## Level: silent
29-
30-
Suppress all logging.
31-
32-
```javascript
33-
const { createProxyMiddleware } = require('http-proxy-middleware');
34-
35-
const options = {
36-
target: 'http://localhost:3000',
37-
logLevel: 'silent',
38-
};
39-
40-
const apiProxy = createProxyMiddleware(options);
41-
```
5+
See [logger.md](logger.md) for logging in v3.

recipes/logProvider.md

+3-74
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,5 @@
1-
# Log Provider
1+
# [BREAKING CHANGE]
22

3-
Configure your own logger with the `logProvider` option.
3+
This functionality is removed in v3.
44

5-
In this example [winston](https://www.npmjs.com/package/winston) is configured to do the actual logging.
6-
7-
```javascript
8-
const winston = require('winston');
9-
const { createProxyMiddleware } = require('http-proxy-middleware');
10-
11-
const options = {
12-
target: 'http://localhost:3000',
13-
logProvider: function (provider) {
14-
return winston;
15-
},
16-
};
17-
18-
const apiProxy = createProxyMiddleware(options);
19-
```
20-
21-
## Winston
22-
23-
Configure your own logger with the `logProvider` option.
24-
25-
In this example [winston](https://www.npmjs.com/package/winston) is configured to do the actual logging. Map the logging api if needed.
26-
27-
```javascript
28-
const winston = require('winston');
29-
const { createProxyMiddleware } = require('http-proxy-middleware');
30-
31-
const logProvider = function (provider) {
32-
return {
33-
log: winston.log,
34-
debug: winston.debug,
35-
info: winston.info,
36-
warn: winston.warn,
37-
error: winston.error,
38-
};
39-
};
40-
41-
const options = {
42-
target: 'http://localhost:3000',
43-
logProvider: logProvider,
44-
};
45-
46-
const apiProxy = createProxyMiddleware(options);
47-
```
48-
49-
# Winston Multi Transport
50-
51-
Configure your own logger with the `logProvider` option.
52-
53-
In this example [winston](https://www.npmjs.com/package/winston) is configured to do the actual logging.
54-
55-
```javascript
56-
const winston = require('winston');
57-
const { createProxyMiddleware } = require('http-proxy-middleware');
58-
59-
const logProvider = function (provider) {
60-
const logger = new winston.Logger({
61-
transports: [
62-
new winston.transports.Console(),
63-
new winston.transports.File({ filename: 'some-file.log' }),
64-
],
65-
});
66-
67-
return logger;
68-
};
69-
70-
const options = {
71-
target: 'http://localhost:3000',
72-
logProvider: logProvider,
73-
};
74-
75-
const apiProxy = createProxyMiddleware(options);
76-
```
5+
See [logger.md](logger.md) for logging in v3.

recipes/logger.md

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Logger
2+
3+
Configure a logger to output information from http-proxy-middleware: ie. `console`, `winston`, `pino`, `bunyan`, `log4js`, etc...
4+
5+
## `console`
6+
7+
```javascript
8+
const { createProxyMiddleware } = require('http-proxy-middleware');
9+
10+
const proxy = createProxyMiddleware({
11+
target: 'http://localhost:3000',
12+
logger: console,
13+
});
14+
```
15+
16+
## `winston`
17+
18+
<https://github.com/winstonjs/winston> ![GitHub Repo stars](https://img.shields.io/github/stars/winstonjs/winston?style=social) ![winston downloads](https://img.shields.io/npm/dm/winston)
19+
20+
```javascript
21+
const { createProxyMiddleware } = require('http-proxy-middleware');
22+
const winston = require('winston');
23+
const { format, transports } = require('winston');
24+
25+
// Enable interpolation in log messages
26+
// https://github.com/winstonjs/winston#string-interpolation
27+
const logger = winston.createLogger({
28+
format: format.combine(format.splat(), format.simple()),
29+
transports: [new transports.Console()],
30+
});
31+
32+
const proxy = createProxyMiddleware({
33+
target: 'http://localhost:3000',
34+
logger,
35+
});
36+
```
37+
38+
## `pino`
39+
40+
<https://github.com/pinojs/pino> ![GitHub Repo stars](https://img.shields.io/github/stars/pinojs/pino?style=social) ![winston downloads](https://img.shields.io/npm/dm/pino)
41+
42+
```javascript
43+
const { createProxyMiddleware } = require('http-proxy-middleware');
44+
const pino = require('pino');
45+
46+
const logger = pino();
47+
48+
const proxy = createProxyMiddleware({
49+
target: 'http://localhost:3000',
50+
logger,
51+
});
52+
```
53+
54+
## `log4js`
55+
56+
<https://github.com/log4js-node/log4js-node> ![GitHub Repo stars](https://img.shields.io/github/stars/log4js-node/log4js-node?style=social) ![winston downloads](https://img.shields.io/npm/dm/log4js)
57+
58+
```javascript
59+
const { createProxyMiddleware } = require('http-proxy-middleware');
60+
const log4js = require('log4js');
61+
62+
const logger = log4js.getLogger();
63+
logger.level = 'debug';
64+
65+
const proxy = createProxyMiddleware({
66+
target: 'http://localhost:3000',
67+
logger,
68+
});
69+
```
70+
71+
## `bunyan`
72+
73+
<https://github.com/trentm/node-bunyan> ![GitHub Repo stars](https://img.shields.io/github/stars/trentm/node-bunyan?style=social) ![winston downloads](https://img.shields.io/npm/dm/bunyan)
74+
75+
```javascript
76+
const { createProxyMiddleware } = require('http-proxy-middleware');
77+
const bunyan = require('bunyan');
78+
79+
const logger = bunyan.createLogger({
80+
name: 'my-app',
81+
});
82+
83+
const proxy = createProxyMiddleware({
84+
target: 'http://localhost:3000',
85+
logger,
86+
});
87+
```

src/configuration.ts

-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,8 @@
11
import { ERRORS } from './errors';
2-
import { getInstance } from './logger';
32
import { Options } from './types';
43

5-
const logger = getInstance();
6-
74
export function verifyConfig(options: Options): void {
8-
configureLogger(options);
9-
105
if (!options.target && !options.router) {
116
throw new Error(ERRORS.ERR_CONFIG_FACTORY_TARGET_MISSING);
127
}
138
}
14-
15-
function configureLogger(options: Options): void {
16-
if (options.logLevel) {
17-
logger.setLevel(options.logLevel);
18-
}
19-
20-
if (options.logProvider) {
21-
logger.setProvider(options.logProvider);
22-
}
23-
}

0 commit comments

Comments
 (0)