Java中将System.out内容写入Tomcat日志

在Tomcat中将System.out.print()内容写入日志文件,有几种方法可以实现:

方法1:配置Tomcat的logging.properties

修改Tomcat的conf/logging.properties文件:

python 复制代码
# 将System.out重定向到日志文件
handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

# Catalina日志处理器
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.formatter = org.apache.juli.OneLineFormatter

# 控制台处理器(捕获System.out)
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter

方法2:使用日志框架(推荐)

在代码中使用标准的日志框架,如Log4j2、Logback或SLF4J:

使用Log4j2示例:

java 复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class YourClass {
    private static final Logger logger = LogManager.getLogger(YourClass.class);
    
    public void yourMethod() {
        // 替换 System.out.print(jsonObject);
        logger.info("JSON内容: {}", jsonObject.toString());
    }
}

使用SLF4J + Logback:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class YourClass {
    private static final Logger logger = LoggerFactory.getLogger(YourClass.class);
    
    public void yourMethod() {
        logger.info("JSON对象: {}", jsonObject);
    }
}

方法3:重定向System.out

在Servlet或Filter中重定向System.out:

java 复制代码
public class LoggingFilter implements Filter {
    private PrintStream originalOut;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 创建指向Tomcat日志文件的PrintStream
        try {
            String logPath = System.getProperty("catalina.base") + "/logs/myapp.out";
            PrintStream fileOut = new PrintStream(new FileOutputStream(logPath, true));
            originalOut = System.out;
            System.setOut(fileOut);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void destroy() {
        if (originalOut != null) {
            System.setOut(originalOut);
        }
    }
}

方法4:配置log4j2.xml

创建src/main/resources/log4j2.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <File name="FileAppender" fileName="${sys:catalina.base}/logs/myapp.log">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
        </File>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="FileAppender"/>
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

使用日志框架可以更专业地管理日志,而不是依赖System.out这种调试性质的输出方式。

相关推荐
超级大只老咪3 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶3 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长3 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子3 小时前
JDK 安装配置
java·开发语言
星哥说事3 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink3 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII3 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home3 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
等....3 小时前
Miniconda使用
开发语言·python
zfj3213 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang