Статьи

Начало работы с LogBox и ColdBox

Я работал над сайтом ColdBox 3 и решил попробовать встроить ведение журнала (с LogBox). Я подумал, что сделаю быстрый пост в блоге, чтобы продемонстрировать, как его использовать, так как я нашел документы немного запутанными. LogBox может использоваться автономно, тогда как при использовании ColdBox большая часть работы выполняется за вас.

По умолчанию ColdBox настроен с включенным ведением журнала и выводит данные на консоль. Вот мой Coldbox.cfc просто чтобы доказать, что я не обманываю!


<cfcomponent output="false" hint="My App Configuration"> <cfscript> // Configure ColdBox Application function configure(){ // coldbox directives coldbox = { //Application Setup appName = "SimpleLoggingApp", //Development Settings debugMode = true, debugPassword = "", reinitPassword = "", handlersIndexAutoReload = true, configAutoReload = false, //Implicit Events defaultEvent = "general.index", requestStartHandler = "", requestEndHandler = "", applicationStartHandler = "", applicationEndHandler = "", sessionStartHandler = "", sessionEndHandler = "", missingTemplateHandler = "", //Error/Exception Handling exceptionHandler = "", onInvalidEvent = "", customErrorTemplate = "", //Application Aspects handlerCaching = false, eventCaching = false }; //Layout Settings layoutSettings = { defaultLayout = "Layout.Main.cfm" }; //Register interceptors as an array, we need order interceptors = [ //Autowire {class="coldbox.system.interceptors.Autowire"} ]; } </cfscript> </cfcomponent>

В моем обработчике все, что мне нужно сделать, это вызвать объект регистратора.


<cfcomponent output="false"> <!--- Default Action ---> <cffunction name="index" returntype="void" output="false" hint="My main event"> <cfargument name="event" required="true"> <cfset var rc = event.getCollection()> <!--- tell the LogBox instance to log an info message ---> <cfset log.info("Event Handler Called")> <cfset rc.welcomeMessage = "Welcome to ColdBox!"> <cfset event.setView("General/index")> </cffunction> <!------------------------------------------- PRIVATE EVENTS ------------------------------------------> </cfcomponent>

Конечно же, в моей консоли я вижу это:


[localhost CF9.01]:INFO simplelogging.handlers.General Event Handler Called ExtraInfo:

Довольно мило, да Мы также можем вывести дополнительную информацию.


<cfcomponent output="false"> <!--- Default Action ---> <cffunction name="index" returntype="void" output="false" hint="My main event"> <cfargument name="event" required="true"> <cfset var rc = event.getCollection()> <!--- tell the LogBox instance to log an info message ---> <cfset log.info("Event Handler Called", {time=Now(), rc=rc})> <cfset rc.welcomeMessage = "Welcome to ColdBox!"> <cfset event.setView("General/index")> </cffunction> <!------------------------------------------- PRIVATE EVENTS ------------------------------------------> </cfcomponent>

Выход:


[localhost CF9.01]:INFO simplelogging.handlers.General Event Handler Called ExtraInfo: {TIME={{ts '2010-12-02 14:07:56'}},RC={{event={general.index}}}}

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


<cfcomponent output="false"> <!--- Default Action ---> <cffunction name="index" returntype="void" output="false" hint="My main event"> <cfargument name="event" required="true"> <cfset var rc = event.getCollection()> <!--- tell the LogBox instance to log an info message ---> <cfset log.info("Everything OK")> <cfset log.warn("Watch out!")> <cfset log.error("Too late")> <cfset log.fatal("**KABOOOM**")> <cfset rc.welcomeMessage = "Welcome to ColdBox!"> <cfset event.setView("General/index")> </cffunction> <!------------------------------------------- PRIVATE EVENTS ------------------------------------------> </cfcomponent>

Когда я запускаю событие, я получаю следующее в моей консоли.


[localhost CF9.01]:INFO simplelogging.handlers.General Everything OK ExtraInfo: [localhost CF9.01]:WARN simplelogging.handlers.General Watch out! ExtraInfo: [localhost CF9.01]:ERROR simplelogging.handlers.General Too late ExtraInfo: [localhost CF9.01]:FATAL simplelogging.handlers.General **KABOOOM** ExtraInfo:

