Opened 3 years ago

Last modified 8 months ago

#21429 assigned New feature

BaseCommand should use logging instead of custom output wrappers

Reported by: Nical Owned by: Berker Peksag
Component: Core (Management commands) Version: master
Severity: Normal Keywords: command output logger
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

Since python offers the powerful logging class, django.core.management.base.BaseCommand should use it to output messages instead of using custom output wrappers (django.core.management.base.OutputWrapper).

Doing so, we could override those loggers in the settings.py file.

Instead of having two wrappers in a command and having to do:

class Command(BaseCommand):
  def handle(self):
    self.stdout.write('this is an info message')
    self.stderr.write('this is an error message')

We could do

class Command(BaseCommand):
  def handle(self):
    self.output.info('this is an info message')
    self.output.error('this is an error message')
    # and even
    self.output.warning('this is a warning message')

The style_func and ending arguments that the django.core.management.base.OutputWrapper.write method takes could be removed and be configured at once in a overriding custom logger.

Change History (7)

comment:1 Changed 3 years ago by Claude Paroz

Triage Stage: UnreviewedAccepted
Version: 1.6master

I worked on that idea in #15107 (that I just closed).

comment:2 Changed 2 years ago by Berker Peksag

Has patch: set
Owner: changed from nobody to Berker Peksag
Status: newassigned

https://github.com/django/django/pull/3467

This PR implements an initial integration of logging module in BaseCommand. I've also updated the documentation a bit. If this approach is okay, I'll update all management commands and tests.

comment:3 Changed 2 years ago by Claude Paroz

Do we want to keep the old stdout/stderr way of outputting messages in addition to the new API? This would make self.stdout.write/self.info and self.stderr.write/self.error redundants. Or did you intend to deprecate self.stdout/self.stderr?

comment:4 Changed 2 years ago by Berker Peksag

Or did you intend to deprecate self.stdout/self.stderr?

Yes, but I couldn't find a simple way to deprecate them yesterday. Today, here is my approach: https://github.com/berkerpeksag/django/commit/b439b472842bfd2d04c36b28d079a80fac5814bb

PR updated to address Simon's comments.

comment:5 Changed 2 years ago by Tim Graham

Patch needs improvement: set

comment:6 Changed 8 months ago by Stephane Poss

I saw that the pull request was closed on github. Are there any plans to revive this? It would be very nice to be able to configure logging like everywhere else...

comment:7 Changed 8 months ago by Tim Graham

Feel free to resume work on the patch if you like.

Note: See TracTickets for help on using tickets.
Back to Top