[英]Skipped and duplicated line numbers in log4J output
我已經設置了log4j,但是我注意到這樣的奇怪輸出(我希望看到0 1 2 3 4是行號)-
0 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 0011110101101010110110111011101111110001010001110011100011110111011001011100100100101001100110100000011100010100
2 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 112
2 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 0010100111111010110110010001000100000110110111111011011100101010011100011001111111111011110011001111010100100101
3 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 112
3 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 0101101000001010000001101000101001001000111111111110001010011001111011010101011010010000111000100011110010101100
3 [main] DEBUG org.dnsdojo.ryanhost.GA.MuPlusOne.Genome - 112
誰能解釋為什么會這樣? log4j.properties#定義控制台附加程序log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
# now define the layout for the appender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# now map our console appender as a root logger, means all log messages will go to this appender
log4j.rootLogger = DEBUG, consoleAppender
基因組類別
package org.dnsdojo.ryanhost.GA.MuPlusOne;
import java.util.Random;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Genome
{
private static Logger logger = Logger.getLogger(Genome.class);
byte[] genome;
Random rng = new Random();
String genomeString = "";
public Genome ( int stringLength, int motorSet )
{
PropertyConfigurator.configure("log4j.properties");
genome = new byte[ stringLength * 7 * motorSet]; // stringLength depends on how many bytes you wish to have. For the arpibot this is dependant on the number of sensor readings taken
for (int i = 0; i < genome.length; i++)
{
genome[i] = (byte)rng.nextInt(2);
genomeString += genome[i];
}
logger.debug(genomeString);
logger.debug(genomeString.length());
}
public byte[] getGenome()
{
return genome;
}
public byte[] mutate (float mutationStep)
{
return genome; //placeholder
}
}
駕駛員等級
package org.dnsdojo.ryanhost.GA.MuPlusOne;
import java.util.ArrayList;
public class Driver
{
int populationSize = 0; //mu
int evaluationTime = 0; //tau measured in seconds
double reevaluationRate, mutationStep = 0;//rho = reevaluationRate, sigma = mutationStep
int numberOfSensors, numberOfMotors = 0;
ArrayList<Genome> population = new ArrayList<Genome>();
public Driver (int populationSize, int evaluationTime, double reevaluationRate, double mutationStep, int numberOfSensors, int numberOfMotors)
{
this.populationSize = populationSize;
this.evaluationTime = evaluationTime;
this.reevaluationRate = reevaluationRate;
this.mutationStep = mutationStep;
this.numberOfSensors = numberOfSensors;
this.numberOfMotors = numberOfMotors;
for(int i = 0; i < populationSize; i++)
{
population.add (new Genome (numberOfSensors , numberOfMotors) );
}
}
public static void main( String[] args)
{
Driver gADriver = new Driver(100, 60 , 0.2, 0.2, 8, 2);
}
}
此Javadoc頁面針對模式%-4r
聲明以下%-4r
r-用於輸出從布局的構造到創建日志記錄事件所經過的毫秒數。
%-4
表示使用4個空格(填充)寫入r
所需的信息。 因此,我猜測您的日志會如此之快,以至於它們之間只有1-2毫秒的間隔(日志語句中的第一個數字)。 當您實際開始記錄事物時,我們還可以推斷出Pattern布局是惰性構造的。
這與記錄器無關(我使用log4j已經15年了)。 它似乎完全記錄了發送給它的字符串。 再次查看代碼,並與預期的結果進行比較。 nextInt(2)
的Random
生成器正在尋找0-1的值...因此,記錄了0和1的字符串。
for (int i = 0; i < genome.length; i++)
{
genome[i] = (byte)rng.nextInt(2);
genomeString += genome[i];
}
logger.debug(genomeString);
logger.debug(genomeString.length());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.