Получить консольный вывод текущего скрипта

Я хочу получить содержимое консоли текущего запущенного скрипта Node.js.

Я пытался сделать это событие, но оно не работает:

setInterval(function() { console.info("Hello World!") }, 1000);

process.stdout.on('message', (message) => {
    console.info('stdout: ' + message.toString())
})

Он не прослушивает событие.

возможно, это событие не срабатывает

Vadi 27.01.2019 16:04

@Вади как? Я пытался установить таймер каждую секунду для отправки сообщения с помощью console.info, но это событие по-прежнему ничего не делает.

gabugu 27.01.2019 16:05

@gabudu с предоставленным только кодом, трудно сказать, почему он ничего не делает. Добавьте другие детали, связанные с таймером.

Vadi 27.01.2019 16:07

@Vadi я отредактировал его и добавил таймер

gabugu 27.01.2019 16:17

других частей пока нет

gabugu 27.01.2019 16:17

В сценарии, где это событие существует, этот код будет циклом. console.info запускает message, где вы вызываете console.info, который вызывает сообщение... Чего вы пытаетесь достичь?

Marcos Casagrande 27.01.2019 16:23

@MarcosCasagrande - я хочу сделать GET в моем приложении Express.js с именем /getconsole .. он должен вернуть консоль текущего запущенного сценария Node.js (который также запускает приложение Express.js)

gabugu 27.01.2019 16:25

Лучшим подходом является использование пользовательского регистратора, такого как winston. Где вы даже можете испускать в сокет и получать вывод сценария Node.js в реальном времени.

Marcos Casagrande 27.01.2019 16:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
655
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

stdout при переходе к tty (терминалу) является экземпляром доступный для записи поток. То же самое и с stderr, на который узел пишет сообщения об ошибках. Эти потоки не имеют событий сообщений. Метод on() позволяет запросить любое именованное событие, даже такое, которое никогда не сработает.

Ваше требование не ясно из вашего вопроса. Если вы хотите перехватывать и проверять операции console.info, вы можете направить stdout в какой-либо другой поток. Точно так же вы можете направить stderr в какой-либо другой поток для перехвата и проверки ошибок.

Или, в порыве уродства и плохой ремонтопригодности, вы можете переопределить функции console.info и console.error так, чтобы они делали то, что вам нужно.

Похоже, вы хотите буферизовать материал, записанный на консоль, а затем вернуть его http-клиенту в ответ на операцию GET. Для этого вы либо

  1. прекратите использовать console.info для этого вывода и переключитесь на высококачественный пакет npm для ведения журнала, такой как winston.

  2. переопределить console.info (и, возможно, console.error), чтобы сохранить его вывод в какой-то простой структуре данных экспресс-приложения, возможно, в массиве строк. Затем реализуйте свой GET, чтобы прочитать этот массив строк, отформатировать его и вернуть.

Мое первое предложение более масштабируемо.

Кстати, подумайте о последствиях для безопасности, если ваш консольный журнал будет доступен злоумышленникам.

Что, если я хочу также получить ошибки Node.js (которые хранятся в консоли)?

gabugu 27.01.2019 16:39

На process.stdout нет события «сообщение».

I want to make a GET in my Express.js app called /getconsole .. it should return the console of the current running Node.js script (which is running the Express.js app too)

Что вам следует использовать, так это настраиваемый регистратор, я рекомендую Уинстон с передачей файлов, и тогда вы сможете читать из этого файла, когда отправляете запрос на свою конечную точку.

const express = require('express');
const fs = require('fs');
const winston = require('winston');
const path = require('path');

const logFile = path.join(__dirname, 'out.log');
const app = express();

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.Console({
            format: winston.format.simple()
        }),
        new winston.transports.File({
            filename: logFile
        })
    ]
});


// Don't use console.info anymore.
logger.info('Hi');


app.get('/console', (req, res) => {
    // Secure this endpoint somehow
    fs.createReadStream(logFile)
        .pipe(res);
});

app.get('/log', (req, res) => {
    logger.info('Log: ' + req.query.message);
});

app.listen(3000);

Вы также можете использовать соединение через веб-сокет и создать собственный транспорт winston для отправки журналов.

Ответ принят как подходящий

Это не полностью решение Node.js, но оно очень хорошо, если вы используете Linux.

  1. Создайте файл start.sh.

  2. Поместите в него следующее:

start.sh:

#!/bin/bash
touch ./console.txt
node ./MyScript.js |& tee console.txt &

wait
  1. Теперь откройте свой скрипт Node.js (MyScript.js) и используйте это событие Express.js:

MyScript.js:

const fs = require('fs');
app.get('/console', function(req, res){
    var console2 = fs.readFileSync("./console.txt", 'utf8');
    res.send(console2);
});
  1. Всегда запускайте приложение Node.js, вызывая start.sh.

Теперь вызов http://example.com/console должен вывести консоль!

  • Была использована часть этот ответ.

  • ПРИМЕЧАНИЕ: чтобы отформатировать разрывы строк вывода консоли, чтобы они правильно отображались в браузерах, вы можете использовать модуль, например nl2br.

  • Совет: Проблемы не всегда решаются прямым путем, большинство проблем решается косвенными путями. Продолжайте искать возможные способы достижения того, чего вы хотите, и не ищите только то, что вы ищете.

Использовать readFileSync на экспресс-маршруте неправильно. Помимо блокировки цикла событий, если файл слишком велик, вы получите сообщение об ошибке нехватки памяти, что приведет к сбою сервера. Вы должны использовать fs.createReadStream и направить его на res.

Marcos Casagrande 01.02.2019 14:40

Другие вопросы по теме