การบันทึก Node.js


177

มีห้องสมุดใดบ้างที่จะช่วยให้ฉันจัดการการบันทึกในแอปพลิเคชัน Node ของฉัน สิ่งที่ฉันต้องทำคือฉันต้องการเขียนบันทึกทั้งหมดลงในไฟล์และฉันต้องการตัวเลือกเช่นการเปิดตัวไฟล์หลังจากขนาดหรือวันที่แน่นอน


ฉันได้รวม log4js ฉันพยายามที่จะเก็บรายละเอียดการกำหนดค่าทั้งหมดในไฟล์เดียวและใช้วิธีการเฉพาะในไฟล์แอปพลิเคชันอื่น ๆ เพื่อความสะดวกในการบำรุงรักษา แต่มันไม่ทำงานตามที่คาดไว้ นี่คือสิ่งที่ฉันพยายามทำ

var log4js = require('log4js'); 
log4js.clearAppenders()
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('test.log'), 'test');
var logger = log4js.getLogger('test');
logger.setLevel('ERROR');


var traceLogger = function (message) {
        logger.trace('message');
    };

var errorLogger = function (message) {
        logger.trace(message);
    };


exports.trace = traceLogger;
exports.error = errorLogger;

ฉันรวมไฟล์นี้ไว้ในไฟล์อื่นแล้วลองใหม่

log.error ("Hello Error Message");

แต่มันไม่ทำงาน มีอะไรผิดปกติหรือเปล่า?


1
log4js ดูเหมือนว่าโอเค คุณตั้งระดับความผิดพลาดผิด มันควรจะเป็น: logger.setLevel (log4js.levels.ERROR);
Boklucius

คำตอบ:


196

Winstonเป็นห้องสมุดการบันทึกที่ค่อนข้างดี คุณสามารถเขียนบันทึกออกไปยังไฟล์โดยใช้มัน

โค้ดจะมีลักษณะดังนี้:

var winston = require('winston');

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({ json: false, timestamp: true }),
    new winston.transports.File({ filename: __dirname + '/debug.log', json: false })
  ],
  exceptionHandlers: [
    new (winston.transports.Console)({ json: false, timestamp: true }),
    new winston.transports.File({ filename: __dirname + '/exceptions.log', json: false })
  ],
  exitOnError: false
});

module.exports = logger;

จากนั้นคุณสามารถใช้สิ่งนี้เช่น:

var logger = require('./log');

logger.info('log to file');


3
ฉันใช้วินสตันมานานแล้ว มันมีรถบักกี้และฉันได้ทิ้งไว้ในความโปรดปรานของ npmlog
สนามบิน

8
@everyone ดูเหมือนว่า winston จะได้รับการดูแลอีกครั้ง ... github.com/flatiron/winston/network
Daithí

เพียงบันทึกย่อ: call logger.cli () ในตัวอย่างด้านบนสำหรับเอาต์พุตบรรทัดคำสั่งที่มีสี
Duncan

1
Winston ไม่อนุญาตให้กำหนดค่าให้กำหนดและอ่านจากไฟล์. json การออกแบบที่แย่ IMO
ย่อ

59

Scribe.JS Lightweight Logger

ฉันดูผ่านตัวบันทึกจำนวนมากและฉันไม่สามารถหาโซลูชันที่มีน้ำหนักเบาได้ - ดังนั้นฉันตัดสินใจที่จะสร้างโซลูชันแบบง่าย ๆ ที่โพสต์บน GitHub

  • บันทึกไฟล์ซึ่งจัดระเบียบโดยผู้ใช้วันที่และระดับ
  • ให้ผลลัพธ์ที่ดี (เราทุกคนชอบที่)
  • ส่วนต่อประสาน HTML ที่ใช้งานง่าย

ฉันหวังว่านี่จะช่วยคุณได้

การสาธิตออนไลน์

http://bluejamesbond.github.io/Scribe.js/

การเข้าถึงเว็บอย่างปลอดภัยสู่บันทึก

A

พิมพ์ Pretty Text ไปที่คอนโซลด้วย!

A

การเข้าถึงเว็บ

A

Github

https://github.com/bluejamesbond/Scribe.js


5
ห้องสมุดนี้ไม่ได้รับการดูแลอีกต่อไป: github.com/bluejamesbond/ …
Simon Meusel

30

Log4jsเป็นหนึ่งในไลบรารีการบันทึกที่นิยมมากที่สุดสำหรับแอปพลิเคชัน nodejs

รองรับฟีเจอร์เด็ด ๆ มากมาย:

  1. การบันทึกสีคอนโซล
  2. การแทนที่ฟังก์ชัน console.log ของโหนด (ทางเลือก)
  3. appender ไฟล์ที่มีการกลิ้งตามขนาดไฟล์
  4. SMTP, GELF, hook.io, appg Loggly
  5. ตัวประมวลผลหลายตัว (มีประโยชน์เมื่อคุณมีกระบวนการทำงาน)
  6. คนตัดไม้สำหรับเซิร์ฟเวอร์เชื่อมต่อ / ด่วน
  7. โครงร่าง / รูปแบบข้อความบันทึกที่กำหนดค่าได้
  8. ระดับการบันทึกที่แตกต่างกันสำหรับหมวดหมู่การบันทึกที่แตกต่างกัน (ทำบางส่วนของบันทึกแอพของคุณเป็น DEBUG, อื่น ๆ เท่านั้นข้อผิดพลาดและอื่น ๆ )

ตัวอย่าง:

  1. การติดตั้ง: npm install log4js

  2. การกำหนดค่า ( ./config/log4js.json):

    {"appenders": [
        {
            "type": "console",
            "layout": {
                "type": "pattern",
                "pattern": "%m"
            },
            "category": "app"
        },{
            "category": "test-file-appender",
            "type": "file",
            "filename": "log_file.log",
            "maxLogSize": 10240,
            "backups": 3,
            "layout": {
                "type": "pattern",
                "pattern": "%d{dd/MM hh:mm} %-5p %m"
            }
        }
    ],
    "replaceConsole": true }
  3. การใช้งาน:

    var log4js = require( "log4js" );
    log4js.configure( "./config/log4js.json" );
    var logger = log4js.getLogger( "test-file-appender" );
    // log4js.getLogger("app") will return logger that prints log to the console
    logger.debug("Hello log4js");// store log in file


6

"logger.setLevel ('ข้อผิดพลาด');" ทำให้เกิดปัญหา ฉันไม่เข้าใจว่าทำไม แต่เมื่อฉันตั้งเป็นอื่นนอกเหนือจาก "ALL" จะไม่มีสิ่งใดพิมพ์ออกมาในไฟล์ ฉันแหย่เล็กน้อยและแก้ไขรหัสของคุณ มันทำงานได้ดีสำหรับฉัน ฉันสร้างสองไฟล์

logger.js

var log4js = require('log4js');
log4js.clearAppenders()
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('test.log'), 'test');
var logger = log4js.getLogger('test');
logger.setLevel('ERROR');

var getLogger = function() {
   return logger;
};

exports.logger = getLogger();

logger.test.js

var logger = require('./logger.js')

var log = logger.logger;

log.error("ERROR message");
log.trace("TRACE message");

เมื่อฉันเรียกใช้ "node logger.test.js" ฉันเห็นเฉพาะ "ข้อความข้อผิดพลาด" ในไฟล์ test.log ถ้าฉันเปลี่ยนระดับเป็น "TRACE" ดังนั้นทั้งสองบรรทัดจะถูกพิมพ์ลงใน test.log


2
logging.apache.org/log4j/1.2/manual.html Loggers อาจได้รับการกำหนดระดับ ชุดของระดับที่เป็นไปได้นั่นคือ: TRACE, DEBUG, INFO, WARN, ERROR และ FATAL การร้องขอการบันทึกจะถูกเปิดใช้งานหากระดับนั้นสูงกว่าหรือเท่ากับระดับของตัวบันทึก มิฉะนั้นคำขอจะถูกปิดการใช้งาน
Shawn C.

3

Winston เป็นตัวเลือกที่ดีสำหรับนักพัฒนาส่วนใหญ่ ฉันใช้วินสตันมานานแล้ว เมื่อเร็ว ๆ นี้ฉันใช้ winston พร้อมกับ papertrail ซึ่งจะทำการบันทึกแอปพลิเคชันไปอีกระดับ

นี่คือภาพหน้าจอที่ดีจากเว็บไซต์ของพวกเขา

ป้อนคำอธิบายรูปภาพที่นี่

มีประโยชน์อย่างไร

  • คุณสามารถจัดการบันทึกจากระบบต่างๆได้ในที่เดียว สิ่งนี้มีประโยชน์มากเมื่อคุณมีการสื่อสารแบ็กเอนด์สองรายการและสามารถดูบันทึกจากทั้งสองที่

  • บันทึกเป็นรายการสด คุณสามารถดูบันทึกเรียลไทม์ของเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ

  • การค้นหาและตัวกรองที่มีประสิทธิภาพ

  • คุณสามารถสร้างการแจ้งเตือนเพื่อส่งอีเมลถึงคุณหากพบข้อความในบันทึก

และคุณสามารถค้นหาเพิ่มเติมได้ที่http://help.papertrailapp.com/kb/how-it-works/event-viewer/

การกำหนดค่าอย่างง่ายโดยใช้winston, winston-expressและwinston-papertrailโมดูลโหนด

import winston from 'winston';
import expressWinston from 'express-winston';
//
// Requiring `winston-papertrail` will expose
// `winston.transports.Papertrail`
//
require('winston-papertrail').Papertrail;
// create winston transport for Papertrail
var winstonPapertrail = new winston.transports.Papertrail({
  host: 'logsX.papertrailapp.com',
  port: XXXXX
});
app.use(expressWinston.logger({
  transports: [winstonPapertrail],
  meta: true, // optional: control whether you want to log the meta data about the request (default to true)
  msg: "HTTP {{req.method}} {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
  expressFormat: true, // Use the default Express/morgan request formatting. Enabling this will override any msg if true. Will only output colors with colorize set to true
  colorize: true, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
  ignoreRoute: function (req, res) { return false; } // optional: allows to skip some log messages based on request and/or response
}));

ฉันหวังว่านี่จะช่วยให้ใครบางคนจัดการบันทึกของพวกเขา !!


1
สิ่งนี้ยังคงใช้งานได้อย่างไรก็ตามหลังจากการอัปเกรด winston เป็น v3 คุณจะได้รับคำเตือน: "Papertrail เป็นระบบขนส่งวินสตันแบบดั้งเดิมพิจารณาอัปเกรด" มีการอัปเกรดเป็นการขนส่งที่โดดเด่นในปัจจุบัน
Jim Jimson

2

โมดูล 'nodejslogger' สามารถใช้สำหรับการบันทึกอย่างง่าย มีการบันทึกสามระดับ (INFO, ERROR, DEBUG)

var logger = require('nodejslogger')
logger.init({"file":"output-file", "mode":"DIE"})

D: Debug, I: Info, E: Error

logger.debug("Debug logs")
logger.info("Info logs")
logger.error("Error logs")

โมดูลสามารถเข้าถึงได้ที่: https://www.npmjs.com/package/nodejslogger


0

สังเกตว่าerrorLoggerเป็นเสื้อคลุมรอบlogger.trace แต่ระดับของการตัดไม้เป็นข้อผิดพลาดดังนั้นlogger.traceจะไม่ได้เข้าสู่ระบบข้อความในการตัดไม้ 's appenders

การแก้ไขคือการเปลี่ยนlogger.traceเพื่อlogger.errorในร่างกายของerrorLogger

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.