2014-01-17 1 views
1

(Переписано несколько последующих модификаций кода на моем конце плюс ответы, полученные до сих пор. Спасибо Эндрю за образец кода, который дал мне отправную точку для демонстрации того, что пользовательский журнал ошибок работает, а затем как я могу его сломать!)Как получить пользовательскую регистрацию в CherryPy?

Я пытаюсь получить пользовательский журнал, работающий в CherryPy. Я также хотел бы иметь поворот файла журнала, поэтому я выполнил инструкции в документации, чтобы заменить обработчики журналов.

script_dir устанавливается ранее в моем коде в каталог, в котором работает скрипт.

cherrypy.config.update({'server.socket_host': '0.0.0.0', 
         'server.socket_port': 1234, 
         'tools.staticdir.on': True, 
         'tools.staticdir.dir': script_dir, 
         'log.access_file': "access1.log", 
         'log.error_file': "error1.log", 
         'log.screen': False, 
         'tools.sessions.on': True, 
         }) 

config = {'/': 
      { 
        'tools.staticdir.on': True, 
        'tools.staticdir.dir': script_dir, 
        'log.access_file': "access2.log", 
        'log.error_file': "error2.log", 
        'log.screen': False, 
        'tools.sessions.on': True, 
      } 
     } 

application = cherrypy.tree.mount(MyApp(), "/", config) 

log = application.log 

# Make a new RotatingFileHandler for the error log. 
fname = getattr(log, "rot_error_file", "error.log") 
h = handlers.TimedRotatingFileHandler(fname, when='midnight') 
h.setLevel(logging.DEBUG) 
h.setFormatter(_cplogging.logfmt) 
log.error_file = "" 
log.error_log.addHandler(h) 

# Make a new RotatingFileHandler for the access log. 
fname = getattr(log, "rot_access_file", "access.log") 
h = handlers.TimedRotatingFileHandler(fname, when='midnight') 
h.setLevel(logging.DEBUG) 
h.setFormatter(_cplogging.logfmt) 
log.access_file = "" 
log.access_log.addHandler(h) 

С скрипт работает, запись происходит следующим образом:

  • каротаж Стандартный доступ идет к ОБА access1.log (определяется на глобальном уровне) и access.log (определяется на уровне приложений)
  • Ошибка при входе идет только error1.log (определяется на глобальном уровне)
  • Ничто не вошли в * 2.log (как и ожидалось)

Итак, похоже, что у CherryPy возникла проблема с регистрацией ошибок в конфигурации приложения. Как правило, это меня не волнует, за исключением того, что я хочу использовать обработчик файлов с вращающимся журналом, но я не знаю, как изменить сеансы ведения журнала на глобальном уровне, как это было сделано для уровня приложения.

Спасибо.

+0

Это работает нормально для меня. Произошли ли ошибки CherryPy? – jwalker

+0

Да, они делают. Я получаю трассировки стека, когда происходят исключения, а также более подробный список значений заголовка. –

+0

Обновлен мой ответ с проверенным примером. –

ответ

0

Чтобы ответить на мой вопрос о том, как настроить обработчик журнала для глобального журнала вместо журнала приложения уровня, вот изменения:

cherrypy.config.update({'server.socket_host': '0.0.0.0', 
         'server.socket_port': 1234, 
         'tools.staticdir.on': True, 
         'tools.staticdir.dir': script_dir, 
         'log.access_file': "access1.log", 
         'log.error_file': "error1.log", 
         'log.screen': True, 
         'tools.sessions.on': True, 
         }) 

config = {'/': 
      { 
      } 
     } 

application = cherrypy.tree.mount(HealthCheck(script_dir, service_fqdn, my_ip), "/", config) 

logscope = cherrypy.log 

# Make a new RotatingFileHandler for the error log. 
fname = getattr(logscope, "rot_error_file", "error.log") 
h = handlers.TimedRotatingFileHandler(fname, when='midnight') 
h.setLevel(logging.DEBUG) 
h.setFormatter(_cplogging.logfmt) 
logscope.error_file = "" 
logscope.error_log.addHandler(h) 

# Make a new RotatingFileHandler for the access log. 
fname = getattr(logscope, "rot_access_file", "access.log") 
h = handlers.TimedRotatingFileHandler(fname, when='midnight') 
h.setLevel(logging.DEBUG) 
h.setFormatter(_cplogging.logfmt) 
logscope.access_file = "" 
logscope.access_log.addHandler(h) 

или, в двух словах:

  • Оставьте конфигурацию приложения пустым. Я только определяю его, чтобы CherryPy начинал тихо.
  • изменить объем журнала от application.log до cherrypy.log

Чтобы быть немного более аккуратным, ссылки на access1.log и error1.log может измениться на access.log и error.log, но я оставил им, таким образом, чтобы подтвердить, что я перезаписывал глобальные настройки.

0

использовать что-то вроде этого ...

import cherrypy 
from cherrypy import log 

class MyApp(object): 
    def index(self): 
     log.error(msg='This is My Error ', context='HTTP', severity=20, traceback=True) 
     return "Hello World!"  
    index.exposed = True 


cherrypy.tree.mount(MyApp(), "/") 

cherrypy.config.update({'tools.staticdir.on': True, 
    'tools.staticdir.dir': 'C:\\Documents and Settings\\d\\My Documents\\Aptana Studio 3 Workspace\\ScratchPad', 
    'log.access_file' : "access.log", 
    'log.error_file' : "error.log", 
    'log.screen' : False, 
    'tools.sessions.on': True, 
    }) 


cherrypy.engine.start() 
cherrypy.engine.block() 

Это будет регистрировать ошибку. Я считаю, что есть проблема с загрузкой конфигурации в вашем коде. Я также думаю, что статические врасты должны быть повернуты.

Надеюсь, что это поможет и счастливое кодирование!

+0

По существу, это тот же звонок, что и в вопросе – jwalker

+0

Это сработало для меня. Другая проблема, с которой он мог столкнуться, заключается в том, что у пользователя, запускающего его вишневое приложение, нет разрешения на запись в файл error.log. –

+0

Да, поэтому мой вопрос – jwalker