Форматирование в Log4j: возможно ли обрезать трассировки стека?

Вы всегда можете создать массив указателей, указывая на объекты автомобилей, а затем создать объекты в цикле for, как вы хотите, и сохранить их адрес в массиве, например:

#include <iostream>
class Car
{
private:
  Car(){};
  int _no;
public:
  Car(int no)
  {
    _no=no;
  }
  void printNo()
  {
    std::cout<<_no<<std::endl;
  }
};
void printCarNumbers(Car *cars, int length)
{
    for(int i = 0; i<length;i++)
         std::cout<<cars[i].printNo();
}

int main()
{
  int userInput = 10;
  Car **mycars = new Car*[userInput];
  int i;
  for(i=0;i<userInput;i++)
      mycars[i] = new Car(i+1);

примечание новый способ !!!

  printCarNumbers_new(mycars,userInput);


  return 0;
}    

Все, что вам нужно изменить в новом методе, - это обработка автомобилей как указателей, чем статических объектов в параметре и при вызове метода printNo (), например:

void printCarNumbers_new(Car **cars, int length)
{
    for(int i = 0; i<length;i++)
         std::cout<<cars[i]->printNo();
}

на конец main хорош, чтобы удалить всю динамически распределенную память, подобную этой

for(i=0;i<userInput;i++)
  delete mycars[i];      //deleting one obgject
delete[] mycars;         //deleting array of objects

Надеюсь, я помог, ура!

30
задан rompetroll 10 February 2012 в 09:08
поделиться

4 ответа

Вы можете использовать EnhancedPatternLayout в log4j для форматирования трассировок стека.

См. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html , в частности раздел о «бросаемом» шаблоне в таблице шаблонов.

Обратите внимание, что поддержка % throwable {n} довольно нова и требует как минимум log4j 1.2.16 (который является последним на момент написания)

Для целей отслеживания это билет, касающийся его реализации: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

35
ответ дан 27 November 2019 в 23:58
поделиться

Да, это часть log4j, начиная с log4j 1.2.16

Вот исходное предложение в системе отслеживания проблем Apache, в котором подробно описывается, как каждое из приложений% метательный узор выглядит так: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902#c0

1
ответ дан 27 November 2019 в 23:58
поделиться

Ага ... EnhancedPatternLayout предоставляет эту функцию.(Начиная с Log4J-1.2.16, раньше был в лишних товарищах).

Для конфигурации log4j

<appender name="Console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="debug"/>
    <layout class="org.apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%t] %c.%M - %m%n %throwable{short}"/>
    </layout>
</appender>

и для фрагмента кода Java, например

, генерировать новое исключение (новое Exception ("Inner Exception"));

Вы получите следующее в файле журнала ...

java.lang.Exception: java.lang.Exception: Inner Exception

Если мы удалим '% throwable {short} 'из нашего конфигурационного файла log4j мы получим полную трассировку стека

10
ответ дан 27 November 2019 в 23:58
поделиться

Я не знаю такого варианта. Но вы можете расширить текущий аппендер (например, RollingFileAppender) и предоставить метод append / doAppend / subAppend (в зависимости от того, какой класс вы расширяете) для обработки этого.

Выбрасываемая информация содержится в LoggingEvent.throwableInformation

Тем не менее, я не уверен, что вы должны это делать - таким образом, вы можете потерять важную информацию.

1
ответ дан 27 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: