Почему мой журнал будет перенаправлен на catalina.out?

В моем приложении я использую 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>

И приложение размещается в Tomcat7.

Во-первых, я использую способ вывода Catalina.out по умолчанию, но обнаружил, что журнал моего приложения будет перенаправлен в Catalina.out. Поэтому я следую документам Tomcat. http://tomcat.apache.org/tomcat-7.0-doc/logging.html

Затем измените его с помощью log4j. Но, наконец, он работает по умолчанию.

log4j.rootLogger = INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
log4j.appender.CATALINA.Append = true
log4j.appender.CATALINA.Encoding = UTF-8
# Roll-over the log once per day
log4j.appender.CATALINA.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost
log4j.appender.LOCALHOST.Append = true
log4j.appender.LOCALHOST.Encoding = UTF-8
log4j.appender.LOCALHOST.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File = ${catalina.base}/logs/manager

Кто-нибудь встречал такую ​​​​проблему, может показать мне решение, чтобы избежать этого?

PS: Дизайн модуля регистратора:

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>

person macking_liu    schedule 03.06.2014    source источник
comment
Измените значение этого тега на локальный файл log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina   -  person Anshu Kunal    schedule 03.06.2014
comment
Я обновил код, который использовал для вывода регистратора. На самом деле, это работает несколько месяцев назад. Но это становится странным с какого-то дня, которого мы не знаем.   -  person macking_liu    schedule 03.06.2014
comment
Регистрация в console/SYSTEM_OUT перенаправляется Tomcat в файл catalina.out. Удалите все строки <appeder=ref ref="Console"/> из файла конфигурации log4j2.   -  person vanOekel    schedule 03.06.2014


Ответы (4)


Он перенаправляется на catalina.out, потому что у вас есть журнал консоли, определенный как приложение, и они перенаправляются на catalina.out.

Однако нам нужны журналы консоли для локальной разработки, но мы не хотим, чтобы они отображались в других средах. Вы можете использовать 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>

Если вы передадите -DconsoleLogLevel=debug в локальном режиме, вы увидите, что все журналы из com.github.api записываются на консоль, но в других средах, если вы не передадите ни одного значение по умолчанию принимает ошибку и показывает только стек ошибок в каталине.

person Arun Gopalpuri    schedule 29.01.2016

Приведенное ниже всегда будет указывать на файл журнала по умолчанию Catalina.out.

log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina

Измените значение этого тега на локальный файл

log4j.appender.CATALINA.File = C:\outputlog
person Anshu Kunal    schedule 03.06.2014
comment
Я имею в виду, что я определяю вывод журнала в другом месте с помощью моего собственного модуля регистратора, но содержимое по-прежнему перенаправляется в Catalina.out. - person macking_liu; 03.06.2014

Если какая-то часть вашего приложения использует log4j-1.2, вы можете попробовать добавить log4j-1.2-api-2.0.jar в путь к классам, чтобы все вызовы API 1.2 перенаправлялись на реализацию log4j2. (См. раздел «Какие банки» на странице часто задаваемых вопросов log4j2.) Вам больше не понадобится конфигурация файла свойств в стиле log4j-1.2. Только конфигурация log4j2.xml будет использоваться log4j2.

person Remko Popma    schedule 04.06.2014

Наконец, я исправил свой код с помощью:

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

person macking_liu    schedule 06.06.2014