log + ajax, интерфейсное решение для ведения журналов.
Lajax пытается решить эти проблемы:
Во внешнем интерфейсе журналы отсутствуют или журналы есть, но не сохраняются, что затрудняет отслеживание и анализ онлайн-проблем;
Даже если используется интерфейсная библиотека журналов, обычно разработчикам приходится вручную записывать журналы, что ненадежно;
Неперехваченные исключения в производственных средах часто игнорируются;
Мобильный браузер не может видеть журналы, распечатываемые console
. Раньше для обнаружения проблемы обычно использовались alert
или vConsole, но недостатком является то, что исходный код необходимо модифицировать специально для этой цели;
Для веб-страниц, динамически создаваемых сервером, исходные журналы сервера системы не могут быть сопоставлены с журналами внешнего интерфейса.
Функции
Онлайн-пример
быстрый старт
API
Формат журнала
идентификатор запроса
Пример сервера
тест
лицензия
Записывайте журналы вручную, поддерживая 3 уровня журнала: info
, warn
и error
;
Журнал будет распечатан в консоли браузера в оптимизированном формате;
Автоматически регистрировать необнаруженные ошибки сценария;
Автоматически регистрировать неперехваченные исключения Promise;
Автоматически фиксировать начало и завершение ajax-запросов;
Автоматически генерировать идентификаторы запросов для облегчения поиска и корреляции журналов;
Журналы будут регулярно отправляться пакетами на настроенный сервер журналов;
Хорошая совместимость и механизм обработки исключений.
http://eshengsky.github.io/lajax/
> npm install lajax
script
чтобы представить < script src =" ./dist/build.min.js " > </ script >
import Lajax from './src/lajax-module' ;
// 传入接口服务器地址进行实例化
const logger = new Lajax ( 'https://path/to/your/log/server' ) ;
// 记录一条信息日志
const num = parseInt ( Math . random ( ) * 100 ) ;
logger . info ( '这是一条info日志' , '会产生一个随机数:' , num ) ;
// 记录一条警告日志
logger . warn ( '这是一条警告日志!' ) ;
try {
JSON . parse ( undefined ) ;
} catch ( err ) {
// 记录一条错误日志
logger . error ( '这是一条error日志' , '捕获到一个错误:' , err ) ;
}
Пожалуйста, просмотрите API для получения подробной документации.
Lajax использует синтаксис ES2015 и его необходимо упаковать с помощью webpack + Babel.
> npm install
> webpack
Каталог упакованных файлов — ./dist
, где build.js
— несжатая версия, а build.min.js
— сжатая версия.
Инициализируйте плагин и верните экземпляр плагина.
Options
: строка или объект. Если передана строка, она будет рассматриваться как адрес сервера журналов:
const logger = new Lajax ( 'https://path/to/your/log/server' ) ;
Если вы хотите настроить некоторую конфигурацию, передайте объект:
const logger = new Lajax ( {
url : 'https://path/to/your/log/server' ,
interval : 5000
} ) ;
Все свойства, поддерживаемые объектом, следующие:
имя атрибута | иллюстрировать | тип значения | значение по умолчанию |
---|---|---|---|
URL | URL-адрес сервера журналов | нить | нулевой |
автологеррор | Следует ли автоматически регистрировать необнаруженные ошибки | логическое значение | истинный |
autoLogRejection | Записывать ли автоматически ошибки Promise | логическое значение | истинный |
автологАякс | Записывать ли автоматически запросы ajax | логическое значение | истинный |
logAjaxFilter | Ajax автоматически записывает функцию условной фильтрации. Параметры, передаваемые функцией, — это URL-адрес и метод запроса. Если возвращается true, это означает запись журнала, а false означает отсутствие записи журнала. | функция | /**
* @param {string} ajaxUrl - 请求url
* @param {string} ajaxMethod - 请求方式
*/
function ( ajaxUrl , ajaxMethod ) {
return true ;
} |
стилизовать | Форматировать ли содержимое, печатаемое консолью | логическое значение | истинный |
показатьDesc | Отображать ли информацию описания (печатается на консоли после завершения инициализации) | логическое значение | истинный |
customDesc | Функция, которая генерирует пользовательскую информацию описания. Передаваемые параметры — это количество неотправленных журналов до выгрузки последней страницы, текущий идентификатор запроса, исходит ли идентификатор запроса с сервера, и возвращается строка. | функция | /**
* @param {number} lastUnsend - 上次页面卸载前未发送的日志数
* @param {string} reqId - 请求id
* @param {boolean} idFromServer - 请求id是否来自服务器
*/
function ( lastUnsend , reqId , idFromServer ) {
return ` lajax 前端日志模块加载完成。
自动记录页面错误: ${ this . autoLogError ? '✔' : '✘' }
自动记录Promise异常: ${ this . autoLogRejection ? '✔' : '✘' }
自动记录Ajax请求: ${ this . autoLogAjax ? '✔' : '✘' }
当前页面请求id: ${ reqId } ${ idFromServer
? ' (来自服务端)'
: ' (自动生成)' } ` ;
} |
интервал | Интервал между отправкой логов на сервер (миллисекунды) | число | 10000 |
МаксErrorReq | Максимальное количество последовательных ошибок при отправке запросов журнала. Если это число будет превышено, запрос больше не будет отправлен (но запрос все равно будет записан в очередь). | число | 5 |
Метод экземпляра записывает информационный журнал и может передавать любой тип и любое количество параметров.
const num = parseInt ( Math . random ( ) * 100 ) ;
logger . info ( '这是一条info日志' , '会产生一个随机数:' , num ) ;
Метод экземпляра аналогичен info
.
const num = parseInt ( Math . random ( ) * 100 ) ;
logger . log ( '这是一条log日志' , '会产生一个随机数:' , num ) ;
Метод экземпляра записывает журнал предупреждений, может передавать любой тип и любое количество параметров.
logger . warn ( '这是一条警告日志!' ) ;
Метод экземпляра записывает журнал ошибок и может передавать любой тип и любое количество параметров.
try {
JSON . parse ( undefined ) ;
} catch ( err ) {
// 记录一条错误日志
logger . error ( '这是一条error日志' , '捕获到一个错误:' , err ) ;
}
Атрибут типа массива, текущая очередь журналов для отправки.
logger . queue
Атрибут строкового типа, идентификатор запроса текущей страницы.
logger . reqId
Атрибут логического типа, определяет, генерируется ли сервером идентификатор запроса.
logger . idFromServer
Статический объект, перечисление цветов журнала. Если вы хотите настроить цвет журнала, вы можете изменить свойства объекта перед вызовом метода экземпляра. Объект по умолчанию:
Lajax . colorEnum = {
/**
* 信息日志颜色,默认宝蓝色
*/
info : 'DodgerBlue' ,
/**
* 警告日志颜色,默认橘黄色
*/
warn : 'orange' ,
/**
* 错误日志颜色,默认红色
*/
error : 'red' ,
/**
* ajax分组颜色,默认紫色
*/
ajaxGroup : '#800080' ,
/**
* 日志发送成功颜色,默认绿色
*/
sendSuccess : 'green' ,
/**
* 描述文字颜色,默认粉红色
*/
desc : '#d30775' ,
}
Лог, отправляемый на сервер через ajax, должен представлять собой непустой массив. Здесь записываются одновременно 2 журнала:
logger . info ( '这是一条info日志' , 'Hello' , 'lajax' ) ;
logger . warn ( '这是一条warn日志' ) ;
Фактические отправленные данные журнала будут следующими:
[{
"time" : " 2017-08-23 16:35:01.989 " ,
"level" : " info " ,
"messages" : [ " {44b53aba-1970-4bd1-b741-ed1ae5a5051e} " , "这是一条info日志" , " Hello " , " lajax " ],
"url" : " http://127.0.0.1:5500/demo/index.html " ,
"agent" : " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 "
}, {
"time" : " 2017-08-23 16:35:02.369 " ,
"level" : " warn " ,
"messages" : [ " {44b53aba-1970-4bd1-b741-ed1ae5a5051e} " , "这是一条warn日志" ],
"url" : " http://127.0.0.1:5500/demo/index.html " ,
"agent" : " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 "
}]
Описание каждого поля:
time
: строка, время этой записи журнала.
level
: строка, уровень журнала, который делится на три типа: info
, warn
и error
.
messages
: array. Первый элемент массива — это уникальный идентификатор запроса, заключенный в фигурные скобки. Все последующие элементы соответствуют содержимому журнала, переданному при вызове logger[level]
url
: строка, URL-адрес страницы, на которой находится журнал.
agent
: строка, пользовательский агент страницы, на которой находится журнал.
Каждый журнал, отправляемый на сервер, содержит идентификатор запроса. В одном запросе идентификаторы запросов всех журналов должны быть одинаковыми, в разных запросах идентификаторы запросов записываемых журналов должны быть разными.
Например: когда пользователь А получил доступ к index.html, lajax записал и отправил 10 журналов, и идентификаторы запросов этих 10 журналов были одинаковыми. Пользователь Б также посетил страницу и также сгенерировал 10 журналов, и идентификаторы запросов этих журналов; были. Он должен быть таким же, но отличаться от идентификатора запроса пользователя А.
Основное назначение идентификатора запроса: позволяет точно найти все связанные журналы во время определенного запроса на стороне сервера.
Генерация и отправка идентификатора запроса:
Если ваша страница динамически генерируется на стороне сервера и вы хотите соединить журналы на стороне сервера с журналами внешнего интерфейса, вы можете сгенерировать идентификатор запроса на стороне сервера и отправить его на внешний интерфейс. Lajax последовательно попытается найти идентификатор запроса из содержимого <meta name="_reqId" content="xxxx-xxx">
страницы или window._reqId
;
Если вышеуказанный поиск не удался, ваша страница считается чисто интерфейсной страницей. Lajax сгенерирует уникальный идентификатор на основе времени в качестве идентификатора запроса во время инициализации. Прежде чем страница будет выгружена, все журналы будут содержать этот идентификатор.
Для отслеживаемых запросов ajax указанный выше идентификатор запроса будет добавлен в заголовок запроса X-Request-Id
. Вы можете записать идентификатор запроса в журнал сервера для корреляции.
В каталоге ./demo
включен простой пример сервера журналов server.js, основанный на node.js.
Запустите сервер журналов:
> node server.js
Интерфейс журнала работает по адресу http://127.0.0.1:2017/log При локальном тестировании установите параметры инициализации Lajax по этому адресу:
const logger = new Lajax ( 'http://127.0.0.1:2017/log' ) ;
Этот пример сервера поддерживает междоменные запросы ajax :)
Откройте локальную страницу ./test/index.html
, чтобы запустить тест.
Лицензия MIT (MIT)
Авторские права (c) 2017 Сунь Чжэнхуа
Настоящим разрешение бесплатно предоставляется любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), на использование Программного обеспечения без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ, АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ. ПРЕТЕНЗИЯ, ВОЗМЕЩЕНИЕ УБЫТКА ИЛИ ДРУГОЕ ОТВЕТСТВЕННОСТЬ ПО КОНТРАКТУ, ПРАВИЛАМ ИЛИ ДРУГИМ ОБРАЗУ, ВОЗНИКАЮЩАЯ ИЗ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЛАМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.