четверг, 16 сентября 2010 г.

Log4j file header

Давно не писал, но тут накипело. Читал буквально позавчера статью Модульный дизайн, или «что такое DIP, SRP, IoC, DI и т.п.». Вот там говориться про великий Log4j, какой он распрекрасный. И вот понадобилось мне сделать header для файлов. Такой вот конфиг:
  1. <appender name="eventhistoryfile" class=" org.apache.log4j.RollingFileAppender">  
  2.     <param name="LogFileName" value="${log4j.file.name}"/>  
  3.   
  4.     <layout class="org.apache.log4j.PatternLayout">  
  5.         <param name="ConversionPattern" value="${log4j.pattern}"/>  
  6.     </layout>  
  7. </appender>  
Очень простой.. Как добавить хедер? Оказывается PatternLayout содержит пустую реализацию метода getHeader. Ну и как это называется??? Ладно, сделал свой, который добавляет эту функциональность, не сложно. Идём дальше. Запустил, работает. Вырубил приложение, запустил ещё раз появился ещё один header в файле О_о я нахожусь в шоке. Пришлось ещё наследоваться от RollingFileAppender и переопределять у него метод writeHeader, чтобы header в файл писался один раз (код взят в исходном FileAppender  только добавлена последняя проверка).
  1. @Override  
  2. protected void writeHeader() {  
  3.     if (this.layout == null) {  
  4.         return;  
  5.     }  
  6.     String header = layout.getHeader();  
  7.     if (header == null && this.qw == null) {  
  8.         return;  
  9.     }  
  10.     File f = new File(this.getFile());  
  11.     if (!f.exists() || (f.exists() && f.length() == 0)) {  
  12.         this.qw.write(header);  
  13.     }  
  14. }  
Вообщем, негодую.

6 комментариев:

  1. Ололо, в последнем листинге в последнем ифе некошерность: if (!f.exists() || (f.exists() && f.length() == 0)) это же ведь семантически до же самое, что if (!f.exists() || f.length() == 0), но проще и работает быстрее.

    ОтветитьУдалить
  2. Да, это уже зарефакторил раньше, но спасибо :) Просто вначале вообще не было проверки на существования файла =DDD И выбросил в блог не дорефакторенный код в порыве негодования :)))
    Пора валить на дот неты наверное, как считаешь? =D

    ОтветитьУдалить
  3. Так, как на каменты подписаться? Никаких извещений - я удручён.

    А вообще, нужно валить на гопнет, да. Он прекрасней.

    ОтветитьУдалить
  4. скриншот, как это сделать :)
    Да, он меня ещё прельщает официальным со стороны MS F#.

    ОтветитьУдалить
  5. Набрось идею, что можно написать на эфшарпе для нормальной тренировки, например.

    ОтветитьУдалить
  6. Если чисто теоретическую, то Top Coder (; или мне вот например понравился вот этот конкурс.
    Если практическая, то в том же ПФП тоже было описание интересной задаче на Erlang. Вообщем, что-то вроде offline broser. Закачка самих страниц и контента (картинок, css, js). И чтобы многопоточно :)

    ОтветитьУдалить