Trong đường ray, tôi muốn ghi lại một số thông tin trong một tệp nhật ký khác chứ không phải tệp development.log hoặc production.log chuẩn. Tôi muốn thực hiện việc ghi nhật ký này từ một lớp mô hình.Làm thế nào để đăng nhập một cái gì đó trong Rails trong một tập tin đăng nhập độc lập?
Trả lời
Bạn có thể tự tạo đối tượng Logger từ bên trong bất kỳ mô hình nào. Chỉ cần vượt qua tên tập tin để các nhà xây dựng và sử dụng các đối tượng như Rails thường logger
:
class User < ActiveRecord::Base
def my_logger
@@my_logger ||= Logger.new("#{Rails.root}/log/my.log")
end
def before_save
my_logger.info("Creating user with name #{self.name}")
end
end
Ở đây tôi sử dụng một thuộc tính lớp để memoize logger. Bằng cách này nó sẽ không được tạo ra cho mỗi đối tượng người dùng duy nhất được tạo ra, nhưng bạn không cần phải làm điều đó. Hãy nhớ rằng bạn có thể tiêm phương thức my_logger
trực tiếp vào lớp ActiveRecord::Base
(hoặc vào một số siêu lớp của riêng bạn nếu bạn không thích khỉ vá quá nhiều) để chia sẻ mã giữa các mô hình ứng dụng của bạn.
class Article < ActiveRecord::Base
LOGFILE = File.join(RAILS_ROOT, '/log/', "article_#{RAILS_ENV}.log")
def validate
log "was validated!"
end
def log(*args)
args.size == 1 ? (message = args; severity = :info) : (severity, message = args)
Article.logger severity, "Article##{self.id}: #{message}"
end
def self.logger(severity = nil, message = nil)
@article_logger ||= Article.open_log
if !severity.nil? && !message.nil? && @article_logger.respond_to?(severity)
@article_logger.send severity, "[#{Time.now.to_s(:db)}] [#{severity.to_s.capitalize}] #{message}\n"
end
message or @article_logger
end
def self.open_log
ActiveSupport::BufferedLogger.new(LOGFILE)
end
end
Một lựa chọn phong nha mà làm việc cho tôi là chỉ cần thêm một lớp khá đơn giản vào thư mục app/models
của bạn như app/models/my_log.rb
class MyLog
def self.debug(message=nil)
@my_log ||= Logger.new("#{Rails.root}/log/my.log")
@my_log.debug(message) unless message.nil?
end
end
sau đó trong điều khiển của bạn, hoặc thực sự gần như bất cứ nơi nào mà bạn có thể tham khảo một mô hình lớp học từ trong ứng dụng đường ray của bạn, tức là bất cứ nơi nào bạn có thể làm Post.create(:title => "Hello world", :contents => "Lorum ipsum");
hoặc một cái gì đó tương tự bạn có thể đăng nhập vào tập tin tùy chỉnh của bạn như thế này
MyLog.debug "Hello world"
Cập nhật
Tôi đã tạo một đá quý dựa trên giải pháp bên dưới, được gọi là multi_logger. Chỉ cần làm điều này trong initializer:
MultiLogger.add_logger('post')
và gọi
Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.
và bạn đã làm xong.
Nếu bạn muốn mã đó cho mình, xem dưới đây:
Một giải pháp hoàn chỉnh hơn sẽ được đặt sau đây trong thư mục của bạn lib/
hoặc config/initializers/
.
Lợi ích là bạn có thể thiết lập trình định dạng thành dấu thời gian tiền tố hoặc mức độ nghiêm trọng cho nhật ký một cách tự động. Điều này có thể truy cập từ bất cứ nơi nào trong Rails, và trông neater bằng cách sử dụng mẫu đơn.
# Custom Post logger
require 'singleton'
class PostLogger < Logger
include Singleton
def initialize
super(Rails.root.join('log/post_error.log'))
self.formatter = formatter()
self
end
# Optional, but good for prefixing timestamps automatically
def formatter
Proc.new{|severity, time, progname, msg|
formatted_severity = sprintf("%-5s",severity.to_s)
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
"[#{formatted_severity} #{formatted_time} #{$$}] #{msg.to_s.strip}\n"
}
end
class << self
delegate :error, :debug, :fatal, :info, :warn, :add, :log, :to => :instance
end
end
PostLogger.error('hi')
# [ERROR 2012-09-12 10:40:15] hi
Tôi khuyên bạn nên sử dụng Log4r gem để ghi nhật ký tùy chỉnh. Mô tả trích dẫn từ trang của nó:
Log4r là thư viện khai thác toàn diện và linh hoạt được viết bằng Ruby để sử dụng trong chương trình Ruby. Nó có hệ thống đăng nhập phân cấp của bất kỳ số lượng mức độ nào là mức độ , tên cấp tùy chỉnh, thừa kế nhật ký, nhiều đích đầu ra cho mỗi sự kiện nhật ký, theo dõi thực thi, định dạng tùy chỉnh, safteyness luồng, XML và cấu hình YAML, v.v.
Khung ghi nhật ký, với tên đơn giản, tinh tế, có sự tinh tế mà bạn mong muốn!
Làm theo các hướng dẫn rất ngắn logging-rails để bắt đầu lọc ra tiếng ồn, nhận cảnh báo và chọn đầu ra theo cách tinh vi và cấp cao.
Tự vỗ về mặt sau khi bạn hoàn tất. Đăng nhập, hàng ngày. Đáng giá cho điều đó một mình.
Đây là logger tùy chỉnh của tôi:
class DebugLog
def self.debug(message=nil)
return unless Rails.env.development? and message.present?
@logger ||= Logger.new(File.join(Rails.root, 'log', 'debug.log'))
@logger.debug(message)
end
end
class Post < ActiveRecord::Base
def initialize(attributes)
super(attributes)
@logger = Logger.new("#{Rails.root}/log/post.log")
end
def logger
@logger
end
def some_method
logger.info('Test 1')
end
end
ps = Post.new
ps.some_method
ps.logger.info('Test 2')
Post.new.logger.info('Test 3')
Định nghĩa một lớp logger trong (nói) ứng dụng/mô hình/special_log.rb:
class SpecialLog
LogFile = Rails.root.join('log', 'special.log')
class << self
cattr_accessor :logger
delegate :debug, :info, :warn, :error, :fatal, :to => :logger
end
end
khởi tạo logger trong (nói) config/initializers/special_log.rb:
SpecialLog.logger = Logger.new(SpecialLog::LogFile)
SpecialLog.logger.level = 'debug' # could be debug, info, warn, error or fatal
Anyw ở đây trong ứng dụng của bạn, bạn có thể đăng nhập bằng:
SpecialLog.debug("something went wrong")
# or
SpecialLog.info("life is good")
Cảm ơn, hoạt động như một sự quyến rũ! –
- 1. Làm thế nào để tôi đăng nhập một cái gì đó trong thiên thạch?
- 2. Logback - làm thế nào để có được mỗi logger đăng nhập vào một tập tin đăng nhập riêng biệt?
- 3. Đăng nhập một tập tin bằng khóa riêng trong .NET
- 4. Đăng nhập vào một tập tin trên iPhone
- 5. Cần tây Đăng nhập vào tập tin
- 6. Làm thế nào để đăng nhập với pantheios vào một tập tin?
- 7. Symfony 2: Đăng nhập vào một tập tin cụ thể
- 8. Làm thế nào để có được các cửa sổ đăng nhập thông tin đăng nhập từ một ứng dụng Swing?
- 9. Làm thế nào để ngăn chặn cắt tập tin đăng nhập với mô-đun đăng nhập python?
- 10. log4j trong grails: cách đăng nhập vào tập tin?
- 11. Làm thế nào để đăng nhập lỗi, tin nhắn trong một thử nghiệm đơn vị NUnit?
- 12. Để đăng nhập hoặc không đăng nhập?
- 13. Làm thế nào để Digitally "Đăng nhập" một tài liệu
- 14. Làm thế nào để đăng nhập ngoại lệ trong JavaScript
- 15. Làm thế nào để làm cho WebLogic đăng nhập tất cả "console" tin nhắn vào một tập tin?
- 16. Sự khác nhau giữa thông tin đăng nhập và thông tin đăng nhập trong SQL Server 2008 là gì?
- 17. Ruby on Rails: Cách tốt nhất để thêm đăng nhập Facebook, đăng nhập Twitter, đăng nhập OpenID, v.v.
- 18. Làm thế nào để bạn nhập một cái gì đó tại một dấu nhắc DOS Lập trình?
- 19. Làm cách nào để cập nhật bảo mật trong tập lệnh đăng nhập của tôi từ MD5 lên một cái gì đó an toàn hơn?
- 20. Làm cách nào để định cấu hình đăng nhập log4j cho một cái bình?
- 21. Làm thế nào để đăng nhập các tác giả độc nhất trong git?
- 22. Tôi làm cách nào để đăng nhập một người dùng?
- 23. "Đăng nhập" hoặc "Đăng nhập" hoặc "Đăng nhập"
- 24. Một cái gì đó như jQuery.extend() nhưng độc lập?
- 25. Làm thế nào để bạn yêu cầu đăng nhập cho các tập tin media ở Django
- 26. Làm thế nào để đăng một mảng trong Rails
- 27. pastebinit cách đăng thông tin đăng nhập bằng thông tin đăng nhập?
- 28. Rails Devise: Đăng nhập từ một tên miền khác
- 29. Làm thế nào để tự động đăng nhập một phần web owa trong sharepoint 2010
- 30. Làm thế nào để đăng nhập nội bộ của một đối tượng tùy ý trong Java?
Nếu bạn muốn thay đổi tất cả ghi nhật ký mặc định cho mô hình cụ thể đó, bạn có thể sử dụng đơn giản 'User.logger = Logger.new (STDOUT)' hoặc bất cứ nơi nào bạn muốn để đăng nhập. Trong cùng một cách, 'ActiveRecord :: Base.logger = Logger.new (STDOUT)' sẽ thay đổi tất cả ghi nhật ký cho tất cả các mô hình. – Dave
Bất cứ ai cũng biết cách tạo thư mục cho mỗi nhật ký? –
@Dave Tôi đã thử đề xuất của bạn và không thành công. 'User.logger = Logger.new (STDOUT)' thay đổi tất cả ghi nhật ký cho tất cả các mô hình. Vâng, nó đã thay đổi 'ActiveRecord :: Base.logger' – fetsh