2013-03-13 63 views
3

我維護一個充當JSON API服務的Sinatra應用程序。該API由另一個Web應用程序以及移動應用程序使用。使用Sinatra和Rack Logger過濾敏感信息

我想要做的是讓Rack :: CommonLogger從其日誌中排除敏感信息,如密碼。 Rails啓用了此設置,但是我沒有找到關於如何在Sinatra中執行此操作的文檔。

任何幫助,將不勝感激。

回答

5

您可以嘗試攔截調用write,並篩選出敏感的消息,像這樣:

logger = Logger.new("my_common.log") 
logger.instance_eval do 
    def write(msg) 
    self.send(:<<, msg) if !msg.match /SUPER SENSITIVE INFO HERE/ 
    end 
end 

然後,配置機架:: CommonLogger使用記錄器的這個實例:

config.middleware.use Rack::CommonLogger, logger 

希望這有助於

+0

如果您將此片段添加到config.ru,您需要創建新的記錄器:: :: Logger.new。 (是的,添加兩個冒號,以便您在根名稱空間中查找Logger,而不是當前的)。否則,您將得到一個Rack :: Logger實例,該實例不起作用(no << method,等等)。 – 2014-07-10 15:12:14

0

sinatra登錄到stderr這是一個IOm,但我們不想存儲其他人的密碼

module NoTokenLogging 
    def write(*args) 
    args.first.sub!(/password=\S+/, "password=[FILTERED]") 
    super 
    end 
end 
IO.prepend NoTokenLogging 
+0

這原則上工作,但也會匹配非空格字符(即,'password = FOO&user = bar'會被變形爲'password = [FILTERED]')。除此之外,如果您希望使用'IO'對象將'password ='寫入流中,這將會產生影響。 – Blaskovicz 2015-10-22 14:32:53

+0

爲了使這個更通用(和正則表達式更正確),你可以這樣做: '%w(令牌密碼).each {| filter_param | args.first.sub!(/#{filter_param} = \ S +?\ b /,「#{filter_param} = [FILTERED]」)}',但我想(例如)是否構建需要的代理要以相同的格式發送證書,這會因上面提到的問題而中斷。 – Blaskovicz 2015-10-22 14:47:01