java启动命令日志输出重定向

文章详细介绍了如何在Linux环境下使用nohup命令后台运行Java服务,并通过重定向操作将输出日志屏蔽或保存到指定文件,如>/dev/null用于丢弃输出,2>&1用于合并标准输出和错误输出。此外,还解释了标准输入、输出和错误输出的概念及其文件描述符。

1、问题描述

java启动项目命令:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=dev /usr/local/application/laowang/laowang.jar  >/dev/null 2>&1 &

执行起来是没问题,关于日志输出重定向,开始有点搞混了,记录下。

2、解决方案

1、首先要明确的是,nohup这些是在linux下执行的shell命令,其中的重定向也是shell命令参数的一种,不是java专用命令;

2、 nohup --- & ,这个是shell命令,表明是在后台运行,挂起,关闭ssh窗口也不会被关闭;

3、我们经常使用nohup command &命令形式来启动一些后台程序,比如一些java服务:

# nohup java -jar xxxx.jar &

为了不让一些执行信息输出到前台(控制台),我们还会加上刚才提到的>/dev/null 2>&1命令来丢弃所有的输出:

# nohup java -jar xxxx.jar >/dev/null 2>&1 &

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

类型

文件描述符

默认情况

对应文件句柄位置

标准输入(standard input)

0

从键盘获得输入

/proc/self/fd/0

标准输出(standard output)

1

输出到屏幕(即控制台)

/proc/self/fd/1

错误输出(error output)

2

输出到屏幕(即控制台)

/proc/self/fd/2

(1)“>/dev/null"

这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容;

(2)"2>/dev/null"

意思就是把错误输出到“黑洞”;

(3)“>/dev/null 2>&1"

默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞”;

(4)"2>&1 >/dev/null"

意思就是把错误输出2重定向到标准出书1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕;

(5) >log.log 是将信息输出到log.log日志中

# nohup java -jar xxxx.jar  >/var/log.log 2>&1 &

2>&1 是将标准错误信息转变成标准输出,这样就可以将错误信息输出到log.log 日志里面来。

在Windows系统下,有多种方法可以使用Java启动程序并将输出日志保存到指定位置。 ### 使用批处理脚本 可以编写批处理脚本,利用重定向功能将控制台日志保存到指定文件。以下是一个示例批处理脚本: ```batch @echo off rem 设置日志文件路径,以当前日期命名 set LOG_PATH=D:\logs\%date:~0,4%%date:~5,2%%date:~8,2%.log rem 进入程序所在目录 cd C:\your\java\program\directory rem 启动Java程序并将日志输出到指定文件 java -verbose sample.DesktopApp >> %LOG_PATH% 2>&1 ``` 在上述脚本中,`%LOG_PATH%` 定义了日志文件的路径,使用当前日期作为文件名。`java -verbose sample.DesktopApp >> %LOG_PATH% 2>&1` 命令Java程序的输出(包括标准输出和错误输出重定向到指定的日志文件中。 ### 在Maven项目中使用Log4j 如果是Maven项目,可以使用Log4j来输出日志并保存到指定文件。步骤如下: 1. **在 `pom.xml` 文件添加依赖**: ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> ``` 2. **创建 `log4j.properties` 文件**:在 `resources` 目录下创建 `log4j.properties` 文件,并添加如下内容: ```properties # 设置日志输出级别和输出位置 log4j.rootLogger=DEBUG, file # 定义文件输出器 log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=D:/logs/app.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n ``` 3. **测试使用Log4j日志**:在Java代码中使用Log4j记录日志。 ```java import org.apache.log4j.Logger; public class Main { private static final Logger logger = Logger.getLogger(Main.class); public static void main(String[] args) { logger.debug("This is a debug message"); logger.info("This is an info message"); logger.error("This is an error message"); } } ``` 4. **查看日志文件**:日志将被保存到 `D:/logs/app.log` 文件中。 ### 前端调用接口获取日志信息 可以编写一个Spring Boot控制器,用于前端调用接口获取最新日志信息。以下是示例代码: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.io.RandomAccessFile; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/portal") public class ConsoleLogReadRes { // Windows输出文件路径 @Value("${consoleLogWrite.windowsUrl}") private String consoleLogWriteWindowsUrl; // 记录日志文件最后的大小 private long lastTimeFileSize = 0; @GetMapping("/getConsoleLogInfo") public List<String> getConsoleLogInfo() throws Exception { File tmplLogFile = new File(consoleLogWriteWindowsUrl); List<String> result = new ArrayList<>(); try (RandomAccessFile randomAccessFile = new RandomAccessFile(tmplLogFile, "rw")) { randomAccessFile.seek(lastTimeFileSize); // 从上次日志文件后开始读取 String line; while ((line = randomAccessFile.readLine()) != null) { // 将每一行的数据都存入集合中,统一返回 result.add(new String(line.getBytes(StandardCharsets.ISO_8859_1))); } lastTimeFileSize = randomAccessFile.length(); } return result; } } ``` 在上述代码中,`consoleLogWriteWindowsUrl` 是日志文件的路径。前端可以通过调用 `/portal/getConsoleLogInfo` 接口获取最新的日志信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值