Skip to content

Commit e1300ea

Browse files
authored
Merge pull request #18 from J-Hoplin/version/2.0.8
2.0.8
2 parents 3c48bf7 + 73872bc commit e1300ea

File tree

8 files changed

+215
-255
lines changed

8 files changed

+215
-255
lines changed

Readme.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,24 @@
2020
```
2121
pnpm install puppeteer @hoplin/puppeteer-pool
2222
```
23+
<details>
24+
<summary><b>Patch Note</b></summary>
25+
<div markdown="1">
26+
27+
### Release 2.0.8
28+
29+
- Remove pino logger dependency and implement custom logger
30+
- You can config `log level` and `enable log` in `PuppeteerPool.start` function
31+
- Enhanced Concurrency Control
32+
33+
### Next Features in 2.0.9
34+
35+
- Detailed Metrics Monitoring
36+
- Monitor metrics by context
37+
- Support to use Playwright instead of Puppeteer
38+
39+
</div>
40+
</details>
2341

2442
## Fully changed from 2.0.0
2543

@@ -49,10 +67,17 @@ After that you can use dispatcher to control pool manager.
4967
- number
5068
- contextMode: ContextMode
5169
- Required
52-
- ContextMode.ISOLATED | ContextMode.SHARED
70+
- `ContextMode.ISOLATED` | `ContextMode.SHARED`
71+
- enableLog: boolean
72+
- Optional
73+
- Default: `true`
74+
- logLevel: LogLevel
75+
- Optional
76+
- Default: `LogLevel.DEBUG`
5377
- options
5478
- Optional
5579
- [puppeteer.LaunchOptions](https://pptr.dev/api/puppeteer.launchoptions)
80+
- Default: `{}`
5681
- customConfigPath
5782
- Optional
5883
- string (Default: `puppeteer-pool-config.json` in project root)

package.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hoplin/puppeteer-pool",
3-
"version": "2.0.7",
3+
"version": "2.0.8",
44
"main": "dist/index.js",
55
"description": "Puppeteer Pool Manager for worker server, process daemon, commands etc...",
66
"repository": "https://github.com/J-Hoplin/Puppeteer-Pool.git",
@@ -16,11 +16,7 @@
1616
],
1717
"dependencies": {
1818
"pidusage": "^3.0.2",
19-
"pino": "^9.3.2",
20-
"pino-pretty": "^11.2.2",
21-
"reflect-metadata": "^0.2.2",
22-
"@types/pino": "^7.0.5",
23-
"@types/pino-pretty": "^5.0.0"
19+
"reflect-metadata": "^0.2.2"
2420
},
2521
"peerDependencies": {
2622
"puppeteer": "^24.1.1"

src/client/rest.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { TaskDispatcher } from '../pool/dispatcher';
66
import { ContextMode } from '../pool/enum';
77
import { RequestedTask } from '../types';
88
import * as puppeteer from 'puppeteer';
9+
import { LogLevel } from '../logger';
910

1011
export class PuppeteerPool {
1112
private static isInitialized = false;
@@ -33,6 +34,8 @@ export class PuppeteerPool {
3334
public static async start(
3435
concurrencyLevel: number,
3536
contextMode: ContextMode,
37+
enableLog: boolean = true,
38+
logLevel: LogLevel = LogLevel.DEBUG,
3639
options?: puppeteer.LaunchOptions,
3740
customConfigPath?: string,
3841
) {
@@ -42,6 +45,8 @@ export class PuppeteerPool {
4245
await PuppeteerPool.dispatcherInstance.init(
4346
concurrencyLevel,
4447
contextMode,
48+
enableLog,
49+
logLevel,
4550
options,
4651
customConfigPath,
4752
);

src/configs/config.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ValidateBoolean, ValidateInteager } from './validator';
22

3-
import { poolLogger } from '../logger';
3+
import { Logger } from '../logger';
44
import * as fs from 'fs';
55

66
/**
@@ -34,14 +34,15 @@ export const app_config = {
3434
export type ConfigType = typeof app_config;
3535
export const loadConfig = (configPath: string = null): ConfigType => {
3636
let loadedConfig = null;
37+
const logger = new Logger();
3738
try {
3839
loadedConfig = JSON.parse(
3940
fs.readFileSync(configPath ?? defaultConfigPath, 'utf-8'),
4041
);
41-
poolLogger.info('Config loaded successfully');
42+
logger.info('Config loaded successfully');
4243
} catch {
4344
// If error while loading configs, use default configs
44-
poolLogger.warn('Fail to load configs. Use default configs');
45+
logger.warn('Fail to load configs. Use default configs');
4546
return app_config;
4647
}
4748
// Session Pool Config

src/logger/index.ts

Lines changed: 101 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,101 @@
1-
import pino from 'pino';
2-
3-
// Logger Info
4-
const transport = pino.transport({
5-
targets: [
6-
{
7-
level: 'trace',
8-
target: 'pino-pretty',
9-
options: { colorize: true },
10-
},
11-
],
12-
});
13-
14-
export const poolLogger = pino(transport);
1+
interface Colors {
2+
reset: string;
3+
red: string;
4+
yellow: string;
5+
blue: string;
6+
green: string;
7+
}
8+
9+
interface LogMetadata {
10+
timestamp: string;
11+
pid: number;
12+
level: string;
13+
message: string;
14+
[key: string]: any;
15+
}
16+
17+
export enum LogLevel {
18+
ERROR = 0,
19+
WARN = 1,
20+
INFO = 2,
21+
DEBUG = 3,
22+
}
23+
24+
export class Logger {
25+
constructor(
26+
private enabled: boolean = true,
27+
private logLevel: LogLevel = LogLevel.DEBUG,
28+
) {}
29+
30+
private readonly colors: Colors = {
31+
// Should reset ANSI color after using color: https://gist.github.com/pinksynth/209937bd424edb2bd21f7c8bf756befd
32+
reset: '\x1b[0m',
33+
red: '\x1b[31m',
34+
yellow: '\x1b[33m',
35+
blue: '\x1b[34m',
36+
green: '\x1b[32m',
37+
};
38+
39+
private getTimestamp(): string {
40+
const date = new Date();
41+
const year = date.getFullYear();
42+
const month = String(date.getMonth() + 1).padStart(2, '0');
43+
const day = String(date.getDate()).padStart(2, '0');
44+
const hours = String(date.getHours()).padStart(2, '0');
45+
const minutes = String(date.getMinutes()).padStart(2, '0');
46+
const seconds = String(date.getSeconds()).padStart(2, '0');
47+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
48+
}
49+
private formatLog(
50+
level: string,
51+
color: keyof Colors,
52+
message: any[],
53+
extraMetadata: object = {},
54+
): string {
55+
const metadata: LogMetadata = {
56+
timestamp: this.getTimestamp(),
57+
pid: process.pid,
58+
level,
59+
message: message.join(' '),
60+
...extraMetadata,
61+
};
62+
return `[${metadata.timestamp}] ${this.colors[color]}[${level}]${this.colors.reset} (${metadata.pid}) -- ${metadata.message}`;
63+
}
64+
65+
private log(
66+
level: LogLevel,
67+
color: keyof Colors,
68+
label: string,
69+
...args: any[]
70+
): void {
71+
if (this.enabled && this.logLevel >= level) {
72+
console.log(this.formatLog(label, color, args));
73+
}
74+
}
75+
76+
public error(...args: any[]): void {
77+
this.log(LogLevel.ERROR, 'red', 'ERROR', ...args);
78+
}
79+
80+
public warn(...args: any[]): void {
81+
this.log(LogLevel.WARN, 'yellow', 'WARN', ...args);
82+
}
83+
84+
public info(...args: any[]): void {
85+
this.log(LogLevel.INFO, 'green', 'INFO', ...args);
86+
}
87+
88+
public debug(...args: any[]): void {
89+
this.log(LogLevel.DEBUG, 'blue', 'DEBUG', ...args);
90+
}
91+
92+
public setLogLevel(level: LogLevel): void {
93+
this.logLevel = level;
94+
}
95+
96+
public setEnabled(enabled: boolean): void {
97+
this.enabled = enabled;
98+
}
99+
}
100+
101+
export const logger = new Logger(true, LogLevel.DEBUG);

0 commit comments

Comments
 (0)