Почему я получаю ложный символ «] в сообщениях syslog с SysLogHandler Python в OS X?

С Python 3.5 на OS X 10.10.4 я получаю ложные ] символы в выводах сообщений syslog. Это можно увидеть с помощью следующей примерной программы:

 #!/usr/bin/env python3 import logging import logging.handlers logger = logging.getLogger('test') syslog_handler = logging.handlers.SysLogHandler(address='/var/run/syslog') syslog_formatter = logging.Formatter('[{process}] {message}', style='{') syslog_handler.setFormatter(syslog_formatter) logger.addHandler(syslog_handler) logger.error("Test : ABC") 

Если я запустил это, я вижу вывод syslog следующим образом:

 Dec 16 12:38:33 mymachinename [76399] Test]: ABC 

(Обратите внимание на паразитный символ после Test ).

Если я немного изменил строку форматирования, чтобы удалить исходный [ символ, дополнительный ] исчезнет. Тем не менее, я хочу, чтобы этот буквальный символ появлялся в форматированной строке (и у меня такая же проблема, даже если она не находится в начале строки форматирования).

Почему это ложное ] появляется, и как я могу его избежать?

asl.conf OS X, в котором сконфигурировано ведение журнала, выглядит следующим образом. Я не изменил его по умолчанию:

 ## # configuration file for syslogd and aslmanager ## # authpriv messages are root/admin readable ? [= Facility authpriv] access 0 80 # remoteauth critical, alert, and emergency messages are root/admin readable ? [= Facility remoteauth] [<= Level critical] access 0 80 # broadcast emergency messages ? [= Level emergency] broadcast # save kernel [PID 0] and launchd [PID 1] messages ? [<= PID 1] store # ignore "internal" facility ? [= Facility internal] ignore # save everything from emergency to notice ? [<= Level notice] store # Rules for /var/log/system.log > system.log mode=0640 format=bsd rotate=seq compress file_max=5M all_max=50M ? [= Sender kernel] file system.log ? [<= Level notice] file system.log ? [= Facility auth] [<= Level info] file system.log ? [= Facility authpriv] [<= Level info] file system.log ? [= Facility user] [<= Level debug] file system.log # Facility com.apple.alf.logging gets saved in appfirewall.log ? [= Facility com.apple.alf.logging] file appfirewall.log file_max=5M all_max= 

Я не вижу той же проблемы в Ubuntu 10.04, поэтому она, по-видимому, относится к OS X.

One Solution collect form web for “Почему я получаю ложный символ «] в сообщениях syslog с SysLogHandler Python в OS X?”

ОБНОВИТЬ:

Понял. Исправьте строку форматирования, чтобы придерживаться форматирования syslog BSD:

 syslog_formatter = logging.Formatter('[{process}]: {message}', style='{') ... logger.error("Test : ABC") 

и вы получаете:

 Aug 23 21:38:02 mymachine [65057]: Test : ABC 

ПРЕДПОСЫЛКИ / ОРИГИНАЛЬНАЯ ПОЧТА

Я воспроизвел вашу ошибку на OS X 10.11.6

 Aug 23 21:10:15 machine-name [64643] Test]: ABC 

Двоеточие, безусловно, является виновником. Я изменил сообщение:

 logger.error("Test ABC") 

И тогда запись в журнале нормальная:

 Aug 23 21:15:03 machine Unknown: [64701] Test ABC 

Я думаю, что двоеточие интерпретируется как символ форматирования, потому что вы используете опцию форматирования BSD. Из BSD syslog rfc :

 the first character of the CONTENT field that signifies the conclusion of the TAG field has been seen to be the left square bracket character ("["), a colon character (":"), or a space character. This is explained in more detail in Section 5.3. 

Может быть, OS X syslog пытается придерживаться BSD Syslog RFC и запутываться?

Python - лучший язык программирования в мире.