Node.js - ghi nhật ký / Sử dụng morgan và wonton


99

chúng tôi sử dụng morganđể ghi lại chuyển đổi nhanh của chúng tôi:

var morgan  = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
  return req.method + ' ' + req.url + ' ' + req.uuid;
})

Ngoài ra, chúng tôi sử dụng winstonđể ghi nhật ký khác của chúng tôi:

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
         new (winston.transports.Console)({ level: 'info' }),
          new (winston.transports.File)({ filename: '/var/log/log-file.log' })
  ]
});

Có cách nào để kết hợp hai log với nhau? tình hình bây giờ là morganghi vào đầu ra tiêu chuẩn của tôi, khi winstonghi vào /var/log/log-file.log.

Tôi ước rằng tệp trình ghi nhật ký sẽ kết hợp từ thông tin chuyển đổi nhanh và từ thông tin khác mà tôi muốn ( logger.info()) ..


Mục đích của việc này là gì, ý tôi là, tại sao bạn lại cần morgan khi ăn mày, tại sao không viết một bài trung gian winton cho nhanh?
Dimitri Kopriwa

Câu trả lời:


141

Bài viết này thực hiện một công việc xuất sắc cho những gì bạn muốn làm.

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

Đối với mã cụ thể của bạn, bạn có thể cần một cái gì đó như sau:

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
});

logger.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
};

app.use(require("morgan")("combined", { "stream": logger.stream }));

Điều này sẽ thiết lập Winston để ghi nhật ký vào bảng điều khiển cũng như một tệp. Sau đó, bạn có thể sử dụng biểu thức cuối cùng để chuyển đầu ra từ phần mềm trung gian morgan vào wonton.


Chúng ta có thể sử dụng dấu thời gian trong quá trình này không?
bombayquant

23
Có vẻ như không cần thiết phải ghi đè logger.stream .. Trong trường hợp của tôi, tôi đã có thể làm đượcapp.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
Devon Sams

17
Nếu bạn đang sử dụng phương pháp của @ DevonSams, bạn sẽ nhận được một dòng trống giữa các dòng đã ghi bởi vì cả morgan và wonton đều thêm dấu ngắt dòng vào cuối thông báo đã ghi. Bạn có thể đơn giản cắt bỏ dòng bùng phát khỏi tin nhắn vớilogger.info(message.trim())
Timo

2
Điều gì sẽ xảy ra nếu tôi muốn sử dụng logger.error thay vì logger.info, nếu máy chủ phản hồi với 500?
Alendorff

3
Để winston: ^3.0.0sử dụng winston.createLoggerthay vìnew winston.Logger
streof

21

Trong phần Typecript:

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));

Tại sao lại nhỏ và không kết hợp?
An-droid

Tôi không thể làm cho nó hoạt động được nữa. Có vẻ như kiểu gõ không chính xác. stackoverflow.com/questions/50048193/…
jpetitte

7

Cập nhật dòng cuối cùng để xóa cảnh báo

app.use(require("morgan")("combined", { stream: logger.stream }));

3

Đối với Typescript, một cách khác để thực hiện nó mà không cần tạo lớp là

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

Giải pháp này được cung cấp từ trang Github này https://github.com/winstonjs/winston/issues/1385 . Tuy nhiên, điều quan trọng cần lưu ý là có một chút khác biệt giữa các mã của chúng tôi. Thay vì:

app.use(morgan('combined', { myStream }));

Tôi sử dụng:

app.use(morgan('combined', { stream: myStream }));

Điều này đã giúp tôi không phải là quá lớn trong việc tạo các lớp học.


1

Morgan có một thói quen xấu là kết thúc tin nhắn bằng dấu \nđể làm cho mọi thứ có trật tự, bạn có thể muốn xóa nó trước khi viết nó cho wonton.

Điều này có thể được thực hiện theo nhiều cách khác nhau như ở phía định dạng trong winton hoặc bằng cách cập nhật luồng của bạn để không ghi \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.