ruby - 在每个线程的基础上设置 ruby​​ logger.progname

标签 ruby multithreading logging mechanize

我有这个:

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 类来同步它,因此失去了并行计算,因为我必须等待请求被发送如果我想在日志中获取正确的程序名,则在继续之前收到。

有没有一种方法可以不使用 Mutex 类来做到这一点。在实时并行运行线程时,在每个线程的基础上设置程序名称。

最佳答案

我终于找到了答案。您定义一个线程局部变量并修改日志格式化程序以在记录时包含它。这是修改格式化程序的代码。

  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'

关于ruby - 在每个线程的基础上设置 ruby​​ logger.progname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8249243/

相关文章:

ruby-on-rails - rails 数组在生产中输出奇怪的格式

ruby-on-rails - 将所有以前的迁移文件保存在 rails 中的目的是什么?

ruby - 雷神 CLI : Setting a custom order of commands in help output

c++ - 锁、互斥和临界区之间的区别

ios - 如何以编程方式获取 iOS 应用程序中的日志消息?

ruby - 逻辑或操作顺序/优先级不符合预期

java - 如何使用静态变量和线程提高 Java 性能?

c# - 异步操作的非合作取消

php - 无法在 Yii 中看到日志文件

spring-boot - 使用 Logback MDC 进行 Spring Boot ErrorController 日志记录