Skip to content

Commit df0dcab

Browse files
authored
Merge pull request #37 from glennsarti/unify-logging
Unify debug logging
2 parents 0b5b272 + 3e70207 commit df0dcab

File tree

5 files changed

+78
-37
lines changed

5 files changed

+78
-37
lines changed

server/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ Usage: puppet-languageserver.rb [options]
7575
-c, --no-stop Do not stop the language server once a client disconnects. Default is to stop
7676
-t, --timeout=TIMEOUT Stop the language server if a client does not connection within TIMEOUT seconds. A value of zero will not timeout. Default is 10 seconds
7777
-d, --no-preload Do not preload Puppet information when the language server starts. Default is to preload
78+
--debug=DEBUG Output debug information. Either specify a filename or 'STDOUT'. Default is no debug output
7879
-h, --help Prints this help
7980
```
8081

server/lib/puppet-languageserver.rb

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111

1212
require 'puppet'
1313
require 'optparse'
14+
require 'logger'
15+
16+
# Global variable holding the logger class
17+
$logger = nil
1418

1519
module PuppetLanguageServer
1620
class CommandLineParser
@@ -21,7 +25,8 @@ def self.parse(options)
2125
:ipaddress => '127.0.0.1',
2226
:stop_on_client_exit => true,
2327
:connection_timeout => 10,
24-
:preload_puppet => true
28+
:preload_puppet => true,
29+
:debug => nil
2530
}
2631

2732
opt_parser = OptionParser.new do |opts|
@@ -47,6 +52,10 @@ def self.parse(options)
4752
args[:preload_puppet] = false
4853
end
4954

55+
opts.on('--debug=DEBUG', "Output debug information. Either specify a filename or 'STDOUT'. Default is no debug output") do |debug|
56+
args[:debug] = debug
57+
end
58+
5059
opts.on('-h', '--help', 'Prints this help') do
5160
puts opts
5261
exit
@@ -59,45 +68,68 @@ def self.parse(options)
5968
end
6069

6170
def self.log_message(severity, message)
62-
puts "[#{severity.upcase}] #{message}"
71+
return if $logger.nil?
72+
73+
case severity
74+
when :debug
75+
$logger.debug(message)
76+
when :info
77+
$logger.info(message)
78+
when :warn
79+
$logger.info(message)
80+
when :error
81+
$logger.error(message)
82+
when :fatal
83+
$logger.fatal(message)
84+
else
85+
$logger.unknown(message)
86+
end
6387
end
6488

6589
def self.init_puppet(options)
66-
log_message('information', "Using Puppet v#{Puppet.version}")
90+
if options[:debug].nil?
91+
$logger = nil
92+
elsif options[:debug].downcase == 'stdout'
93+
$logger = Logger.new($stdout)
94+
elsif !options[:debug].to_s.empty?
95+
# Log to file
96+
$logger = Logger.new(options[:debug])
97+
end
98+
log_message(:info, "Using Puppet v#{Puppet.version}")
6799

68-
log_message('information', 'Initializing settings...')
100+
log_message(:info, 'Initializing settings...')
69101
Puppet.initialize_settings
70102

71-
log_message('information', 'Creating puppet function environment...')
103+
log_message(:info, 'Creating puppet function environment...')
72104
autoloader = Puppet::Parser::Functions.autoloader
73105
autoloader.loadall
74106

75-
log_message('information', "Using Facter v#{Facter.version}")
107+
log_message(:info, "Using Facter v#{Facter.version}")
76108
if options[:preload_puppet]
77-
log_message('information', 'Preloading Facter (Async)...')
109+
log_message(:info, 'Preloading Facter (Async)...')
78110
PuppetLanguageServer::FacterHelper.load_facts_async
79111

80-
log_message('information', 'Preloading Puppet Types (Async)...')
112+
log_message(:info, 'Preloading Puppet Types (Async)...')
81113
PuppetLanguageServer::PuppetHelper.load_types_async
82114

83-
log_message('information', 'Preloading Functions (Async)...')
115+
log_message(:info, 'Preloading Functions (Async)...')
84116
PuppetLanguageServer::PuppetHelper.load_functions_async
85117
else
86-
log_message('information', 'Skipping preloading Puppet')
118+
log_message(:info, 'Skipping preloading Puppet')
87119
end
88120

89121
true
90122
end
91123

92124
def self.rpc_server(options)
93-
log_message('information', 'Starting RPC Server...')
125+
log_message(:info, 'Starting RPC Server...')
94126

95127
server = PuppetLanguageServer::SimpleTCPServer.new
96128

97129
server.add_service(options[:ipaddress], options[:port])
98130
trap('INT') { server.stop }
99131
server.start(PuppetLanguageServer::MessageRouter, options, 2)
100132

101-
log_message('information', 'Language Server exited.')
133+
log_message(:info, 'Language Server exited.')
102134
end
103135
end

server/lib/puppet-languageserver/json_rpc_handler.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ def initialize(*_options)
4949
end
5050

5151
def post_init
52-
PuppetLanguageServer::LogMessage('information', 'Client has connected to the language server')
52+
PuppetLanguageServer.log_message(:info, 'Client has connected to the language server')
5353
end
5454

5555
def unbind
56-
PuppetLanguageServer::LogMessage('information', 'Client has disconnected from the language server')
56+
PuppetLanguageServer.log_message(:info, 'Client has disconnected from the language server')
5757
end
5858

5959
def extract_headers(raw_header)
@@ -112,13 +112,13 @@ def receive_data(data)
112112
def send_response(response)
113113
size = response.bytesize if response.respond_to?(:bytesize)
114114
# DEBUG ONLY
115-
puts "--- OUTBOUND\n#{response}\n---"
115+
PuppetLanguageServer.log_message(:debug, "--- OUTBOUND\n#{response}\n---")
116116
send_data "Content-Length: #{size}\r\n\r\n" + response
117117
end
118118

119119
def parse_data(data)
120120
# DEBUG ONLY
121-
puts "--- INBOUND\n#{data}\n---"
121+
PuppetLanguageServer.log_message(:debug, "--- INBOUND\n#{data}\n---")
122122
result = JSON.parse(data)
123123
received_parsed_object(result)
124124
end
@@ -179,12 +179,12 @@ def process(obj)
179179

180180
# This method must be overriden in the user's inherited class.
181181
def receive_request(request)
182-
puts "request received:\n#{request.inspect}"
182+
PuppetLanguageServer.log_message(:debug, "request received:\n#{request.inspect}")
183183
end
184184

185185
# This method must be overriden in the user's inherited class.
186186
def receive_notification(method, params)
187-
puts "notification received (method: #{method.inspect}, params: #{params.inspect})"
187+
PuppetLanguageServer.log_message(:debug, "notification received (method: #{method.inspect}, params: #{params.inspect})")
188188
end
189189

190190
def encode_json(data)
@@ -226,17 +226,17 @@ def send_show_message_notification(msg_type, message)
226226

227227
# This method could be overriden in the user's inherited class.
228228
def parsing_error(_data, exception)
229-
$stderr.puts "parsing error:\n#{exception.message}"
229+
PuppetLanguageServer.log_message(:error, "parsing error:\n#{exception.message}")
230230
end
231231

232232
# This method could be overriden in the user's inherited class.
233233
def batch_not_supported_error(_obj)
234-
$stderr.puts 'batch request received but not implemented'
234+
PuppetLanguageServer.log_message(:error, 'batch request received but not implemented')
235235
end
236236

237237
# This method could be overriden in the user's inherited class.
238238
def invalid_request(_obj, code, message = nil)
239-
$stderr.puts "error #{code}: #{message}"
239+
PuppetLanguageServer.log_message(:error, "error #{code}: #{message}")
240240
end
241241

242242
class Request

server/lib/puppet-languageserver/message_router.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ def documents
2828
def receive_request(request)
2929
case request.rpc_method
3030
when 'initialize'
31-
PuppetLanguageServer.log_message('debug', 'Received initialize method')
31+
PuppetLanguageServer.log_message(:debug, 'Received initialize method')
3232
request.reply_result('capabilities' => PuppetLanguageServer::ServerCapabilites.capabilities)
3333

3434
when 'shutdown'
35-
PuppetLanguageServer.log_message('debug', 'Received shutdown method')
35+
PuppetLanguageServer.log_message(:debug, 'Received shutdown method')
3636
request.reply_result(nil)
3737

3838
when 'puppet/getVersion'
@@ -87,15 +87,15 @@ def receive_request(request)
8787
begin
8888
request.reply_result(PuppetLanguageServer::CompletionProvider.complete(content, line_num, char_num))
8989
rescue => exception
90-
PuppetLanguageServer.log_message('error', "(textDocument/completion) #{exception}")
90+
PuppetLanguageServer.log_message(:error, "(textDocument/completion) #{exception}")
9191
request.reply_result(LanguageServer::CompletionList.create_nil_response)
9292
end
9393

9494
when 'completionItem/resolve'
9595
begin
9696
request.reply_result(PuppetLanguageServer::CompletionProvider.resolve(request.params.clone))
9797
rescue => exception
98-
PuppetLanguageServer.log_message('error', "(completionItem/resolve) #{exception}")
98+
PuppetLanguageServer.log_message(:error, "(completionItem/resolve) #{exception}")
9999
# Spit back the same params if an error happens
100100
request.reply_result(request.params)
101101
end
@@ -108,42 +108,42 @@ def receive_request(request)
108108
begin
109109
request.reply_result(PuppetLanguageServer::HoverProvider.resolve(content, line_num, char_num))
110110
rescue => exception
111-
PuppetLanguageServer.log_message('error', "(textDocument/hover) #{exception}")
111+
PuppetLanguageServer.log_message(:error, "(textDocument/hover) #{exception}")
112112
request.reply_result(LanguageServer::Hover.create_nil_response)
113113
end
114114
else
115-
PuppetLanguageServer.log_message('error', "Unknown RPC method #{request.rpc_method}")
115+
PuppetLanguageServer.log_message(:error, "Unknown RPC method #{request.rpc_method}")
116116
end
117117
end
118118

119119
def receive_notification(method, params)
120120
case method
121121
when 'initialized'
122-
PuppetLanguageServer.log_message('information', 'Client has received initialization')
122+
PuppetLanguageServer.log_message(:info, 'Client has received initialization')
123123

124124
when 'exit'
125-
PuppetLanguageServer.log_message('information', 'Received exit notification. Closing connection to client...')
125+
PuppetLanguageServer.log_message(:info, 'Received exit notification. Closing connection to client...')
126126
close_connection
127127

128128
when 'textDocument/didOpen'
129-
PuppetLanguageServer.log_message('information', 'Received textDocument/didOpen notification.')
129+
PuppetLanguageServer.log_message(:info, 'Received textDocument/didOpen notification.')
130130
file_uri = params['textDocument']['uri']
131131
content = params['textDocument']['text']
132132
documents.set_document(file_uri, content)
133133
reply_diagnostics(file_uri, PuppetLanguageServer::DocumentValidator.validate(content))
134134

135135
when 'textDocument/didChange'
136-
PuppetLanguageServer.log_message('information', 'Received textDocument/didChange notification.')
136+
PuppetLanguageServer.log_message(:info, 'Received textDocument/didChange notification.')
137137
file_uri = params['textDocument']['uri']
138138
content = params['contentChanges'][0]['text'] # TODO: Bad hardcoding zero
139139
documents.set_document(file_uri, content)
140140
reply_diagnostics(file_uri, PuppetLanguageServer::DocumentValidator.validate(content))
141141

142142
when 'textDocument/didSave'
143-
PuppetLanguageServer.log_message('information', 'Received textDocument/didSave notification.')
143+
PuppetLanguageServer.log_message(:info, 'Received textDocument/didSave notification.')
144144

145145
else
146-
PuppetLanguageServer.log_message('error', "Unknown RPC notification #{method}")
146+
PuppetLanguageServer.log_message(:error, "Unknown RPC notification #{method}")
147147
end
148148
end
149149
end

server/lib/puppet-languageserver/simple_tcp_server.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ class SimpleTCPServerConnection
1111
# Methods to override
1212
def post_init
1313
# Override this to recieve events after a client is connected
14-
puts('Client has connected')
14+
PuppetLanguageServer.log_message(:debug, 'TCPSRV: Client has connected')
1515
end
1616

1717
def unbind
1818
# Override this to recieve events after a client is disconnected
19-
puts('Client has disconnected')
19+
PuppetLanguageServer.log_message(:debug, 'TCPSRV: Client has disconnected')
2020
end
2121

2222
def receive_data(data)
2323
# Override this to recieve data
24-
puts("Received #{data.length} characters")
24+
PuppetLanguageServer.log_message(:debug, "TCPSRV: Received #{data.length} characters")
2525
end
2626

2727
# @api public
@@ -58,7 +58,7 @@ class SimpleTCPServer
5858

5959
def log(message)
6060
# Override this to recieve log messages
61-
puts "[TCPSRV] #{message}"
61+
PuppetLanguageServer.log_message(:debug, "TCPSRV: #{message}")
6262
end
6363

6464
####
@@ -109,6 +109,14 @@ def start(handler = PuppetLanguageServer::SimpleTCPServerConnection, connection_
109109
log("Will stop the server in #{connection_options[:connection_timeout]} seconds if no connection is made.") if kill_timer > 0
110110
log('Will stop the server when client disconnects') if !@server_options[:stop_on_client_exit].nil? && @server_options[:stop_on_client_exit]
111111

112+
# Output to STDOUT. This is required by Langugage Client so it knows the server is now running
113+
S_LOCKER.synchronize do
114+
SERVICES.each do |service,options|
115+
$stdout.write("LANGUAGE SERVER RUNNING #{options[:hostname]}:#{options[:port]}\n")
116+
end
117+
end
118+
$stdout.flush
119+
112120
(begin
113121
sleep(1)
114122
# The kill_timer is used to stop the server if no clients have connected in X seconds

0 commit comments

Comments
 (0)