yog-log

Node Log 统计方案
授权协议 未知
开发语言 JavaScript
所属分类 程序开发、 日志工具(Logging)
软件类型 开源软件
地区 国产
投 递 者 邢硕
操作系统 跨平台
开源组织 百度
适用人群 未知
 软件概览

yog-log 是 Node Log 统计方案,是yog框架的log统计模块,支持中间件或者单独使用等方式,兼容ODP日志格式与配置。关于ODP的日志方案调研可查看此文档.

统计日志类型包括:

server日志

  • access_log: web访问日志,按小时分日志

  • error_log: web错误日志,按小时分日志

访问日志统计方式为请求返还才触发。

应用日志

  • 每个app有各自独立的日志,日志名为app的名称,例如demo.log和demo.log.wf。

  • 可配置每个app是否使用独立的子目录存放自身日志,例如demo/demo.log。

  • 可配置每个app是否按小时切分日志。

  • 可配置每个app的日志级别。

  • 对于不属于任何app的node.js程序,日志名为unknown.log。

快速开始

1 在yog的config.json中添加此配置

  "yogLogger": {
            "enabled": true,
            "priority": 50,
            "module": {
                "name": "yog-log",
                "arguments": [
                    {
                        "level" : 16, //线上一般填4,参见配置项说明
                        "app": "app_name", //app名称,产品线或项目名称等
                        "log_path": "path:./data/log"//日志存放地址
                    }
             ]
      }
 }

填写此配置之后yog-log就开始统计访问日志。

2 调用接口统计应用日志

router层统计日志

router层推荐使用emit方式触发log事件,避免在每个文件中都require yog-log

try{
    //do something
}catch(e){
    res.emit('log',{'stack':e,'errno':120,'msg' :'error happened!'}, 'warning'); //推荐方式
    //or res.emit('log',{'stack':e});//日志等级不写默认为notice
    //or res.emit('log','error!');//只写字符串不会解析错误堆栈
}

model等没有res的地方

使用getLogger方法获取到日志模块实例,然后调用接口统计日志。

var YLogger = require('yog-log');
var logger = YLogger.getLogger(); 
//默认通过domain获取,单独使用请传递

configlogger.log('warning','msg');
//or logger.warning('msg');

日志初始化配置项

配置项均有默认值,理论上不需要配置也能工作。推荐设置配置有:levelapplog_path 三项。

配置项 默认值 说明
app unknown app名称,推荐填写
format 见下 默认应用日志格式
format_wf 见下 默认的应用日志warning及fatal日志格式
level 16 log日志级别,高于此级别的日志不会输出
auto_rotate 1 是否自动切分
use_sub_dir 1 日志是否在二级目录打印,目录名为 APP_NAME
log_path 插件安装地址/log 日志存放目录,注意需要设置
data_path 插件安装地址/data 格式数据存放的目录,可不用设置
is_omp 0 是否开启omp日志,如果不接入omp,建议置为2
debug 0 是否开启omp日志,如果不接入omp,建议置为2
默认`format`:
%L: %t [%f:%N] errno[%E] logId[%l] uri[%U] user[%u] refer[%{referer}i] cookie[%{cookie}i] %S %M

默认的`format_wf `:
%L: %{%m-%d %H:%M:%S}t %{app}x * %{pid}x [logid=%l filename=%f lineno=%N errno=%{err_no}x %{encoded_str_array}x errmsg=%{u_err_msg}x]

应用日志等级

