# Phusion Passenger - https://www.phusionpassenger.com/# Copyright (c) 2010-2013 Phusion## "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.## Permission is hereby granted, free of charge, to any person obtaining a copy# of this software and associated documentation files (the "Software"), to deal# in the Software without restriction, including without limitation the rights# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell# copies of the Software, and to permit persons to whom the Software is# furnished to do so, subject to the following conditions:## The above copyright notice and this permission notice shall be included in# all copies or substantial portions of the Software.## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN# THE SOFTWARE.PhusionPassenger.require_passenger_lib'constants'modulePhusionPassengermoduleDebugLogging# We don't refer to STDERR directly because STDERR's reference might# change during runtime.@@log_level=DEFAULT_LOG_LEVEL@@log_device=nil@@log_filename=nil@@stderr_evaluator=lambda{STDERR}defself.included(klass)klass.class_evaldoprivate:debugprivate:traceendenddefself.log_levelreturn@@log_levelenddefself.log_level=(level)@@log_level=levelenddefself.log_file=(filename)iffilename&&filename.empty?@@log_filename=nilelse@@log_filename=filenameend@@log_device.closeif@@log_device&&!@@log_device.closed?@@log_device=nilenddefself._log_devicereturn@@log_deviceenddefself.stderr_evaluator=(block)ifblock@@stderr_evaluator=blockelse@@stderr_evaluator=lambda{STDERR}endenddeferror(message)_output(1,message,1)endmodule_function:errordefwarn(message)_output(2,message,1)endmodule_function:warndefnotice(message)_output(3,message,1)endmodule_function:noticedefinfo(message)_output(4,message,1)endmodule_function:infodefdebug(message)_output(5,message,1)endmodule_function:debugdeftrace(level,message)_output(4+level,message,1)endmodule_function:tracedef_output(level,message,nesting_level=0)if@@log_level>=levelif@@log_filenameif!@@log_device||@@log_device.closed?@@log_device=File.open(@@log_filename,"a")endoutput=@@log_deviceelseoutput=@@stderr_evaluator.callendlocation=caller[nesting_level].sub(/.*phusion_passenger\//,'')location.sub!(/(.*):.*/,'\1')now=Time.nowtime_str=now.strftime("%Y-%m-%d %H:%M:%S.")time_str<<sprintf("%04d",now.usec/100)current_thread=Thread.currentif!(thread_id=current_thread[:id])current_thread.to_s=~/:(0x[0-9a-f]+)/ithread_id=current_thread[:id]=$1||'?'endifthread_name=current_thread[:name]thread_name="(#{thread_name})"endoutput.write("[ #{time_str}#{$$}/#{thread_id}#{thread_name}#{location} ]: #{message}\n")output.flushendendmodule_function:_outputendend