Wie kann ich die Protokollierung von Asset-Pipeline-Nachrichten (Kettenrädern) in Ruby on Rails 3.1 deaktivieren?

378

Kettenräder sind im (dev) -Protokoll unter Ruby on Rails 3.1 (RC1) standardmäßig ziemlich ausführlich:

Started GET "/assets/application.css" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/application.css.scss  (5ms)  (pid 6303)


Started GET "/assets/application.js" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/default.css.scss  (15ms)  (pid 6303)

...
Started GET "/assets/default/header_bg.gif" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Served asset /default/header_logo.gif - 304 Not Modified  (7ms)  (pid 6303)
Served asset /default/header_bg.gif - 304 Not Modified  (0ms)  (pid 6246)
Served asset /default/footer_bg.gif - 304 Not Modified  (49ms)  (pid 6236)
...

Ich möchte entweder die Ausführlichkeit verringern oder sie ganz deaktivieren.

Ich gehe davon aus, dass es eine saubere Möglichkeit gibt, die Ausführlichkeit der Protokollierung zu deaktivieren oder zu verringern, indem eine Konfigurationszeile hinzugefügt wird, in der ActiveRecord SQL-Anweisungen entweder environment.rboder development.rbähnlich config.active_record.logger = nilstummgeschaltet werden.

istvanp
quelle
Jemand hat einen Fehler gemeldet: # 2639 . Stand 9/2 noch "offen".
Istvanp
14
Die akzeptierte Antwort auf diese Frage sollte geändert oder aktualisiert werden. In Rails 3.2 können Sie einfach config.assets.debug = falseIhre development.rb eingeben.
Stewart Johnson
7
@StewartJohnson - config.assets.debug = falsewird Assets in einer einzigen Datei verketten - nicht das, was die meisten Leute in der Entwicklung wollen
Yarin

Antworten:

382

Geben Sie den folgenden Code ein config/initializers/quiet_assets.rb

if Rails.env.development?
  Rails.application.assets.try(:logger=, Logger.new('/dev/null'))
  Rails::Rack::Logger.class_eval do
    def call_with_quiet_assets(env)
      previous_level = Rails.logger.level
      Rails.logger.level = Logger::ERROR if env['PATH_INFO'] =~ %r{^/assets/}
      call_without_quiet_assets(env)
    ensure
      Rails.logger.level = previous_level
    end
    alias_method_chain :call, :quiet_assets
  end
end

Aktualisiert: Es funktioniert jetzt auch für Ruby on Rails 3.2 (frühere Fehlerbehebungen before_dispatch, und jetzt greifen wir callstattdessen zum Root-Rack )

Update: Eine geeignete Rack-Middleware-Lösung (statt zerbrechlich alias_method_chain) von @macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735

Choonkeat
quelle
3
Ab Rails 3.2.1 unterdrücken diese Zugvorgänge allein nicht die Protokollierung des Kettenrads, und die Datei von choonkeat wird weiterhin benötigt.
IAmNaN
5
Tatsächlich. Klingt so, als würde diese Datei immer benötigt, da durch die Einstellung config.assets.loggerauf false nur die Sprockets-Ausgaben stummgeschaltet werden. Dadurch werden die Anfragen / Antworten des Action Packs zum Schweigen gebracht. Dies ist etwas, von dem die Rails-Entwickler erklärt haben, dass sie nicht beabsichtigen, es für Sonderfälle zum Schweigen zu bringen .
Ben Kreeger
32
ähm. Sie sollten dies nur in Schienenkern bekommen. Machen Sie es zu einer Option in config.assets
jsharpe
2
Bei Fenstern durch '/dev/null'' NUL' ersetzen
Matt
4
Funktioniert für mich auf Rails 4.2.0
Serienmotor
189

Schauen Sie sich https://github.com/evrone/quiet_assets an und fügen Sie es einfach in Ihre Gem-Datei ein.

Für die Faulen: gem 'quiet_assets', group: :development

