QA #232
未完了Redmine自体の操作ログ記録方法
0%
説明
■要望
Redmine自体のアクセスログを取得したい。
実際に操作したID、操作内容を記録したい。
■解決策
application_controller中にafter_filterを定義して、
操作ログをテキストファイルに出力する方法。
https://groups.google.com/forum/#!topic/redmine-users-ja/T1b7j4UM1XA
app/controllers/application_controller.rb
after_filter :access_logging
def access_logging
パスワードを削除してログ出力
RAILS3以降では、RAILS_ROOTが未定義エラーになります。
下記の様にRails.rootに変更してください。
log = Logger.new(File.join(Rails.root, "/log/access.log"), "daily")
■対応状況
ソース修正で対応
■補足
RAILS5では xxx_filter が非推奨になりました。
xxx_actionに変更した方が良さそうです。
語削除時の調査にも役立ちます。
チケット削除のログは、 destroy で検索すれば出てきます。
(チケット消えるとサーバ誤動作を疑われるので、adminの自己防衛としても必要)
RAILS5では、ActionController::Parameters がHashを継承しなくなったため、
一部プラグインでは下記エラー発生する模様(2020/2現在)
詳細→ #note-12
奈良 裕記 さんが6年以上前に更新
3.4-unofficialcooking implemented
https://github.com/y503unavailable/redmine/issues/6
コピペ追加用抜粋(2017/11時点)
app/controllers/application_controller.rb
after_action :access_logging
def access_logging
params.delete(:password)
params.delete(:password_confirmation)
params.delete(:new_password)
params.delete(:new_password_confirmation)
req_param = params.map {|key,value| "#{key} => #{value}"}.join(",")
message = "#{User.current.login}: #{req_param}"
log = Logger.new(File.join(Rails.root, "/log/access.log"), "daily")
log.formatter = Logger::Formatter.new
log.info(message)
log.close
end
奈良 裕記 さんが4年以上前に更新
Redmine4(Rails5)の場合、mapが使用不可なので、下記に変更する必要があります。
map → to_unsafe_h.map
Redmine4 コピペ用
app/controllers/application_controller.rb
after_action :access_logging
def access_logging
params.delete(:password)
params.delete(:password_confirmation)
params.delete(:new_password)
params.delete(:new_password_confirmation)
req_param = params.to_unsafe_h.map {|key,value| "#{key} => #{value}"}.join(",")
message = "#{User.current.login}: #{req_param}"
log = Logger.new(File.join(Rails.root, "/log/access.log"), "daily")
log.formatter = Logger::Formatter.new
log.info(message)
log.close
end
ActionController::Parameters がHash継承しなくなった
to_h では、permitのチェックが入りエラーになるため、ここでは to_unsafe_h を利用した。
奈良 裕記 さんが約4年前に更新
RAILS5では、ActionController::Parameters がHashを継承しなくなったため、
一部プラグインでは下記エラー発生する模様(2020/2現在)
エラー発生プラグイン https://github.com/southbridgeio/redmine_knowledgebase
(Redmineコア/他のPluginでは正常に動作している)
Completed 500 Internal Server Error in 148ms (Views: 38.4ms | ActiveRecord: 25.3ms)
NoMethodError (undefined method `to_unsafe_h' for #<ActiveSupport::HashWithIndifferentAccess:0x00007fdbd6085ae8>):
app/controllers/application_controller.rb:76:in `access_logging'
req_param = params.to_unsafe_h.map {|key,value| "#{key} => #{value}"}.join(",")
上記関連個所をコメントアウトしたところ、プラグインの機能は動作した。
Rails 4 では、 ActionController::Parameters の親クラスの親クラスがHashです。
つまり、ハッシュと継承関係にあるのでハッシュと同じように振る舞います。
ハッシュを継承しているので、 "ActionController::Parameters is a Hash"と言えます。
つまりハッシュと完全な互換性があります。(後述するキーの扱いを除いて)
なお、Rails5では、使い方によっては安全のためのフラグがクリアされてしまうなど、
パラメータへのアクセス以外のメソッド(Enumerable由来のものなど)が使えてしまうことの弊害があることから、
ActionController::parameters は HashWithIndifferentAccess のサブクラスではなくなっています。
https://qiita.com/zenpou/items/950432bae246063786e8#paramsuser%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%81%AFhash%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%B6%99%E6%89%BF%E3%81%97%E3%81%A6%E3%81%AA%E3%81%84
params[:user]の中身はhashクラスを継承してない。
Action Controller Parameters
https://api.rubyonrails.org/v5.2.4/classes/ActionController/Parameters.html