установить ruby ​​logger.progname для каждого потока - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть это:

class Stress
  def initialize(user, pass)
    @user = user
    @pass = pass
    @agent = Mechanize.new do |a|
      a.user_agent_alias = 'Windows Mozilla'
      a.history.max_size = 0
      a.log = my_log
      a.log.progname = @user
    end
  end
  def browse
  @agent.log.progname = @user
  # open/close page
  end
end

my_log = Logger.new('dump.log')
my_log.level = Logger::DEBUG
atom = Mutex.new

for i in (Attempts_start..Attempts_end)
  threads << Thread.new(Creden_base + i.to_s) do |user|
    stress = Stress.new(user, user)
    for j in (0..Attempts_req) do
        atom.synchronize {stress.browse} # has to be atomic
    end
  end
end

Приведенный выше код корректно идентифицирует различные потоки пользователя, устанавливая progname, но проблема в том, что мне нужно использовать класс Mutex для его синхронизации, что приводит к потере параллельных вычислений, поскольку мне приходится ждать отправки запроса и получил, прежде чем продолжить, если я хочу получить правильную progname в журналах.

Есть ли способ сделать это без использования класса Mutex. Установите progname для каждого потока при параллельном выполнении потоков в реальном времени.

1 Ответ

13 голосов
/ 01 декабря 2011

Я наконец нашел свой ответ.Вы определяете локальную переменную потока и изменяете средство форматирования журнала, чтобы включить его при ведении журнала.Вот код для изменения форматера.

  Log.formatter = proc do |severity, datetime, progname, msg|
    "#{severity} [#{Time.now.strftime('%H:%M:%S')}] #{Thread.current['id']} --> #{msg}\n"
  end

И в каждом потоке вы бы добавили что-то вроде этого: Thread.current['id'] = 'whatever'

...