Route
quelle
6
Tolle Arbeit, aber sehr traurig, dass dafür ein separates Juwel benötigt wird.
Adam Spires
1
Ich denke, Jose Valim hat hier die richtige Entscheidung getroffen. Github.com/rails/rails/issues/2639 Rails muss alle eingehenden Anfragen protokollieren. Ich stimme dem zu. Ich denke, wir können diesen Overhead beseitigen, wenn Kettenräder die Quellkarte github.com unterstützen / Sstephenson / Kettenräder / Probleme / 310
Route
5
für die Faulen: gem 'quiet_assets'(bitte füge dies dem Beitrag hinzu :))
reto
52

Fügen Sie für Ruby on Rails 3.2 die config.assets.logger = falseKonfigurationsdatei Ihrer Entwicklungsumgebung hinzu, die normalerweise unter zu finden ist config/environments/development.rb. Siehe # 4512 .

Ouranos
quelle
Funktioniert wie erwartet in Raise 4. Muss den Server neu starten, damit dies funktioniert.
Langusten Gustel
2
Rails 4.0.2 config.assets.logger = nilfunktioniert für mich
byterussian
4
Rails 4.0.4 config.assets.logger = nilfunktioniert NICHT für mich
Hendrikbeck
28

Zwei Dinge sind genug:

  1. config.assets.debug = false im config/enviroments/development.rb
  2. rake assets:precompile. Siehe Kommentar von @oma unten; Dies wird nicht benötigt

Das ist alles!

Lisovsky Vlad
quelle
19
1. ist richtig. Vielen Dank! Bitte entfernen Sie Nr. 2. rake assets:precompileist nicht etwas, was wir in der Entwicklung tun wollen
oma
Während dies zum Zeitpunkt der Veröffentlichung der ursprünglichen Frage wahrscheinlich nicht funktionierte, funktioniert es jetzt (und, wie @Race sagte, bereits mit 3.2.3) und sollte es jetzt die akzeptierte Antwort geben.
Radiospiel
2
Wie istvanp weiter unten ausführt, macht das nicht das, was Sie denken. Es werden nur alle JS- und CSS-Assets in einer einzigen großen Datei kompiliert. Die Protokollierung für Assets wird nicht deaktiviert.
Davidgoli
2
Dies ist alles, was in Schienen 4.2.2
thisfeller
Hinzufügen zu dem, was @davidgoli gesagt hat: config.assets.debug steuert die Verkettung von Assets. Wenn Sie dies deaktivieren, wird das Debuggen von z. B. JS und CSS mit dem Browser zu mehr Arbeit. So etwas wie quiet_assets unterdrückt die Protokollierung, ohne dass Sie Assets.debug umschalten müssen, um das Debuggen durchzuführen.
Johncip
27

Irgendwann wird es so sein config.assets.logger = nil, aber dieser Teil wird derzeit auf dem Master gestoppt (noch nicht fertig).

Colinross
quelle
5
Funktioniert bei mir auch nicht auf Rails 3.1.3. @nessur: Bist du sicher , dass es für dich funktioniert? Wie Tim sagt, ist # 2639 noch offen, und ich sehe in dieser Ausgabe keinen Hinweis auf einen Fix (beide Pull-Anfragen, auf die verwiesen wurde, wurden abgelehnt).
Adam Spires
Dies wird in dieser Phase nicht implementiert. github.com/rails/rails/issues/4569
23inhouse
@AdamSpiers gemäß dem Link: github.com/rails/rails/pull/3795#issuecomment-3549669 "Rails wird keinen der Logger oder Logger-bezogenen Middlewares dazu bringen, bestimmte Routen nicht zu protokollieren"
23inhouse
3
Schade. Rails 4 kann die Asset-Protokollierung immer noch nicht einfach deaktivieren.
Tom Rossi
1
Ich verwende Rails 4.2, füge dies in mein ein development.rbund es deaktiviert die Protokollierung von Assets.
Jack
12

Ich weiß, dass es eine hässliche und vorübergehende Lösung ist, aber ich benutze diese:

tail -f log / development.log | grep -vE 'Asset'

Sucrenoir
quelle
9
Hier ist eine verbesserte, die auch Leerzeilen entfernt:tail -f log/development.log | grep -vE "(^\s*$|asset)"
istvanp
12