日志等级 数据编号 统计说明
FATAL 1 打印FATAL
WARNING 2 打印FATAL和WARNING
NOTICE 4 打印FATAL、WARNING、NOTICE(线上程序正常运行时的配置)
TRACE 8 打印FATAL、WARNING、NOTICE、TRACE(线上程序异常时使用该配置)
DEBUG 16 打印FATAL、WARNING、NOTICE、TRACE、DEBUG(测试环境配

response.emit(name,obj,level)

在router层使用emit方式可以避免每个文件都引入logger和获取实例。参数说明:

  • name :日志事件名称,固定为'log'

  • obj: string或者object格式。如果是string,认为是错误消息。如果是object,请认为是详细信息。正确格式为{'stack':e,'msg':'msg','errno':'010'},分别代表错误堆栈错误消息错误码。错误消息如果不填将使用错误堆栈的消息。

  • level : 日志等级字符串,见上。不区分大小写,不写默认为notice

如下所示:

res.emit('log',{'stack':e,'errno':120,'msg' :'error happened!'},'warning');

getLogger(config)

当框架接收请求时,yog-log会新建一个实例,并保存到domain中,确保单次请求流程中调用的getLogger获取到的是同一个实例。

如果单独使用log不经过请求, getLogger会新建一个实例,此时应当传递config配置参数。

log(level,obj)

提供统一的log方法打印日志。参数说明同response.emit。另外针对各个应用日志等级提供了相对应的方法。

请确保使用快捷方法时名称准确,否则程序将报错。

  • fatal   :  logger.fata(obj)

  • warning : logger.warning(obj)

  • notice : logger.notice(obj)

  • trace : logger.trace(obj)

  • debug : logger.debug(obj)

注意 : logger为通过getLogger获取到的日志模块实例 。

自定义错误消息

如果想在日志中填写自定义的日志字段用于追查错误,请在obj中加入custom对象,然后按照键值对应放在custom中。如下所示:

 //router层
 res.emit('log',{
   'stack':e, //错误堆栈
   'errno':120,  //错误码
   'msg' :'error happened!',  //错误消息
   'custom':{'key1' :'value1','key2':'value2'} //自定义消息
 }); 

 //其他地方
 logger.log('warning', {
   'stack':e, //错误堆栈
   'errno':120,  //错误码
   'msg' :'error happened!',  //错误消息
   'custom':{'key1' :'value1','key2':'value2'} //自定义消息
 });

注意custom字段默认只会在warningfatal日志中展现

生成的错误日志将会类似于下面的格式。其中可以看到custom字段已自动添加到日志中:

WARNING: 07-03 16:44:55 yd * - [logid=868855481 filename=D:\fis\test\models\doc.js lineno=25 errno=120 key1=value1 key2=value2 errmsg=error%20happened!]

Debug支持

处于debug模式下Log将在控制台输出错误日志,并根据错误日志类型显示不同的颜色,方便开发人员调试(debug模式下依旧会写日志到文件)。有两种方法开启debug模式:

  • 开发时 :yog的config.json的yogLogger arguments添加参数debug : 1 即开启debug模式

  • 线上 : 无论在线上还是线下都可以在url中添加query参数_node_debug=1 开启debug模式

日志格式配置

yog-log兼容ODP支持灵活的日志格式配置,以满足不同系统对日志的格式要求。如接入OMP时warning日志格式配置:

%L: %{%m-%d %H:%M:%S}t %{app}x * %{pid}x [logid=%l filename=%f lineno=%N errno=%{err_no}x %{encoded_str_array}x errmsg=%{u_err_msg}x]

除非特殊情况,不建议随意修改日志格式配置。

格式配置方法如下:

字段 描述
%% 百分比字符串
%h name or address of remote-host
%t 时间戳,支持自定义格式如%{%d/%b/%Y:%H:%M:%S %Z}t
%i HTTP-header字段
%a 客户端IP
%A server address
%C 单个或全部cookie
%D 请求消耗时间/ms
%f 物理文件名称
%H 请求协议
%m 请求方法
%p 服务端端口
%q 请求query
%U 请求URL
%v HOSTNAME
%V HTTP_HOST
%L 当前日志等级
%N 错误发生行数
%E 错误码
%l LogID
%M 错误消息
%x 内置的自定义数据,有pid、cookie、encoded_str_array等

测试说明

单元测试说明详见此文档

  • 导引 最近遇到了一个需要在yog2框架中增加websocket服务的案子,此文主要讲在案子过程中碰到的一些问题和解决方案 前言 一、如果你只是想要解决socket.io与express共享解析session中间件的问题,本文运用了此文的解决方案:How to share sessions with Socket.IO 1.x and Express 4.x? -- Epeli的答案。简单概括一下就

 相关资料
  • Yog

    Yog 是一个基于 Express.js 的 Node.js Web 应用引导模块,扩展了 kraken.js。 安装 Linux/Unix $ npm install fex-team/yog Windows 打开 cmd npm install fex-team/yog 使用 .├── app.js├── config  # some `map.json` and `config.json`├

  • yog-view 是一个 Express.js 中间件,用来优化 js/css 输出排序,允许在 bigpipe 模式中显示。

  • yog-pm是在pm2的基础上提供了几个增强命令,提高pm2的易用性和稳定性。 安装 $ npm install -g yog-pm 使用 startOrReload : 启动pm2服务 服务没有启动时start服务,服务已经启动则会reload。 $ ypm startOrReload /home/wangcheng/demo/pm2-pro.json #利用pm2-pro.json文件启动引用

  • 统计学是通过搜索、整理、分析、描述数据等手段,以达到推断所测对象的本质,甚至预测对象未来的一门综合性科学。统计学用到了大量的数学及其它学科的专业知识,其应用范围几乎覆盖了社会科学和自然科学的各个领域。

  • 1.统计学习 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,也称统计机器学习。统计学习是数据驱动的学科。统计学习是一门概率论、统计学、信息论、计算理论、最优化理论及计算机科学等多个领域的交叉学科。 统计学习的对象是数据,它从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,又回到对数据的分析与预测中去。统计学习关于数据的基本假设是同类数据具有一定

  • 平均值 # statistics_mean.py from statistics import * data = [1, 2, 2, 5, 10, 12] print('{:0.2f}'.format(mean(data))) # statistics_mode.py from statistics import * data = [1, 2, 2, 5, 10, 12] print(m