Давно не писал, но тут накипело. Читал буквально позавчера статью
Модульный дизайн, или «что такое DIP, SRP, IoC, DI и т.п.». Вот там говориться про великий Log4j, какой он распрекрасный. И вот понадобилось мне сделать header для файлов. Такой вот конфиг:
- <appender name="eventhistoryfile" class=" org.apache.log4j.RollingFileAppender">
- <param name="LogFileName" value="${log4j.file.name}"/>
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="${log4j.pattern}"/>
- </layout>
- </appender>
Очень простой.. Как добавить хедер? Оказывается
PatternLayout содержит пустую реализацию метода
getHeader. Ну и как это называется??? Ладно, сделал свой, который добавляет эту функциональность, не сложно.
Идём дальше. Запустил, работает. Вырубил приложение, запустил ещё раз появился ещё один header в файле О_о я нахожусь в шоке. Пришлось ещё наследоваться от
RollingFileAppender и переопределять у него метод
writeHeader, чтобы header в файл писался один раз (код взят в исходном
FileAppender только добавлена последняя проверка).
- @Override
- protected void writeHeader() {
- if (this.layout == null) {
- return;
- }
- String header = layout.getHeader();
- if (header == null && this.qw == null) {
- return;
- }
- File f = new File(this.getFile());
- if (!f.exists() || (f.exists() && f.length() == 0)) {
- this.qw.write(header);
- }
- }
Вообщем,
негодую.
Ололо, в последнем листинге в последнем ифе некошерность: if (!f.exists() || (f.exists() && f.length() == 0)) это же ведь семантически до же самое, что if (!f.exists() || f.length() == 0), но проще и работает быстрее.
ОтветитьУдалитьДа, это уже зарефакторил раньше, но спасибо :) Просто вначале вообще не было проверки на существования файла =DDD И выбросил в блог не дорефакторенный код в порыве негодования :)))
ОтветитьУдалитьПора валить на дот неты наверное, как считаешь? =D
Так, как на каменты подписаться? Никаких извещений - я удручён.
ОтветитьУдалитьА вообще, нужно валить на гопнет, да. Он прекрасней.
скриншот, как это сделать :)
ОтветитьУдалитьДа, он меня ещё прельщает официальным со стороны MS F#.
Набрось идею, что можно написать на эфшарпе для нормальной тренировки, например.
ОтветитьУдалитьЕсли чисто теоретическую, то Top Coder (; или мне вот например понравился вот этот конкурс.
ОтветитьУдалитьЕсли практическая, то в том же ПФП тоже было описание интересной задаче на Erlang. Вообщем, что-то вроде offline broser. Закачка самих страниц и контента (картинок, css, js). И чтобы многопоточно :)