我可以将控制台输出镜像到网站吗?
Can i mirror the console output to a website?
有什么方法可以将控制台输出镜像到 java 中的本地主机,甚至可以向其中添加一些不错的 CSS。如果同一网络中的其他设备也可以访问控制台,那就太好了。我对这个主题做了很多研究,但还没有找到任何关于这个的 websites/threads/questions。
帮助将不胜感激!
为了拦截通常进入控制台(或标准输出)的输出,您需要在代码中的某处使用以下 API:
System.setOut(myStream);
System.setErr(myStream); //If you want to grab the error stream also. Could go do a different location
许多日志库已经可以为您做到这一点。但这基本上就是您需要捕获输出的方式。 'myStream' 实际做什么取决于您。将其输出到 http://localhost:8888 上的 Web 服务器的最快途径是将输出定向到一个文件并启动 JDK 的嵌入式 Web 服务器。这是您应该能够 运行:
的示例
package test.example;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class SystemOutToWeb
{
public static void main(String... args ) throws Exception
{
final Path myOutputFile = Paths.get("./MyOutputFile.txt");
final PrintStream myStream = new PrintStream(myOutputFile.toFile());
System.out.println("Going to redirect to : " + myOutputFile.toAbsolutePath());
System.setOut(myStream);
System.setErr(myStream);
System.out.println("Starting the Output");
//Have something that logs every 5 seconds
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() ->
{
System.out.println("Hello - the time is now " + Instant.now());
}, 1, 5, TimeUnit.SECONDS);
// Start the simple Java Built in Web Server.
final HttpServer http = HttpServer.create(new InetSocketAddress(8888), 0);
final HttpContext context = http.createContext("/");
context.setHandler(exchange ->
{
byte[] data = Files.readAllBytes(myOutputFile);
exchange.sendResponseHeaders(200, data.length);
OutputStream os = exchange.getResponseBody();
os.write(data);
os.close();
});
http.start();
}
}
如果你给它几秒钟 运行,那么你应该能够在 http://localhost:8888 看到一些东西。
当然,这只是起点。例如,您可以一起使用不同的 Web 服务器,或者使用 CSS 进一步扩充此资源(甚至可以使用 Web 套接字在文件更新时将其流出)。
您想要集中式日志之类的东西吗?有像 Grafana Loki 这样的工具,您可以在其中使用名为 promtail 的日志收集器从文件中收集日志并将它们发送到您的 Loki 实例,并且通过 Grafana 前端,您可以搜索彩色日志。这可以包括来自多个应用程序的日志。
https://grafana.com/docs/loki/latest/clients/promtail/
您可以将其发送到 Grafana Cloud,它为最多三个用户提供免费套餐,或者使用 docker 托管 Grafana Stack,这是一个随时可用的堆栈:
有什么方法可以将控制台输出镜像到 java 中的本地主机,甚至可以向其中添加一些不错的 CSS。如果同一网络中的其他设备也可以访问控制台,那就太好了。我对这个主题做了很多研究,但还没有找到任何关于这个的 websites/threads/questions。 帮助将不胜感激!
为了拦截通常进入控制台(或标准输出)的输出,您需要在代码中的某处使用以下 API:
System.setOut(myStream);
System.setErr(myStream); //If you want to grab the error stream also. Could go do a different location
许多日志库已经可以为您做到这一点。但这基本上就是您需要捕获输出的方式。 'myStream' 实际做什么取决于您。将其输出到 http://localhost:8888 上的 Web 服务器的最快途径是将输出定向到一个文件并启动 JDK 的嵌入式 Web 服务器。这是您应该能够 运行:
的示例package test.example;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class SystemOutToWeb
{
public static void main(String... args ) throws Exception
{
final Path myOutputFile = Paths.get("./MyOutputFile.txt");
final PrintStream myStream = new PrintStream(myOutputFile.toFile());
System.out.println("Going to redirect to : " + myOutputFile.toAbsolutePath());
System.setOut(myStream);
System.setErr(myStream);
System.out.println("Starting the Output");
//Have something that logs every 5 seconds
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() ->
{
System.out.println("Hello - the time is now " + Instant.now());
}, 1, 5, TimeUnit.SECONDS);
// Start the simple Java Built in Web Server.
final HttpServer http = HttpServer.create(new InetSocketAddress(8888), 0);
final HttpContext context = http.createContext("/");
context.setHandler(exchange ->
{
byte[] data = Files.readAllBytes(myOutputFile);
exchange.sendResponseHeaders(200, data.length);
OutputStream os = exchange.getResponseBody();
os.write(data);
os.close();
});
http.start();
}
}
如果你给它几秒钟 运行,那么你应该能够在 http://localhost:8888 看到一些东西。
当然,这只是起点。例如,您可以一起使用不同的 Web 服务器,或者使用 CSS 进一步扩充此资源(甚至可以使用 Web 套接字在文件更新时将其流出)。
您想要集中式日志之类的东西吗?有像 Grafana Loki 这样的工具,您可以在其中使用名为 promtail 的日志收集器从文件中收集日志并将它们发送到您的 Loki 实例,并且通过 Grafana 前端,您可以搜索彩色日志。这可以包括来自多个应用程序的日志。
https://grafana.com/docs/loki/latest/clients/promtail/
您可以将其发送到 Grafana Cloud,它为最多三个用户提供免费套餐,或者使用 docker 托管 Grafana Stack,这是一个随时可用的堆栈: