Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commandserver.py @ 40842:82210d88d814
commandserver: install logger to record server events through canonical API
The global commandserver.log() will be replaced with this.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 10 Nov 2018 19:00:17 +0900 |
parents | 368ecbf734af |
children | eaabcb689747 |
comparison
equal
deleted
inserted
replaced
40841:368ecbf734af | 40842:82210d88d814 |
---|---|
24 | 24 |
25 from .i18n import _ | 25 from .i18n import _ |
26 from . import ( | 26 from . import ( |
27 encoding, | 27 encoding, |
28 error, | 28 error, |
29 loggingutil, | |
29 pycompat, | 30 pycompat, |
30 util, | 31 util, |
32 vfs as vfsmod, | |
31 ) | 33 ) |
32 from .utils import ( | 34 from .utils import ( |
33 cborutil, | 35 cborutil, |
34 procutil, | 36 procutil, |
35 ) | 37 ) |
221 self.repoui = repo.ui | 223 self.repoui = repo.ui |
222 else: | 224 else: |
223 self.ui = ui | 225 self.ui = ui |
224 self.repo = self.repoui = None | 226 self.repo = self.repoui = None |
225 | 227 |
228 self.cdebug = logfile | |
226 self.cerr = channeledoutput(fout, 'e') | 229 self.cerr = channeledoutput(fout, 'e') |
227 self.cout = channeledoutput(fout, 'o') | 230 self.cout = channeledoutput(fout, 'o') |
228 self.cin = channeledinput(fin, fout, 'I') | 231 self.cin = channeledinput(fin, fout, 'I') |
229 self.cresult = channeledoutput(fout, 'r') | 232 self.cresult = channeledoutput(fout, 'r') |
233 | |
234 if self.ui.config(b'cmdserver', b'log') == b'-': | |
235 # switch log stream of server's ui to the 'd' (debug) channel | |
236 # (don't touch repo.ui as its lifetime is longer than the server) | |
237 self.ui = self.ui.copy() | |
238 setuplogging(self.ui, repo=None, fp=self.cdebug) | |
230 | 239 |
231 # TODO: add this to help/config.txt when stabilized | 240 # TODO: add this to help/config.txt when stabilized |
232 # ``channel`` | 241 # ``channel`` |
233 # Use separate channel for structured output. (Command-server only) | 242 # Use separate channel for structured output. (Command-server only) |
234 self.cmsg = None | 243 self.cmsg = None |
354 # its request | 363 # its request |
355 return 1 | 364 return 1 |
356 | 365 |
357 return 0 | 366 return 0 |
358 | 367 |
359 def setuplogging(ui): | 368 def setuplogging(ui, repo=None, fp=None): |
360 """Set up server logging facility | 369 """Set up server logging facility |
361 | 370 |
362 If cmdserver.log is '-', log messages will be sent to the 'd' channel | 371 If cmdserver.log is '-', log messages will be sent to the given fp. |
363 while a client is connected. Otherwise, messages will be written to | 372 It should be the 'd' channel while a client is connected, and otherwise |
364 the stderr of the server process. | 373 is the stderr of the server process. |
365 """ | 374 """ |
366 # developer config: cmdserver.log | 375 # developer config: cmdserver.log |
367 logpath = ui.config(b'cmdserver', b'log') | 376 logpath = ui.config(b'cmdserver', b'log') |
368 if not logpath: | 377 if not logpath: |
369 return | 378 return |
379 tracked = {b'cmdserver'} | |
370 | 380 |
371 global logfile | 381 global logfile |
372 if logpath == b'-': | 382 if logpath == b'-': |
373 logfile = ui.ferr | 383 logfile = ui.ferr |
374 else: | 384 else: |
375 logfile = open(logpath, 'ab') | 385 logfile = open(logpath, 'ab') |
386 | |
387 if logpath == b'-' and fp: | |
388 logger = loggingutil.fileobjectlogger(fp, tracked) | |
389 elif logpath == b'-': | |
390 logger = loggingutil.fileobjectlogger(ui.ferr, tracked) | |
391 else: | |
392 logpath = os.path.abspath(logpath) | |
393 vfs = vfsmod.vfs(os.path.dirname(logpath)) | |
394 logger = loggingutil.filelogger(vfs, os.path.basename(logpath), tracked) | |
395 | |
396 targetuis = {ui} | |
397 if repo: | |
398 targetuis.add(repo.baseui) | |
399 targetuis.add(repo.ui) | |
400 for u in targetuis: | |
401 u.setlogger(b'cmdserver', logger) | |
376 | 402 |
377 class pipeservice(object): | 403 class pipeservice(object): |
378 def __init__(self, ui, repo, opts): | 404 def __init__(self, ui, repo, opts): |
379 self.ui = ui | 405 self.ui = ui |
380 self.repo = repo | 406 self.repo = repo |