관리-도구
편집 파일: CommonLogger.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>class Rack::CommonLogger - rack-2.2.10 Documentation</title> <script type="text/javascript"> var rdoc_rel_prefix = "../"; var index_rel_prefix = "../"; </script> <script src="../js/navigation.js" defer></script> <script src="../js/search.js" defer></script> <script src="../js/search_index.js" defer></script> <script src="../js/searcher.js" defer></script> <script src="../js/darkfish.js" defer></script> <link href="../css/fonts.css" rel="stylesheet"> <link href="../css/rdoc.css" rel="stylesheet"> <body id="top" role="document" class="class"> <nav role="navigation"> <div id="project-navigation"> <div id="home-section" role="region" title="Quick navigation" class="nav-section"> <h2> <a href="../index.html" rel="home">Home</a> </h2> <div id="table-of-contents-navigation"> <a href="../table_of_contents.html#pages">Pages</a> <a href="../table_of_contents.html#classes">Classes</a> <a href="../table_of_contents.html#methods">Methods</a> </div> </div> <div id="search-section" role="search" class="project-section initially-hidden"> <form action="#" method="get" accept-charset="utf-8"> <div id="search-field-wrapper"> <input id="search-field" role="combobox" aria-label="Search" aria-autocomplete="list" aria-controls="search-results" type="text" name="search" placeholder="Search" spellcheck="false" title="Type to search, Up and Down to navigate, Enter to load"> </div> <ul id="search-results" aria-label="Search Results" aria-busy="false" aria-expanded="false" aria-atomic="false" class="initially-hidden"></ul> </form> </div> </div> <div id="class-metadata"> <div id="parent-class-section" class="nav-section"> <h3>Parent</h3> <p class="link">Object </div> <!-- Method Quickref --> <div id="method-list-section" class="nav-section"> <h3>Methods</h3> <ul class="link-list" role="directory"> <li ><a href="#method-c-new">::new</a> <li ><a href="#method-i-call">#call</a> <li ><a href="#method-i-extract_content_length">#extract_content_length</a> <li ><a href="#method-i-log">#log</a> </ul> </div> </div> </nav> <main role="main" aria-labelledby="class-Rack::CommonLogger"> <h1 id="class-Rack::CommonLogger" class="class"> class Rack::CommonLogger </h1> <section class="description"> <p><a href="CommonLogger.html"><code>Rack::CommonLogger</code></a> forwards every request to the given <code>app</code>, and logs a line in the <a href="http://httpd.apache.org/docs/1.3/logs.html#common">Apache common log format</a> to the configured logger.</p> </section> <section id="5Buntitled-5D" class="documentation-section"> <section class="constants-list"> <header> <h3>Constants</h3> </header> <dl> <dt id="FORMAT">FORMAT <dd><p>Common Log Format: <a href="http://httpd.apache.org/docs/1.3/logs.html#common">httpd.apache.org/docs/1.3/logs.html#common</a></p> <pre>lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - %{%s - %s [%s] "%s %s%s %s" %d %s\n} %</pre> <p>The actual format is slightly different than the above due to the separation of SCRIPT_NAME and PATH_INFO, and because the elapsed time in seconds is included at the end.</p> </dl> </section> <section id="public-class-5Buntitled-5D-method-details" class="method-section"> <header> <h3>Public Class Methods</h3> </header> <div id="method-c-new" class="method-detail "> <div class="method-heading"> <span class="method-name">new</span><span class="method-args">(app, logger = nil)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <p><code>logger</code> can be any object that supports the <code>write</code> or +<<+ methods, which includes the standard library <a href="Logger.html"><code>Logger</code></a>. These methods are called with a single string argument, the log message. If <code>logger</code> is nil, <a href="CommonLogger.html"><code>CommonLogger</code></a> will fall back <code>env['rack.errors']</code>.</p> <div class="method-source-code" id="new-source"> <pre><span class="ruby-comment"># File lib/rack/common_logger.rb, line 24</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-identifier">app</span>, <span class="ruby-identifier">logger</span> = <span class="ruby-keyword">nil</span>) <span class="ruby-ivar">@app</span> = <span class="ruby-identifier">app</span> <span class="ruby-ivar">@logger</span> = <span class="ruby-identifier">logger</span> <span class="ruby-keyword">end</span></pre> </div> </div> </div> </section> <section id="public-instance-5Buntitled-5D-method-details" class="method-section"> <header> <h3>Public Instance Methods</h3> </header> <div id="method-i-call" class="method-detail "> <div class="method-heading"> <span class="method-name">call</span><span class="method-args">(env)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <p>Log all requests in common_log format after a response has been returned. Note that if the app raises an exception, the request will not be logged, so if exception handling middleware are used, they should be loaded after this middleware. Additionally, because the logging happens after the request body has been fully sent, any exceptions raised during the sending of the response body will cause the request not to be logged.</p> <div class="method-source-code" id="call-source"> <pre><span class="ruby-comment"># File lib/rack/common_logger.rb, line 36</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">call</span>(<span class="ruby-identifier">env</span>) <span class="ruby-identifier">began_at</span> = <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">clock_time</span> <span class="ruby-identifier">status</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">body</span> = <span class="ruby-ivar">@app</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>) <span class="ruby-identifier">headers</span> = <span class="ruby-constant">Utils</span><span class="ruby-operator">::</span><span class="ruby-constant">HeaderHash</span>[<span class="ruby-identifier">headers</span>] <span class="ruby-identifier">body</span> = <span class="ruby-constant">BodyProxy</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">body</span>) { <span class="ruby-identifier">log</span>(<span class="ruby-identifier">env</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">began_at</span>) } [<span class="ruby-identifier">status</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">body</span>] <span class="ruby-keyword">end</span></pre> </div> </div> </div> </section> <section id="private-instance-5Buntitled-5D-method-details" class="method-section"> <header> <h3>Private Instance Methods</h3> </header> <div id="method-i-extract_content_length" class="method-detail "> <div class="method-heading"> <span class="method-name">extract_content_length</span><span class="method-args">(headers)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <p>Attempt to determine the content length for the response to include it in the logged data.</p> <div class="method-source-code" id="extract_content_length-source"> <pre><span class="ruby-comment"># File lib/rack/common_logger.rb, line 78</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">extract_content_length</span>(<span class="ruby-identifier">headers</span>) <span class="ruby-identifier">value</span> = <span class="ruby-identifier">headers</span>[<span class="ruby-constant">CONTENT_LENGTH</span>] <span class="ruby-operator">!</span><span class="ruby-identifier">value</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">==</span> <span class="ruby-string">'0'</span> <span class="ruby-operator">?</span> <span class="ruby-string">'-'</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">value</span> <span class="ruby-keyword">end</span></pre> </div> </div> </div> <div id="method-i-log" class="method-detail "> <div class="method-heading"> <span class="method-name">log</span><span class="method-args">(env, status, header, began_at)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <p>Log the request to the configured logger.</p> <div class="method-source-code" id="log-source"> <pre><span class="ruby-comment"># File lib/rack/common_logger.rb, line 47</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">log</span>(<span class="ruby-identifier">env</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">header</span>, <span class="ruby-identifier">began_at</span>) <span class="ruby-identifier">length</span> = <span class="ruby-identifier">extract_content_length</span>(<span class="ruby-identifier">header</span>) <span class="ruby-identifier">msg</span> = <span class="ruby-constant">FORMAT</span> <span class="ruby-operator">%</span> [ <span class="ruby-identifier">env</span>[<span class="ruby-string">'HTTP_X_FORWARDED_FOR'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">env</span>[<span class="ruby-string">"REMOTE_ADDR"</span>] <span class="ruby-operator">||</span> <span class="ruby-string">"-"</span>, <span class="ruby-identifier">env</span>[<span class="ruby-string">"REMOTE_USER"</span>] <span class="ruby-operator">||</span> <span class="ruby-string">"-"</span>, <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">strftime</span>(<span class="ruby-string">"%d/%b/%Y:%H:%M:%S %z"</span>), <span class="ruby-identifier">env</span>[<span class="ruby-constant">REQUEST_METHOD</span>], <span class="ruby-identifier">env</span>[<span class="ruby-constant">SCRIPT_NAME</span>], <span class="ruby-identifier">env</span>[<span class="ruby-constant">PATH_INFO</span>], <span class="ruby-identifier">env</span>[<span class="ruby-constant">QUERY_STRING</span>].<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span> <span class="ruby-string">""</span> <span class="ruby-operator">:</span> <span class="ruby-node">"?#{env[QUERY_STRING]}"</span>, <span class="ruby-identifier">env</span>[<span class="ruby-constant">SERVER_PROTOCOL</span>], <span class="ruby-identifier">status</span>.<span class="ruby-identifier">to_s</span>[<span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-value">3</span>], <span class="ruby-identifier">length</span>, <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">clock_time</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">began_at</span> ] <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp">/[^[:print:]\n]/</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-node">"\\x#{c.ord}"</span> } <span class="ruby-identifier">logger</span> = <span class="ruby-ivar">@logger</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">env</span>[<span class="ruby-constant">RACK_ERRORS</span>] <span class="ruby-comment"># Standard library logger doesn't support write but it supports << which actually</span> <span class="ruby-comment"># calls to write on the log device without formatting</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:write</span>) <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">msg</span>) <span class="ruby-keyword">else</span> <span class="ruby-identifier">logger</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">msg</span> <span class="ruby-keyword">end</span> <span class="ruby-keyword">end</span></pre> </div> </div> </div> </section> </section> </main> <footer id="validator-badges" role="contentinfo"> <p><a href="https://validator.w3.org/check/referer">Validate</a> <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.1. <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>. </footer>