11import logging
2+ import sys
23from typing import Any
34
45from rich_toolkit import RichToolkit , RichToolkitTheme
56from rich_toolkit .styles import TaggedStyle
6- from uvicorn .logging import DefaultFormatter
7+ from uvicorn .logging import AccessFormatter , DefaultFormatter
78
89
910class CustomFormatter (DefaultFormatter ):
1011 def __init__ (self , * args : Any , ** kwargs : Any ) -> None :
1112 super ().__init__ (* args , ** kwargs )
12- self .toolkit = get_rich_toolkit ()
13+ self .toolkit = get_rich_toolkit (use_rich = True )
1314
1415 def formatMessage (self , record : logging .LogRecord ) -> str :
1516 message = record .getMessage ()
@@ -20,20 +21,40 @@ def formatMessage(self, record: logging.LogRecord) -> str:
2021 return result
2122
2223
23- def get_uvicorn_log_config () -> dict [str , Any ]:
24+ def _stream_is_tty (stream : Any ) -> bool :
25+ return bool (getattr (stream , "isatty" , lambda : False )())
26+
27+
28+ def get_uvicorn_log_config (use_rich : bool | None = None ) -> dict [str , Any ]:
29+ if use_rich is None :
30+ use_rich = _stream_is_tty (sys .stderr ) and _stream_is_tty (sys .stdout )
31+
32+ default_formatter : dict [str , Any ] = {
33+ "()" : DefaultFormatter ,
34+ "fmt" : "%(levelprefix)s %(message)s" ,
35+ "use_colors" : None ,
36+ }
37+ access_formatter : dict [str , Any ] = {
38+ "()" : AccessFormatter ,
39+ "fmt" : '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s' ,
40+ }
41+ if use_rich :
42+ default_formatter = {
43+ "()" : CustomFormatter ,
44+ "fmt" : "%(levelprefix)s %(message)s" ,
45+ "use_colors" : None ,
46+ }
47+ access_formatter = {
48+ "()" : CustomFormatter ,
49+ "fmt" : "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s" ,
50+ }
51+
2452 return {
2553 "version" : 1 ,
2654 "disable_existing_loggers" : False ,
2755 "formatters" : {
28- "default" : {
29- "()" : CustomFormatter ,
30- "fmt" : "%(levelprefix)s %(message)s" ,
31- "use_colors" : None ,
32- },
33- "access" : {
34- "()" : CustomFormatter ,
35- "fmt" : "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s" ,
36- },
56+ "default" : default_formatter ,
57+ "access" : access_formatter ,
3758 },
3859 "handlers" : {
3960 "default" : {
@@ -66,7 +87,13 @@ def get_uvicorn_log_config() -> dict[str, Any]:
6687logger = logging .getLogger (__name__ )
6788
6889
69- def get_rich_toolkit () -> RichToolkit :
90+ def get_rich_toolkit (use_rich : bool | None = None ) -> RichToolkit :
91+ if use_rich is None :
92+ use_rich = _stream_is_tty (sys .stdout )
93+
94+ if not use_rich :
95+ return RichToolkit ()
96+
7097 theme = RichToolkitTheme (
7198 style = TaggedStyle (tag_width = 11 ),
7299 theme = {
0 commit comments