Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的日志会被重定向到catalina.out?_Java_Tomcat7_Log4j2_Catalina.out - Fatal编程技术网

Java 为什么我的日志会被重定向到catalina.out?

Java 为什么我的日志会被重定向到catalina.out?,java,tomcat7,log4j2,catalina.out,Java,Tomcat7,Log4j2,Catalina.out,在我的应用程序中,我使用log4j2输出日志 <!-- log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.0-beta9</version> </dependency> <depend

在我的应用程序中,我使用log4j2输出日志

<!-- log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.0-beta9</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.0-beta9</version>
</dependency>
任何人遇到这样的问题,能告诉我避免这种情况的解决方法吗

附言: 记录器模块设计为:

import java.io.BufferedWriter;
import java.util.Date;

public class Logger {

    private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Logger.class
            .getName());

    public static void error(String proj, String opera, String param, String msg) {
        logger.error(log("Error", proj, opera, param, msg));
    }

    public static void debug(String proj, String opera, String param, String msg) {
        logger.debug(log("Debug", proj, opera, param, msg));
    }

    public static void warn(String proj, String opera, String param, String msg) {
        logger.warn(log("Warn", proj, opera, param, msg));
    }

    public static void info(String proj, String opera, String param, String msg) {
        logger.info(log("Info", proj, opera, param, msg));
    }

    private static String log(String type, String proj, String opera, String param, String msg) {
        // Build log content with JSON
        StringBuilder sb = new StringBuilder();
        sb.append("{\"time\": \"");
        sb.append(DateUtil.formatMilliSecond(new Date()));
        sb.append("\", \"level\": ");
        sb.append("\"" + type + "\", \"module\": ");
        sb.append("\"" + proj + "\", \"operation\": ");
        sb.append("\"" + opera + "\"");

        if (!StringUtil.isEmpty(param)) {
            sb.append(", \"parameter\": \"" + param + "\"");
        }

        if (!StringUtil.isEmpty(msg)) {
            sb.append(", \"message\": \"" + msg + "\"");
        }
        sb.append("}");
        writeLog(sb.toString());
        return sb.toString();
    }


    public static void setLog(String module) {
        logger = org.apache.logging.log4j.LogManager.getLogger(module);
    }

}
以及log4j2配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n"/>
        </Console>
        <RollingFile name="MinerLog" fileName="/local/logs/miners.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/miners-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="CaptainLog" fileName="/local/logs/captain.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/captain-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="DataProviderLog" fileName="/local/logs/das_dataprovider.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/dataprovider-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <loggers>
        <root level="debug">
            <appender-ref ref="Console"/>
        </root>
        <logger name="miner" level="debug">
            <appender-ref ref="MinerLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
        <logger name="captain" level="debug">
            <appender-ref ref="CaptainLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
        <logger name="dataprovider" level="debug">
            <appender-ref ref="DataProviderLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
    </loggers>
</configuration>

以下内容将始终指向默认日志文件Catalina.out

log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
将此标记的值更改为本地文件

log4j.appender.CATALINA.File = C:\outputlog

如果应用程序的某些部分正在使用log4j-1.2,则可以尝试将log4j-1.2-api-2.0.jar添加到类路径,以便将对1.2 api的所有调用重定向到log4j2实现。(请参阅log4j2常见问题页面的“哪些JAR”部分。)
您将不再需要log4j-1.2样式的属性文件配置。log4j2只使用log4j2.xml配置

最后,我用以下方法更正了我的代码:

import java.util.Date;

import org.apache.logging.log4j.core.config.XMLConfigurationFactory;


public class Logger {

    static {
        System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "/local/logs/log4j2.xml");
    }

    private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Logger.class
            .getName());

    ...
然后可以在我的日志文件中正确生成它。 并且Tomcat也将在没有应用程序日志内容的情况下放置到正确的位置。 /local/logs/log4j2.xml现在看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n"/>
        </Console>
        <RollingFile name="AppLog" fileName="/local/das/logs/das_app.log"
                     filePattern="/local/das/logs/$${date:yyyy-MM}/das_app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>        
    </appenders>
    <loggers>
        <root level="debug">
            <appender-ref ref="AppLog" level="info"/>
        </root>
    </loggers>
</configuration>


感谢vanOekel将其重定向到catalina.out,因为您将控制台日志定义为appender,这些日志将被重定向到catalina.out

log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
但是,本地开发确实需要控制台日志,但不希望在其他环境中显示。您可以将ThresholdFilter与配置属性一起使用,以便仅在本地环境中而不在具有以下示例代码的其他环境中控制台日志:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="300">
    <Properties>
        <Property name="consoleLogLevel">error</Property>
    </Properties>
    <Appenders>
        <RollingFile name="FileOut" fileName="/dev/pref-api.log"
                     filePattern="/dev/pref-api-%d{yyyy-MM-dd}.gz">
            <PatternLayout pattern="%date{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%t] [%logger{36}] %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%t] [%logger{36}] %msg%n"/>
            <Filters>
                <ThresholdFilter level="${sys:consoleLogLevel}"  onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="warn" additivity="false">
            <AppenderRef ref="FileOut"/>
            <AppenderRef ref="Console"/>
        </Root>

        <Logger name="com.github.api" level="debug" additivity="false">
            <AppenderRef ref="FileOut"/>
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

错误

如果您在本地传递一个-dconsoleglevel=debug,您将看到com.github.api中的所有日志记录到控制台,但在其他环境中,如果您不传递任何值,则默认为error,只在catalina out中显示错误堆栈。

将此标记的值更改为本地文件log4j.appender.catalina.file=${catalina.base}/logs/catalinaI已更新用于记录器输出的代码。事实上,它在几个月前就起作用了。但从我们不知道的某一天开始,它变得很奇怪。Tomcat将登录到console/SYSTEM_OUT重定向到catalina.OUT文件。从log4j2配置文件中删除所有的
行。我的意思是,我使用自己的记录器模块在不同的位置定义了日志输出,但内容仍然重定向到Catalina.out