Commit dc57936b authored by Vinay Sajip's avatar Vinay Sajip

Addressed SF#1524081 by using a dictionary to map level names to syslog...

Addressed SF#1524081 by using a dictionary to map level names to syslog priority names, rather than a string.lower().
parent 43476e00
...@@ -562,6 +562,18 @@ class SysLogHandler(logging.Handler): ...@@ -562,6 +562,18 @@ class SysLogHandler(logging.Handler):
"local7": LOG_LOCAL7, "local7": LOG_LOCAL7,
} }
#The map below appears to be trivially lowercasing the key. However,
#there's more to it than meets the eye - in some locales, lowercasing
#gives unexpected results. See SF #1524081: in the Turkish locale,
#"INFO".lower() != "info"
priority_map = {
"DEBUG" : "debug",
"INFO" : "info",
"WARNING" : "warning",
"ERROR" : "error",
"CRITICAL" : "critical"
}
def __init__(self, address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER): def __init__(self, address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER):
""" """
Initialize a handler. Initialize a handler.
...@@ -598,7 +610,7 @@ class SysLogHandler(logging.Handler): ...@@ -598,7 +610,7 @@ class SysLogHandler(logging.Handler):
# necessary. # necessary.
log_format_string = '<%d>%s\000' log_format_string = '<%d>%s\000'
def encodePriority (self, facility, priority): def encodePriority(self, facility, priority):
""" """
Encode the facility and priority. You can pass in strings or Encode the facility and priority. You can pass in strings or
integers - if strings are passed, the facility_names and integers - if strings are passed, the facility_names and
...@@ -619,6 +631,16 @@ class SysLogHandler(logging.Handler): ...@@ -619,6 +631,16 @@ class SysLogHandler(logging.Handler):
self.socket.close() self.socket.close()
logging.Handler.close(self) logging.Handler.close(self)
def mapPriority(self, levelName):
"""
Map a logging level name to a key in the priority_names map.
This is useful in two scenarios: when custom levels are being
used, and in the case where you can't do a straightforward
mapping by lowercasing the logging level name because of locale-
specific issues (see SF #1524081).
"""
return self.priority_map.get(levelName, "warning")
def emit(self, record): def emit(self, record):
""" """
Emit a record. Emit a record.
...@@ -633,7 +655,7 @@ class SysLogHandler(logging.Handler): ...@@ -633,7 +655,7 @@ class SysLogHandler(logging.Handler):
""" """
msg = self.log_format_string % ( msg = self.log_format_string % (
self.encodePriority(self.facility, self.encodePriority(self.facility,
string.lower(record.levelname)), self.mapPriority(record.levelname)),
msg) msg)
try: try:
if self.unixsocket: if self.unixsocket:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment