美文网首页
node端日志记录工具-winston

node端日志记录工具-winston

作者: 云之一 | 来源:发表于2021-01-11 17:56 被阅读0次

    一、简介

    winston是一个简单通用的node服务端日志记录库。它有如下特点:

    支持多种存储介质,例如将日志存储在本地文件、远程数据库或者直接输出在控制台

    支持日志记录分级,以区分其重要程度

    灵活可扩展,日志的格式、等级、存储介质皆可自定义

    二、用法

    1、使用createLogger方法创建日志记录器(官方推荐使用方式)

    自创建日志记录器 折叠源码

    import winston from 'winston'

    const logger = winston.createLogger({

      level: 'info',

      format: winston.format.json(),

      transports: [

        new winston.transports.File({ filename: 'error.log', level: 'error' }),

        new winston.transports.File({ filename: 'combined.log' })

      ]

    });

    三、可配置项

    参数名称默认值参数说明

    levelswinston.config.npm日志记录分级标准,可自定义。

    level'info'日志记录的最低级别,取值于levels,只记录严重程度大于等于'info'的日志记录

    formatwinston.format.json每一条日志记录的格式,可自定义

    transports[ ]指明了日志的存储位置,可扩展

    exitOnErrortrue当winston发生错误时,是否退出

    silentfalse设置为true,则所有日志记录被禁止,(实际访问时logger.silent为undefined)

    1.levels

    levels指明了日志可以分为几个级别,各级别定义了日志记录的严重程度。每个级别对应一个整数,随着整数值由小到大,记录的严重性由高到低。winston.config中内置了三个levels,默认的levels为winston.config.npm(如下),还有两个是winston.config.cli和winston.config.syslog。除了内置的levels,我们也可以自己定义levels。

    winston.config.npm

    {

      levels:

       { error: 0,

         warn: 1,

         info: 2,

         http: 3,

         verbose: 4,

         debug: 5,

         silly: 6

       },

      colors:

       { error: 'red',

         warn: 'yellow',

         info: 'green',

         http: 'green',

         verbose: 'cyan',

         debug: 'blue',

         silly: 'magenta'

       }

    }

    在使用winston.createLogger方法创建了日志记录器logger并在配置项中指定了levels之后,levels中的每个属性都将会作为记录器的方法,例如logger.error、logger.info。因此,写入记录时将有两种方式:logger.log(level,message[,meta])和logger.[levels属性](message[,meta])。

    写入记录 折叠源码

    //使用log方法写入日志

    logger.log('info', "this is a info message")

    logger.log('warn', "this is a warn message")

    logger.log('error', "this is a error message")

    //使用levels属性方法写入日志

    logger.info("this is a info message")

    logger.warn("this is a warn messagee")

    logger.error("this is a error message")

    2.format

         在winston中,写入的每一条日志记录都是一个info 对象。info 对象是一个可变的对象,但是它必须有level和message两个属性。format就是一系列对info 对象进行格式化处理的函数。winston内置了15个默认的格式化方法。常用的有以下几个:

    colorize():控制台输出时,为日志记录中的level属性和message属性添加颜色;输出到文件时,使用此方法会导致乱码。

    padlevels():格式对齐

    timestamp():为info对象添加timestamp属性,属性的默认值为世界时,与北京时间有8小时时差。因此使用时要设置format参数,例timestamp({format:'YYYY-MM-DD HH:mm:ss'})

    metadata():用来搜集处理写入到info对象中的元数据对象。

    simple():格式化输出方法,只输出包含level属性和message属性的json

    json():格式化输出方法,将info对象序列化为json输出。

    printf():格式化输出方法。接收一个回调函数作为参数,可自定义输出的格式。

    combine():用于将多个格式化方法合并。

    info object

    {

      level: 'info',               

      message: 'this is a info message!'

    }

    winston.format 折叠源码

    import { createLogger, format, transports} from 'winston'

    const { combine, metadata, timestamp, printf, colorize, padLevels } = format

    const loggerDebug = createLogger({

        level: 'debug',

        format: combine(

            colorize({all: true}),

            timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),

            metadata({key: 'content', fillExcept: ['timestamp', 'level', 'message']}),

            padLevels(),

            printf(info => `${info.timestamp}  ${info.message}: ${safeStringify(info.content)}`)

        ),

        transports: [

            new transports.Console()

        ]

    })

    3.transports

            在winston中,transport指定了日志记录的存储位置。winston内置了四个transport:Console、File、Http、Stream。除此之外,winston的贡献者及社区人员也开发了非常多的transport。

    winston.transports.Console(options)

    Console的可配置项 折叠源码

    new winston.transports.Console({

        level: 'info', //该transport应该记录哪一level的日志,默认值与logger中设置的相同

        silent: false, //是否禁止输出,默认为false

        eol: os.EOL, //string类型,结束字符串,默认为os.EOL

        stderrLevels:[],//levels过滤后的数组,包含了应当用stderr代替stdout来记录的level,默认为空数组

        consoleWarnLevels :[] //levels过滤后的数组,包含了应当使用console.warn/stderr代替stdout的level,默认为空数组

    })

    winston.transports.File

    (options)

    File可配置项 展开源码

    winston.transports.DailyRotateFile(options)

    transports.DailyRotateFile 折叠源码

    new transports.DailyRotateFile({

               datePattern: 'YYYY-MM-DD',//日期格式

               filename: 'logs/info/info-%DATE%.log',//日志记录路径

               // zippedArchive: true,//除正在进行记录的日志文件外,其他文件是否压缩。设置为true后,压缩文件无法删除

               maxSize: '20m',//每个文件的最大存储容量,单位可为k、m、g

               maxFiles: '30d'//日志删除的条件,可为数字或数字后加d表示的天数。

           })

    winston.transports.Http

    (options)

    Http可配置项 折叠源码

    new winston.transports.Http({

        host: 'localhost',//存储日志的主机名(Default: localhost)

        port: 80,// 端口号(Default: 80 or 443)

        path: '',//日志存储的文件路径(Default: /)

        auth: {} ,//(Default: None) 包含http认证时所使用的username和password的对象

        ssl: false// 是否使用HTTPS,(Default: false)

    })

    winston.transports.Stream(

    options)

    Stream可配置项 折叠源码

    new winston.transports.Stream({

        stream: fs.createWriteStream('/dev/null'),//any Node.js stream. If an objectMode stream is provided then the entire info object will be written. Otherwise info[MESSAGE] will be written.

        level: 'info', //该transport应该记录哪一level的日志,默认值与logger中设置的相同

        silent: false, //是否禁止输出,默认为false

        eol: '\r\n', //string类型,结束字符串,默认为os.EOL

      })

    四、异常处理

            当winston出现异常时,我们可以通过捕捉到这类异常,并将其记录下来。

    winston异常处理 折叠源码

    import { createLogger, format, transports } from 'winston'

    //方法一:在创建日志记录器时,设置exceptionHandlers

    const logger = createLogger({

        transports: [

            new transports.File({ filename: 'combined.log' })

        ],

        exceptionHandlers: [

            new transports.File({ filename: 'exceptions.log' })

        ]

    });

    //方法二:创建日志记录器后,调用logger.exceptions.handle方法添加

    const logger1 = createLogger({

        transports: [

            new transports.File({ filename: 'combined.log' })

        ]

    });

    logger1.exceptions.handle(

        new transports.File({ filename: 'exceptions.log' })

    );

    五、日志查询

     使用日志记录器的query方法可以查询日志记录,它接收两个参数:查询条件options、查询结果处理函数。其中options中的可配置项可参照loggly(https://www.loggly.com/docs/api-retrieving-data/)。

    日志查询 折叠源码

    const options = {

      from: new Date() - (24 * 60 * 60 * 1000),

      until: new Date(),

      limit: 10,

      start: 0,

      order: 'desc',

      fields: ['message']

    };

    logger.query(options, function (err, results) {

      if (err) {

        /* TODO: handle me */

        throw err;

      }

      console.log(results);

    });

    相关文章

      网友评论

          本文标题:node端日志记录工具-winston

          本文链接:https://www.haomeiwen.com/subject/fuqkrqtx.html