【发布时间】:2018-09-14 10:47:22
【问题描述】:
log4j2.xml 文件是在运行时通过 java 程序动态创建的。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<RollingRandomAccessFile
name="Application" immediateFlush="false"
fileName="logs/FixGatewayLogs/Application.log"
append="true"
filePattern="logs/FixGatewayLogs/Application-%d{dd-MM-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p [%t] (%F:%L) - %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy fileIndex="max"
max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="FirstUser"
immediateFlush="false"
fileName="logs/FixAcceptorLogs/FirstUser.log"
append="true"
filePattern="logs/FixAcceptorLogs/FirstUser-%d{dd-MM-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %F - %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy fileIndex="max"
max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="SecondUser"
immediateFlush="false"
fileName="logs/FixAcceptorLogs/SecondUser.log"
append="true"
filePattern="logs/FixAcceptorLogs/SecondUser-%d{dd-MM-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %F - %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy fileIndex="max"
max="20" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncLogger name="Application" level="debug"
includeLocation="false" additivity="false">
<AppenderRef ref="Application" />
</AsyncLogger>
<AsyncLogger name="FirstUser" level="debug"
includeLocation="false" additivity="false">
<AppenderRef ref="FirstUser" />
</AsyncLogger>
<AsyncLogger name="SecondUser" level="debug"
includeLocation="false" additivity="false">
<AppenderRef ref="SecondUser" />
</AsyncLogger>
</Loggers>
</Configuration>
主类
public class CreateLog4jApplication {
static GenerateLog4j generateLog4j = new GenerateLog4j();
public static void main(String[] args) {
try {
createLog4jFile();
//System.setProperty("log4j.configurationFile","./src/main/resources/log4j2.xml");
}
catch(Exception e){
System.out.println("CreateLog4jApplication Main Exception : " + e);
}
}
public static void createLog4jFile() {
try{
// Create instance of OPTopicListener
System.out.println("run() of CreateLog4jApplication");
List<String> initiatorList = new ArrayList<String>();
initiatorList.add("First");
generateLog4j.generateLog4j2XMLFile(initiatorList);
//((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(true)).reconfigure();
Logger logger = LoggerFactory.getLogger("First");
logger.info("Enter First File");
System.out.println("After Logger add First file");
Thread.sleep(5000);
initiatorList.add("Second");
generateLog4j.generateLog4j2XMLFile(initiatorList);
//((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(true)).reconfigure();
Logger logger1 = LoggerFactory.getLogger("Second");
logger1.info("Enter Second File");
System.out.println("After Logger add Second file");
// This prevents program exit
CountDownLatch shutdownLatch = new CountDownLatch(1);
shutdownLatch.await();
}
catch(Exception e){
System.out.println("run() of CreateLog4jApplication Exception : " + e);
}
}
}
生成Log4j 类
public class GenerateLog4j {
public void generateLog4j2XMLFile(List<String> initiatorList) {
try {
System.out.println("InitiatorList : " + initiatorList + " " + initiatorList.size());
File fileForDelete = new File("src/main/resources/log4j2.xml");
fileForDelete.delete();
File fileForWrite = new File("src/main/resources/log4j2.xml");
FileWriter fileWriterObject = new FileWriter(fileForWrite, true);
fileWriterObject.write("<?xml version=" + "\"1.0\"" + " " + "encoding=" + "\"UTF-8\"" + "?>" + System.getProperty("line.separator"));
fileWriterObject.write("<Configuration status="+ "\""+ "error" +"\"" +">" + System.getProperty("line.separator"));
fileWriterObject.write("<Appenders>" + System.getProperty("line.separator"));
fileWriterObject.close();
String beginString = "FIX.4.4";
String tradesAcceptorID = "FIX_44_ACCEPTOR_TR";
// Iterate through the List and create entry for each Appender in XML file
for(int fileIndex = 0; fileIndex < (initiatorList.size() + 1); fileIndex++) {
String appName = null;
String filePath = null;
String filePattern = null;
String pattern = null;
String logLevel = null;
if(fileIndex == 0) { // FixGateway.log
appName = "OrderProcessorApplication";
filePath = "logs/FixGatewayLogs/" + appName + ".log";
filePattern = "logs/FixGatewayLogs/" + appName +"-%d{dd-MM-yyyy}-%i.log.gz";
pattern = "%d %-5p [%t] (%F:%L) - %m%n";
logLevel = "trace";
writeAppenderToLog4j2XMLFile(appName, filePath, filePattern, pattern, logLevel);
}
else { //Initiator
// Create entry for Trades Session in XML file
//appName = initiatorList.get(fileIndex - 1) + "_TR";
appName = initiatorList.get(fileIndex-1);
//filePath = "logs/FixAcceptorLogs/" + beginString + "-" + tradesAcceptorID + "-" + appName + ".log";
filePath = "logs/FixAcceptorLogs/" + appName + ".log";
filePattern = "logs/FixAcceptorLogs/" + appName +"-%d{dd-MM-yyyy}-%i.log.gz";
pattern = "%d %F - %m%n";
logLevel = "trace";
writeAppenderToLog4j2XMLFile(appName, filePath, filePattern, pattern, logLevel);
}
}
File fileForWriteOne = new File("src/main/resources/log4j2.xml");
FileWriter fileWriterObjectOne = new FileWriter(fileForWriteOne, true);
fileWriterObjectOne.write("</Appenders>" + System.getProperty("line.separator"));
fileWriterObjectOne.write("<Loggers>" + System.getProperty("line.separator"));
fileWriterObjectOne.close();
// Iterate through the List and create entry for each Logger in XML file
for(int fileIndex = 0; fileIndex < (initiatorList.size() + 1); fileIndex++) {
String appName = null;
String logLevel = null;
if(fileIndex == 0) { // OrderProcessorApplication.log
appName = "OrderProcessorApplication";
logLevel = "trace";
writeLoggerToLog4j2XMLFile(appName, logLevel);
}
else { // Initiator
// Create entry for Trades Session in XML file
appName = initiatorList.get(fileIndex-1);
logLevel = "trace";
writeLoggerToLog4j2XMLFile(appName, logLevel);
}
}
File fileForWriteTwo = new File("src/main/resources/log4j2.xml");
FileWriter fileWriterObjectTwo = new FileWriter(fileForWriteTwo, true);
fileWriterObjectTwo.write("</Loggers>"+ System.getProperty("line.separator"));
fileWriterObjectTwo.write("</Configuration>"+ System.getProperty("line.separator"));
// Close file handle
fileWriterObjectTwo.close();
System.out.println("generateLog4j2XMLFile Completed.");
}
catch(Exception e) {
System.out.println("Exception In generateLog4j2XMLFile: " + e);
}
}
public void writeLoggerToLog4j2XMLFile(String appName, String logLevel) {
try {
File fileForWrite = new File("src/main/resources/log4j2.xml");
FileWriter fileWriterObject = new FileWriter(fileForWrite, true);
fileWriterObject.write("<AsyncLogger name="+"\""+ appName + "\"" +" " +"level="+"\"" + logLevel + "\""+" "+"includeLocation="+"\"true\""+" "+ "additivity="+"\"false\""+">"+ System.getProperty("line.separator"));
fileWriterObject.write("<AppenderRef ref="+"\"" + appName +"\"" + "/>" + System.getProperty("line.separator"));
fileWriterObject.write("</AsyncLogger>"+ System.getProperty("line.separator"));
fileWriterObject.close();
}
catch(Exception e) {
System.out.println("Exception In writeLoggerToLog4j2XMLFile : " + e);
}
}
public void writeAppenderToLog4j2XMLFile(
String appName, String filePath, String filePattern, String pattern, String logLevel) {
try {
File fileForWrite = new File("src/main/resources/log4j2.xml");
FileWriter fileWriterObject = new FileWriter(fileForWrite, true);
String fileRollOverSize = "100 MB";
String maxNumberOfFiles = "20";
fileWriterObject.write("<RollingRandomAccessFile name=" + "\"" + appName + "\"" + " immediateFlush=" + "\"" + "false" + "\"" + " fileName=" + "\""+ filePath +"\""+" "+ "append=" + "\"true\"" +" "+ "filePattern=" + "\"" + filePattern + "\">"+ System.getProperty("line.separator"));
fileWriterObject.write("<PatternLayout>" + System.getProperty("line.separator"));
fileWriterObject.write("<Pattern>" + pattern + "</Pattern>" + System.getProperty("line.separator"));
fileWriterObject.write("</PatternLayout>" + System.getProperty("line.separator"));
fileWriterObject.write("<Policies>" + System.getProperty("line.separator"));
fileWriterObject.write("<SizeBasedTriggeringPolicy size="+"\"" + fileRollOverSize + "\""+ "/>" + System.getProperty("line.separator"));
fileWriterObject.write("</Policies>" + System.getProperty("line.separator"));
fileWriterObject.write("<DefaultRolloverStrategy fileIndex="+"\"max\""+" "+"max="+"\"" + maxNumberOfFiles + "\""+"/>"+ System.getProperty("line.separator"));
fileWriterObject.write("</RollingRandomAccessFile>" + System.getProperty("line.separator"));
fileWriterObject.close();
}
catch(Exception e) {
System.out.println("Exception In writeAppenderToLog4j2XMLFile: " + e);
}
}
}
Maven 依赖项
<!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
当通过代码将一个用户添加到 xml 文件中时,会创建日志文件,但是当通过代码动态添加第二个用户时,不会创建日志文件。
注意:日志下有两个不同的文件夹。一个用于 FixGateway,另一个用于 FixAcceptor。
我已尝试通过 google 和其他博客搜索问题,但在消除此错误方面没有任何改进。
【问题讨论】:
-
你试过调试代码吗?是否有一些异常被抛出?您是否到达应该删除第一个文件的行?有用吗?
-
@RoyShahaf 第一个文件不应被删除。它应该继续其工作。无论添加了多少附加程序。它应该继续其工作。与第二个附加程序相同。如果第三个 appender 添加了相同的工作等等。
-
您的代码另有说明。 “生成...”方法从删除现有文件开始,然后写入新文件。我错过了什么吗?
-
Log4j xml 文件被删除,这样当下次数据库增加附加程序时,它应该使用现有和新添加的附加程序完全重新加载新的 xml 文件。日志文件应保持原样。如果存在,则只有 xml 文件应替换为新的附加程序。
-
当我问你是否到达删除第一个文件的行时,我的意思是 log4j xml。你还没有回答我的任何问题。你需要帮助吗?