Отлично, теперь мы можем классифицировать зарегистрированные сообщения, но вход в консоль может не соответствовать вашим потребностям. К счастью, в ColdBox есть различные «дополнения», которые позволяют вам выбрать способ отображения зарегистрированной информации. Давайте настроим ColdBox так, чтобы информация о журнале выводилась в браузер, добавив структуру logBox в ColdBox.cfc


<cfcomponent output="false" hint="My App Configuration"> <cfscript> // Configure ColdBox Application function configure(){ // coldbox directives coldbox = { //Application Setup appName = "SimpleLoggingApp", //Development Settings debugMode = true, debugPassword = "", reinitPassword = "", handlersIndexAutoReload = true, configAutoReload = false, //Implicit Events defaultEvent = "general.index", requestStartHandler = "", requestEndHandler = "", applicationStartHandler = "", applicationEndHandler = "", sessionStartHandler = "", sessionEndHandler = "", missingTemplateHandler = "", //Error/Exception Handling exceptionHandler = "", onInvalidEvent = "", customErrorTemplate = "", //Application Aspects handlerCaching = false, eventCaching = false }; //Layout Settings layoutSettings = { defaultLayout = "Layout.Main.cfm" }; //Register interceptors as an array, we need order interceptors = [ //Autowire {class="coldbox.system.interceptors.Autowire"} ]; // configure LogBox logBox = { appenders = { coldboxTracer = { class="coldbox.system.logging.appenders.ColdboxTracerAppender" } }, root = { levelmax="DEBUG", levelMin="FATAL", appenders="*" } }; } </cfscript> </cfcomponent>

Вам нужно будет перезагрузить среду ColdBox, чтобы выбрать новые настройки, но когда вы это сделаете, вы увидите, что в разделе «Отладка» в вашем браузере появился новый раздел «Сообщения ColdBox Tracer». Супер острый глаз, возможно, вы заметили, что я установил максимальный уровень регистрации на DEBUG. Это означает, что я могу использовать состояние отладки, которое по умолчанию отключено в ColdBox. Чтобы использовать уровень отладки, просто позвоните:



<cfset log.debug("testing 1,2,3")>

Итак, у нас сейчас идет довольно мощное ведение журналов, но в процессе производства мы не собираемся выводить данные в окно консоли или браузера, вместо этого мы хотим войти в файл, поэтому давайте добавим AsyncRollingFileAppender (Примечание. Обычно вы бы не включили ColdboxTracerAppender и AsyncRollingFileAppender, но это демо, так что, черт возьми!)



// configure logbox logBox = { appenders = { // ColdboxTracerAppender outputs to the browser coldboxTracer = { class="coldbox.system.logging.appenders.ColdboxTracerAppender" }, // AsyncRollingFileAppender outputs to the logs/MYERRORLOG.log file myErrorLog = { class="coldbox.system.logging.appenders.AsyncRollingFileAppender", levelMax="WARN", levelMin="FATAL", properties={ filePath="/#appMapping#/logs", autoExpand="true", fileMaxSize="3000", fileMaxArchives="5" } } }, root = { levelmax="DEBUG", levelMin="FATAL", appenders="*" } };

Если мы снова перезагрузим конфигурацию и проверим папку журналов (ColdBox создаст ее, если она не существует), и вы увидите файл с именем MYERRORLOG.log, который содержит:


"Severity","Appender","Date","Time","Category","Message" "WARN","MYERRORLOG","12/02/2010","14:28:53","simplelogging.handlers.General","Watch out!" "ERROR","MYERRORLOG","12/02/2010","14:28:53","simplelogging.handlers.General","Too late" "FATAL","MYERRORLOG","12/02/2010","14:28:53","simplelogging.handlers.General","**KABOOOM**"

Так что же случилось с сообщениями DEBUG и INFO? Хорошо, когда я настроил AsyncRollingFileAppender, я установил максимальный уровень ведения журнала на WARN. Все, что ниже этого, игнорируется. Это действительно здорово, чтобы выбрать, какие типы сообщений вам нужно войти в производство.

Ведение журнала — это действительно мощный инструмент, который часто упускают из виду, так как его сложно настроить, но у вас нет оправданий сейчас!