Почему мой журнал будет перенаправлен в 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>
4 ответа
Он перенаправляется на catalina.out, потому что у вас есть консольный журнал, определенный как appender, и они перенаправляются на 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 записываются в консоль, но в других средах, если вы не передаете какое-либо значение, он принимает ошибку по умолчанию и показывает только стек ошибок в каталитическом выводе.,
Ниже всегда будет указывать на файл журнала по умолчанию 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 в classpath, чтобы все вызовы, сделанные в API 1.2, были перенаправлены в реализацию log4j2. (См. Раздел "which jars" на странице часто задаваемых вопросов по log4j2.) Вам больше не понадобится конфигурация файла свойств стиля log4j-1.2. Только log4j2.xml config будет использоваться log4j2.
Наконец, я исправил свой код с помощью:
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