pipe logs from forks into pino logger

This commit is contained in:
Jan Prochazka
2023-01-22 10:00:01 +01:00
parent af01d95348
commit e1f92fef13
7 changed files with 99 additions and 41 deletions

View File

@@ -15,6 +15,7 @@ const processArgs = require('../utility/processArgs');
const { safeJsonParse, getLogger } = require('dbgate-tools'); const { safeJsonParse, getLogger } = require('dbgate-tools');
const platformInfo = require('../utility/platformInfo'); const platformInfo = require('../utility/platformInfo');
const { connectionHasPermission, testConnectionPermission } = require('../utility/hasPermission'); const { connectionHasPermission, testConnectionPermission } = require('../utility/hasPermission');
const pipeForkLogs = require('../utility/pipeForkLogs');
const logger = getLogger('connections'); const logger = getLogger('connections');
@@ -205,13 +206,20 @@ module.exports = {
test_meta: true, test_meta: true,
test(connection) { test(connection) {
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ const subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', [
'connectProcess', '--is-forked-api',
...processArgs.getPassArgs(), '--start-process',
// ...process.argv.slice(3), 'connectProcess',
]); ...processArgs.getPassArgs(),
// ...process.argv.slice(3),
],
{
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
}
);
pipeForkLogs(subprocess);
subprocess.send(connection); subprocess.send(connection);
return new Promise(resolve => { return new Promise(resolve => {
subprocess.on('message', resp => { subprocess.on('message', resp => {

View File

@@ -29,6 +29,7 @@ const diff2htmlPage = require('../utility/diff2htmlPage');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { testConnectionPermission } = require('../utility/hasPermission'); const { testConnectionPermission } = require('../utility/hasPermission');
const { MissingCredentialsError } = require('../utility/exceptions'); const { MissingCredentialsError } = require('../utility/exceptions');
const pipeForkLogs = require('../utility/pipeForkLogs');
const logger = getLogger('databaseConnections'); const logger = getLogger('databaseConnections');
@@ -88,13 +89,20 @@ module.exports = {
if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') { if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') {
throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode }); throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode });
} }
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ const subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', [
'databaseConnectionProcess', '--is-forked-api',
...processArgs.getPassArgs(), '--start-process',
// ...process.argv.slice(3), 'databaseConnectionProcess',
]); ...processArgs.getPassArgs(),
// ...process.argv.slice(3),
],
{
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
}
);
pipeForkLogs(subprocess);
const lastClosed = this.closed[`${conid}/${database}`]; const lastClosed = this.closed[`${conid}/${database}`];
const newOpened = { const newOpened = {
conid, conid,

View File

@@ -10,6 +10,7 @@ const config = require('./config');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { testConnectionPermission } = require('../utility/hasPermission'); const { testConnectionPermission } = require('../utility/hasPermission');
const { MissingCredentialsError } = require('../utility/exceptions'); const { MissingCredentialsError } = require('../utility/exceptions');
const pipeForkLogs = require('../utility/pipeForkLogs');
module.exports = { module.exports = {
opened: [], opened: [],
@@ -53,13 +54,20 @@ module.exports = {
if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') { if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') {
throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode }); throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode });
} }
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ const subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', [
'serverConnectionProcess', '--is-forked-api',
...processArgs.getPassArgs(), '--start-process',
// ...process.argv.slice(3), 'serverConnectionProcess',
]); ...processArgs.getPassArgs(),
// ...process.argv.slice(3),
],
{
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
}
);
pipeForkLogs(subprocess);
const newOpened = { const newOpened = {
conid, conid,
subprocess, subprocess,

View File

@@ -9,6 +9,7 @@ const { handleProcessCommunication } = require('../utility/processComm');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { appdir } = require('../utility/directories'); const { appdir } = require('../utility/directories');
const { getLogger } = require('dbgate-tools'); const { getLogger } = require('dbgate-tools');
const pipeForkLogs = require('../utility/pipeForkLogs');
const logger = getLogger('sessions'); const logger = getLogger('sessions');
@@ -85,13 +86,20 @@ module.exports = {
async create({ conid, database }) { async create({ conid, database }) {
const sesid = uuidv1(); const sesid = uuidv1();
const connection = await connections.getCore({ conid }); const connection = await connections.getCore({ conid });
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ const subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', [
'sessionProcess', '--is-forked-api',
...processArgs.getPassArgs(), '--start-process',
// ...process.argv.slice(3), 'sessionProcess',
]); ...processArgs.getPassArgs(),
// ...process.argv.slice(3),
],
{
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
}
);
pipeForkLogs(subprocess);
const newOpened = { const newOpened = {
conid, conid,
database, database,

View File

@@ -2,6 +2,7 @@ const { fork } = require('child_process');
const uuidv1 = require('uuid/v1'); const uuidv1 = require('uuid/v1');
const { handleProcessCommunication } = require('./processComm'); const { handleProcessCommunication } = require('./processComm');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const pipeForkLogs = require('./pipeForkLogs');
class DatastoreProxy { class DatastoreProxy {
constructor(file) { constructor(file) {
@@ -30,13 +31,20 @@ class DatastoreProxy {
async ensureSubprocess() { async ensureSubprocess() {
if (!this.subprocess) { if (!this.subprocess) {
this.subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ this.subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', [
'jslDatastoreProcess', '--is-forked-api',
...processArgs.getPassArgs(), '--start-process',
// ...process.argv.slice(3), 'jslDatastoreProcess',
]); ...processArgs.getPassArgs(),
// ...process.argv.slice(3),
],
{
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
}
);
pipeForkLogs(this.subprocess);
this.subprocess.on('message', message => { this.subprocess.on('message', message => {
// @ts-ignore // @ts-ignore

View File

@@ -0,0 +1,15 @@
const byline = require('byline');
const { safeJsonParse, getLogger } = require('dbgate-tools');
const logger = getLogger();
const logDispatcher = method => data => {
const json = safeJsonParse(data.toString());
logger[method](json || data.toString());
};
function pipeForkLogs(subprocess) {
byline(subprocess.stdout).on('data', logDispatcher('info'));
byline(subprocess.stderr).on('data', logDispatcher('error'));
}
module.exports = pipeForkLogs;

View File

@@ -6,6 +6,7 @@ const lock = new AsyncLock();
const { fork } = require('child_process'); const { fork } = require('child_process');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { getLogger } = require('dbgate-tools'); const { getLogger } = require('dbgate-tools');
const pipeForkLogs = require('./pipeForkLogs');
const logger = getLogger('sshTunnel'); const logger = getLogger('sshTunnel');
const sshTunnelCache = {}; const sshTunnelCache = {};
@@ -23,12 +24,14 @@ const CONNECTION_FIELDS = [
const TUNNEL_FIELDS = [...CONNECTION_FIELDS, 'server', 'port']; const TUNNEL_FIELDS = [...CONNECTION_FIELDS, 'server', 'port'];
function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) { function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) {
let subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ let subprocess = fork(
'--is-forked-api', global['API_PACKAGE'] || process.argv[1],
'--start-process', ['--is-forked-api', '--start-process', 'sshForwardProcess', ...processArgs.getPassArgs()],
'sshForwardProcess', {
...processArgs.getPassArgs(), stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
]); }
);
pipeForkLogs(subprocess);
subprocess.send({ subprocess.send({
msgtype: 'connect', msgtype: 'connect',