【问题标题】:Skipped and duplicated line numbers in log4J outputlog4J 输出中跳过和重复的行号
【发布时间】:2013-03-07 18:44:21
【问题描述】:

我已经设置了 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);
}

}

【问题讨论】:

  • 已经提供了一些答案,但这个问题并不清楚。每当某些事情“超出预期”时,请定义预期的内容。 “谁能解释为什么会发生这种情况?”
  • 对不起,我原以为这从问题中的“跳过和重复的行号”中可以清楚地看出,这表明我期望编号会连续增加。编辑问题以反映这一点

标签: java logging log4j


【解决方案1】:

Javadoc page 声明了模式%-4r 的以下内容

r - 用于输出从 在创建日志事件之前构建布局。

%-4 表示使用 4 个空格(填充)来写入r 所需的信息。所以我猜你的日志一个接一个地来得如此之快,以至于它们之间只有 1-2 毫秒(你的日志语句中的第一个数字)。我们还可以推断,当您实际开始记录事物时,Pattern 布局是延迟构建的。

【讨论】:

  • 这可能是他的意思,但不确定。模式和输出看起来不错: ConversionPattern=%-4r [%t] %-5p %c %x - %m%n ...如果您查看破折号 (-),然后是输出。这与之前的一切无关。 %m 是消息,%n 是换行符。
  • 我曾假设初始数字实际上是行号,因为我习惯于阅读 notepad++ 输出。我已经复制/粘贴了这个属性文件,但没有意识到它显示的是经过的毫秒数,这更有意义。回想起来,这是一个糟糕的问题,但这个答案让我看到了这一点。感谢您的帮助
【解决方案2】:

这与记录器无关(我使用 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());

【讨论】:

  • 我认为他不是这个意思。行号与他的日志语句开头一样。
  • 问题是“奇怪的输出”......暗示着其他的东西。也许他的意思是第一个字节。否则,模式和输出看起来像预期的那样: ConversionPattern=%-4r [%t] %-5p %c %x - %m%n ...如果您查看破折号 (-),然后是输出.这与之前的一切无关。 %m 是消息,%n 是换行符。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2017-06-03
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多