Oto kolejna opcja, która nie ma problemów ze słowami kluczowymi wymienionymi w odpowiedzi Dunes. Obsługuje tylko {0}argumenty pozycyjne ( ), a nie argumenty słów kluczowych ( {foo}). Nie wymaga również dwóch wywołań formatowania (przy użyciu podkreślenia). Ma ten współczynnik podklasy str:
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
Używasz tego w ten sposób:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Oczywiście można usunąć zaznaczenie oznaczone ikoną, # optionalaby wymusić na wszystkich komunikatach przechodzących przez adapter użycie nowego stylu formatowania.
Uwaga dla każdego, kto po latach przeczyta tę odpowiedź : Począwszy od Pythona 3.2 , można używać parametru style z Formatterobiektami:
Rejestrowanie (od 3.2) zapewnia ulepszoną obsługę tych dwóch dodatkowych stylów formatowania. Klasa Formatter została rozszerzona o dodatkowy, opcjonalny parametr słowa kluczowego o nazwie style. Domyślnie jest to '%', ale inne możliwe wartości to '{'i '$', które odpowiadają dwóm pozostałym stylom formatowania. Zgodność wsteczna jest utrzymywana domyślnie (zgodnie z oczekiwaniami), ale poprzez jawne określenie parametru stylu uzyskuje się możliwość określenia ciągów formatu, które działają z str.format()lub
string.Template.
Dokumentacja dostarcza przykładu
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Zauważ, że w tym przypadku nadal nie możesz zadzwonić loggerdo nowego formatu. To znaczy, że nadal nie będzie działać:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)