Viele Menschen sind verwirrt über die Verwendung von config.assets.logger = false. Hier ist, was es tut und was es nicht tut.

Laut Quelldokumentation :

Wenn Sie config.assets.loggerden Wert auf false setzen, wird die Protokollierung der bereitgestellten Assets deaktiviert.

Dies ist jedoch wahrscheinlich nicht das, was Sie denken. Es werden nur Kettenrad-Serving-Protokolle deaktiviert , nicht Ruby on Rails-Actionpack-Anforderungsprotokolle. Der Ruby on Rails-Betreuer erklärt dies hier deutlich: https://github.com/rails/rails/issues/4569#issuecomment-3594500


Am Beispiel des Links sind solche Protokolle deaktiviert:

Served Asset /jquery.isotope.js - 304 Nicht geändert (0 ms)

Protokolle wie dieses sind es jedoch nicht

GET "/assets/jquery.isotope.js?body=1" für 127.0.0.1 wurde am 20.01.2012 um 23:16:46 -0500 gestartet

lulalala
quelle
10
config.assets.quiet = true

Dies ist der neueste Weg.

Adam Waite
quelle
Funktioniert perfekt in Rails 5. Einfach indevelopment.rb
Andreykul
Verbunden mit Debug, löst nicht alle meine Bedürfnisse in Rails 5.
Pysis
7

Verwenden:

Rails.application.assets.logger = Logger.new(RUBY_PLATFORM =~ /(win|w)32$/ ? "NUL" : "/dev/null")
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end

Es ist der gleiche Code choonkeat hinzugefügt . Ich habe es nur eingefügt, um auch unter Windows zu funktionieren.

Celso Dantas
quelle
7

In der Datei development.rb in config / environment finden Sie die Zeile config.assets.debug = true.

Schalten Sie das auf falseund der größte Teil der Asset-Load-Ausgabe ist weg. Auf meinem System verbleiben nur die beiden Anforderungen für application.css und .js.

TKAB
quelle
3
Mit dieser Einstellung können Sie die Stylesheets und Javascript nur in separate Dateien aufteilen, wenn sie zum einfacheren Debuggen auf true gesetzt sind. Bei der Einstellung false (Standardeinstellung) werden alle in einer großen Datei zusammengefasst. Es reduziert zwar die Debug-Ausgabe, aber wenn Sie beispielsweise Bilder haben, sind diese überhaupt nicht betroffen. Offizielle Guide Infos hier .
Istvanp
1
Aha. Danke, dass du das geklärt hast. Ich habe die Einstellung dieser Variablen jedoch nicht geändert, daher war meine Standardeinstellung true.
TKAB
5

Fügen Sie in der Datei config / environment / development.rb Folgendes hinzu:

config.assets.debug = false

config.assets.logger = false
Najam Tariq
quelle
2

Lograge for the Win - Die nervigen Logger- Standardeinstellungen von Ruby on Rails werden sofort beendet (z. B. Protokollieren von Assets, Protokollieren von Teilrendering) und können angepasst werden, wenn Sie bestimmte Elemente hinzufügen / entfernen möchten.

Yarin
quelle
0

Die zuvor erwähnte verknüpfte Lösung hilft:

https://github.com/evrone/quiet_assets

Auch wie unten funktioniert es gut für mich:

3.1 (nur) (3.2 Pausen vor_Dipatch)

app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end
3.2 Rails - Rack root tap approach
app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end
Sumit Munot
quelle
-1

config.log_level = :errorFügen Sie in config / environment die zu ändernden .rb-Dateien hinzu. Dadurch werden die Protokolleinstellungen nur auf Fehler geändert.

Chris O.
quelle
Leider nein, da ich das Protokoll hauptsächlich zum Anzeigen der Anforderungs- und SQL-Daten verwende, die sich auf Debug-Ebene befinden. Asset-Nachrichten haben eine Info-Ebene (die niedriger als die Debug-Ebene ist), sodass es keinen Sinn macht, mit dieser Einstellung das zu bekommen, was ich will.
Istvanp
2
Das ist keine gute Idee. Es werden andere Nachrichten auf Informationsebene ausgeblendet, die Sie möglicherweise noch protokollieren möchten.
ifightcrime