Self или @ для атрибута класса?
Это одно и тоже. self.dir = вызывает dir=, который вы создали, когда указали attr_accessor :dir, выглядит это как-то так:def dir=(str)
  @dir = str
end
Потому логично использовать напрямую @, еще и на 4 символа короче=)
Плюс @ что его можно использовать и без attr_accessor. Но если нужны геттер и сеттер, то лучше использовать attr_accessor, чем писать их самому, потому что ваш код будет на руби, а attr_accessor написан на С.
Ваш простой вопрос не так прост, как кажется. 
Недостаток инстанс переменных в том, что по умолчанию они имеют значение nil и поэтому возможно пропустить опечатку. К этому многие приходят, потому что рано или поздно пишут код, в котором для инстанс переменной допустимо значение nil, а оно там всегда nil из-за опечатки. Инстанс переменные хороши для мемоизации, но их использование лучше сократить до минимума.
В данном случае нет идеального решения, потому что в руби нельзя объявить приватный setter.
Т.е. в следующем коде class Log_parse
  attr_accessor :dir

  def initialize
    self.dir = "" 
  end
end
руби не поймет, что вы из одного и того же класса вызываете сеттер. self считается объектом, а вызов через точку - вызовом публичного метода. Идеальный вариантом был бы случай, когда вы отдельно определяете отдельно публичные аксессоры, отдельно приватные и пользуетесь только аксессорами, но в руби так сделать нельзя (без костылей по крайней мере).
В итоге совет следующий:
В остальных методах класса использовать только аксессоры - публичные или приватные.
В конструкторе уже возможны варианты. Если вы считаете, что объявление публичных аксессоров никак не навредит классу, лучше использовать аксессоры. Иначе - инстанс переменные.