log4j 1.2到log4j 2的迁移不起作用



我正在尝试将log4j从1迁移到2,但没有生成日志。我删除了实际的写入路径和应用程序能够写入日志的路径,因为日志在升级后不会打印旧代码包含父Pom

<!-- 
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.16.0</version>
</dependency>

儿童POM:-仅更新版本

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<!-- <version>1.7.5</version> -->
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-ext</artifactId>
<!--  <version>1.7.5</version> -->
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<!-- <version>1.7.5</version> -->
<version>1.7.25</version>
</dependency>
<!-- 
<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-log4j12</artifactId> 
<version>1.7.5</version> 
</dependency> 
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<!-- <version>1.7.5</version> -->
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<!-- <version>1.7.5</version> -->
<version>1.7.25</version>
</dependency>

log4j->xml

<log4j:configuration>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ISO8601}] [%t] %-5p %c{1}: %x - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="errout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.Err" />
<param name="Threshold" value="WARN" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ISO8601}] [%t] %-5p %c{1}: %x - %m%n" />
</layout>
</appender>
<appender name="userLog" class="com.test.RollingFileAppender">
<param name="File" value="userlogs.log" />
<param name="Threshold" value="INFO" />
<param name="MaxFileSize" value="50MB" />
<param name="MaxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m | [%d{ISO8601}] | [%t]%n" />
</layout>
</appender>
<appender name="errorLog" class="com.test.RollingFileAppender">
<param name="File" value="error.log" />
<param name="Threshold" value="ERROR" />
<param name="MaxFileSize" value="50MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ISO8601}] [%t] %-5p %c{1}: - %m%n" />
</layout>
</appender>
<category name="REQUEST_LOG" additivity="false">
<priority value="INFO" />
<appender-ref ref="userLog" />
</category>
<root>
<priority value="INFO" />
<appender-ref ref="errorLog" />
</root>
</log4j:configuration>

我们用程序初始化了log4j

import java.io.File;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import ApplicationContext;
import ResourceUtility;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.LogManager;
public class Initializer implements Startable {
private static Log logger = null;
private static boolean logsPathSet = false;
private static String logsPath = "";
static {
BasicConfigurator.configure();
logger = LogFactory.getLog(Initializer.class);
}
public static void initialize() {
logsPath = System.getProperty("log4j.configuration","");
logsPathSet = (logsPath != null && !logsPath.equals(""));
initializeLogging();
ApplicationContext.getInstance();
}
public static void initializeLogging() {
String configFile = "";
URL aURL  = null;

if ( logsPathSet ) {
configFile  = logsPath;
aURL = ResourceUtility.geUrlResource(configFile);
}

if ( (!logsPathSet) || ( logsPathSet && aURL == null) ) {
configFile = ApplicationContext.getInstance().getStringProperty("logging", "log4j", "configFile");
aURL = ResourceUtility.geUrlResource(configFile);
}
DOMConfigurator.configure(aURL);
logger = LogFactory.getLog(Initializer.class);
logger.info("Configured Logging from: " + aURL);
}
}

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import ApplicationContext;
import Initializer;
import ResourceUtility;
public class Startup extends HttpServlet {

private static Log logger = LogFactory.getFactory().getInstance(Startup.class);
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

public void init() throws ServletException {
super.init();
ApplicationContext.getInstance();
Initializer.initialize();
String loggingProperty = "/" + ApplicationContext.getInstance().getProperty("logging", "log4j", "configFile");
loggingFile = ResourceUtility.getFileResource(loggingProperty);
PropertyConfigurator.configure(loggingFile.toString());
}

}

我尝试了几种方法。方法1->直接将log4j 1迁移到2并更新log4j连接

System.out->SYSTEM_OUT->尝试使用比特目标

更新了log4j xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console" target="System.out">
<PatternLayout pattern="[%d{ISO8601}] [%t] %-5p %c{1}: %x - %m%n" />
<LevelRangeFilter minLevel="DEBUG" maxLevel="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL" />
</Console>
<Console name="consoleError" target="System.Err" follow="true">
<PatternLayout pattern="[%d{ISO8601}] [%t] %-5p %c{1}: %x - %m%n" />
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="NEUTRAL" />
</Console>
<RollingFile name="userLog" fileName="/userlogs.log"  filePattern="/userlogs.log.%d{yyyyMMdd}">
<PatternLayout pattern="%m | [%d{ISO8601}] | [%t]%n" />
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
</RollingFile>

<RollingFile name="errorLog" fileName="/error.log"  filePattern="/error.log.%d{yyyyMMdd}">
<PatternLayout pattern="[%d{ISO8601}] [%t] %-5p %c{1}: - %m%n" />
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="REQUEST_LOG" additivity="false">
<AppenderRef  ref="userRequestLog" level="INFO" />
</Logger>
<Root  level="INFO">
<AppenderRef  ref="errorLog"/>
</Root >
</Loggers>
</Configuration>

更新的初始化程序类

//BasicConfigurator.configure();
Configurator.initialize(new DefaultConfiguration());
// DOMConfigurator.configure(aURL);

LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
loggingFile = ResourceUtility.getFileResource(configFile);
context.setConfigLocation(loggingFile.toURI());
context.reconfigure();
ConfigurationFactory.setConfigurationFactory(new XmlConfigurationFactory());
Configurator.reconfigure(loggingFile.toURI());

已将启动更新为

// PropertyConfigurator.configure(loggingFile.toString());
ConfigurationFactory.setConfigurationFactory(new XmlConfigurationFactory());
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
//Configurator.reconfigure(loggingFile.toURI());
context.setConfigLocation(loggingFile.toURI());
context.reconfigure();

没有为上述方法生成日志

方法2->通过添加桥接jar进行相同的更改->跳过log4j xml更改

提前感谢您的任何建议、更改或方法,或者您是否可以在迁移时分享您遵循的步骤,或者在代码更改最少的情况下共享方法。

我建议采用第二种方法,但必须使用log4j 2.17.2+版本。bridge jar在以前的版本中有很大的问题,但开发人员在今年年初做出了努力来解决它。我本想对此发表评论,而不是回答,但声誉很低。

在我的例子中,可以制作一个简单的jar文件并覆盖现有的log4j版本1在200个正在运行的应用程序上与它发生冲突,而不更改应用程序或应用程序服务器上的任何配置文件。这对一个";具有最小代码变化的方法":(

最新更新