Morgan Logger를 사용하는 방법?


109

모건과 로그인 할 수 없습니다. 콘솔에 정보를 기록하지 않습니다. 설명서에는 사용 방법이 나와 있지 않습니다.

변수가 무엇인지보고 싶습니다. 이것은 response.jsexpressjs 프레임 워크 파일의 코드입니다 .

var logger = require("morgan");

res.render = function(view, options, fn){
  options = options || {};
  var self = this;
  var req = this.req;
  var app = req.app;

  // support callback function as second arg
  if ('function' == typeof options) {
    fn = options, options = {};
  }

  // merge res.locals
  options._locals = self.locals;

  // default callback to respond
  fn = fn || function(err, str){
    if (err) return req.next(err);
    self.send(str);
  };

  // Here I want to see what fn is
  // But it doesn't show me anything in console
  // How to use it?
  logger(fn);

  // render
  app.render(view, options, fn);
};

Morgan을 사용하는 방법?

답변:


111

당신도 저와 똑같은 것에 혼란스러워하는 것 같습니다.이 질문을 우연히 발견 한 이유입니다. Logger를 인스턴스화하고 log 'this'라고 말하는 log4j (Java를 아는 경우)와 함께 Java에서 수행하는 것처럼 로깅을 수동 로깅과 연결한다고 생각합니다.

그런 다음 모건 코드를 파헤 쳤는데, 그 유형의 로거가 아니라 요청, 응답 및 관련 데이터의 자동 로깅을위한 것입니다. Express / Connect 앱에 미들웨어로 추가되면 기본적으로 원격 IP, 요청 방법, http 버전, 응답 상태, 사용자 에이전트 등의 세부 정보를 보여주는 stdout에 문을 기록해야합니다. 토큰을 사용하여 로그를 수정할 수 있습니다. 'dev'를 정의하거나 파일과 같은 출력 스트림에 로그 아웃하여 색상을 추가합니다.

이 경우에도 사용할 수 있다고 생각한 목적을 위해 다음을 사용해야합니다.

console.log(..);

또는 객체에 대한 출력을 예쁘게 만들고 싶다면 :

var util = require("util");
console.log(util.inspect(..));

60

원하는 것을 정확히 얻지 못할 수있는 방법이 있다고 생각하지만 Morgan의 로깅을 log4js와 통합 할 수 있습니다. 즉, 모든 로깅 활동이 동일한 위치로 이동할 수 있습니다. Express 서버의 다이제스트가 다소 자명하기를 바랍니다.

var express = require("express");
var log4js = require("log4js");
var morgan = require("morgan");
...
var theAppLog = log4js.getLogger();
var theHTTPLog = morgan({
  "format": "default",
  "stream": {
    write: function(str) { theAppLog.debug(str); }
  }
});
....
var theServer = express();
theServer.use(theHTTPLog);

이제 AppLog에 원하는 것은 무엇이든 쓸 수 있으며 Morgan은 동일한 appender 등을 사용하여 원하는 것을 같은 위치에 쓸 것입니다. 물론, debug () 대신 스트림 래퍼에서 info () 또는 원하는 것을 호출 할 수 있습니다. -이는 Morgan의 req / res 로깅에 부여하려는 로깅 수준을 반영합니다.


38

모건은 당신이 설명하는 방식으로 로그인하는 데 사용되어서는 안됩니다. Morgan은 Apache 및 Nginx와 같은 서버가 error_log 또는 access_log에 기록하는 방식으로 로깅을 수행하도록 구축되었습니다. 참고로 모건을 사용하는 방법은 다음과 같습니다.

var express     = require('express'),
    app         = express(),
    morgan      = require('morgan'); // Require morgan before use

// You can set morgan to log differently depending on your environment
if (app.get('env') == 'production') {
  app.use(morgan('common', { skip: function(req, res) { return res.statusCode < 400 }, stream: __dirname + '/../morgan.log' }));
} else {
  app.use(morgan('dev'));
}

옵션 해시를 사용하여 모건이 호출 된 생산 라인을 확인합니다. {skip: ..., stream: __dirname + '/../morgan.log'}

stream해당 개체 의 속성은 로거가 출력하는 위치를 결정합니다. 기본적으로 STDOUT (원하는대로 콘솔)이지만 요청 데이터 만 기록합니다. 그것은 무엇을하는지 console.log()하지 않을 것 입니다.

즉시 검사하려면 내장 util라이브러리를 사용하십시오 .

var util = require('util');
console.log(util.inspect(anyObject)); // Will give you more details than console.log

그래서 당신의 질문에 대한 대답은 당신이 잘못된 질문을하고 있다는 것입니다. 그러나 로깅 요청에 Morgan을 계속 사용하려면 거기에 있습니다.


그런 종류의 로깅을 위해 무엇을 권장합니까?
Noah

Debug 패키지는 당신이 원할 것입니다. 실제 기본 아이디어는 사용하는 대신 console.log()코드의 어느 곳에서나 Debug lib를 사용할 수 있으며 프로덕션에서 제거하는 것에 대해 걱정할 필요가 없다는 것입니다. github.com/visionmedia/debug
WGP

1
모르겠어요 ... NodeJS 앱에서 오류가 발생 하면 모건을 사용하여 로그 파일에 해당 오류를 기록 하지 않습니까? 아니면 윈스턴, 아니면 번얀? 그렇지 않다면 무엇을 사용할까요?
Randy L

2
OP는 그가 Morgan을 사용하여 데이터를 검사하고 Debug 모듈과 같은 것으로 실제로 수행해야하는 개발중인 앱을 디버깅하기를 원한다는 것을 암시했습니다. 프로덕션의 파일에 오류를 반드시 기록해야합니다. 위의 답변에서 제안한대로 앱을 설정하면 프로덕션의 파일과 개발중인 콘솔에 오류가 기록됩니다. 그게 문제가 해결 되었나요?
wgp 2015

17

나는 전에 같은 문제에 직면했고 대신 윈스턴을 사용했습니다. 위에서 말했듯이 morgan은 요청 / 응답의 자동 로깅을위한 것입니다. Winston은 log4Net / log4J와 거의 동일한 방식으로 구성 할 수 있으며 심각도 수준, 로깅 할 수있는 다른 스트림 등이 있습니다.

예를 들면 :

npm install winston

그런 다음 애플리케이션 초기화 어딘가에서 아래 코드를 호출하면 :

var winston = require('winston');

// setup default logger (no category)
winston.loggers.add('default', {
    console: {
        colorize: 'true',
        handleExceptions: true,
        json: false,
        level: 'silly',
        label: 'default',
    },
    file: {
        filename: 'some/path/where/the/log/file/reside/default.log',
        level: 'silly',
        json: false,
        handleExceptions: true,
    },
});

//
// setup logger for category `usersessions`
// you can define as many looggers as you like
//
winston.loggers.add('usersessions', {
    console: {
        level: 'silly',
        colorize: 'true',
        label: 'usersessions',
        json: false,
        handleExceptions: true,
    },
    file: {
        filename: 'some/path/where/the/log/file/reside/usersessions.log',
        level: 'silly',
        json: false,
        handleExceptions: true,
    },
});

참고 : 위 코드를 호출하기 전에 winston.loggers는 비어 있습니다. 즉, 아직 구성된 로거가 없습니다. Log4Net / J XmlConfigure 메서드와 매우 유사합니다. 로깅을 초기화하려면 먼저 메서드를 호출해야합니다.

그런 다음 나중에 애플리케이션 서버 측 코드에서 다음을 수행 할 수 있습니다.

var winston = require('winston');
// log instances as defined in first snippet
var defaultLog = winston.loggers.get('default'); 
var userSessionsLog = winston.loggers.get('usersessions');

defaultLog.info('this goes to file default.log');
userSessionsLog.debug('this goes to file usersessions.log')

도움이 되었기를 바랍니다.

추가 문서 참조 : https://www.npmjs.com/package/winston


Java 유형 언어에서 MEAN 스택으로 전환하는 개발자에게는 이것이 편안하고 친숙해질 것입니다. 감사합니다
Jayesh

내 앱이 배포 될 때이 로그 파일에 액세스 할 수있는 방법을 알려 주시겠습니까? 실제로 로그 파일을 클라우드 스토리지에 저장하고 싶지만 적절한 방법을 찾을 수 없습니다
Abhay Sehgal

9

Morgan :-Morgan은 애플리케이션에 액세스하는 클라이언트를 식별하는 데 도움이되는 미들웨어입니다. 기본적으로 로거입니다.

Morgan을 사용하려면 아래 단계를 따라야합니다.

  1. 아래 명령을 사용하여 Morgan을 설치하십시오.

npm install --save morgan

json.package 파일에 morgan이 추가됩니다.

  1. 프로젝트에 모건 포함

var morgan = require('morgan');

3> // 쓰기 스트림 생성 (추가 모드에서)

var accessLogStream = fs.createWriteStream(
      path.join(__dirname, 'access.log'), {flags: 'a'}
 );
// setup the logger 
app.use(morgan('combined', {stream: accessLogStream}));

참고 : 맹목적으로 위를 수직으로 세우지 말고 필요한 모든 조건이 있는지 확인하십시오.

위는 사용자가 앱에 액세스하면 루트에 대한 access.log 파일을 자동으로 생성합니다.


6
var express = require('express');

var fs = require('fs');

var morgan = require('morgan')

var app = express();

// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(__dirname + '/access.log',{flags: 'a'});


// setup the logger
app.use(morgan('combined', {stream: accessLogStream}))


app.get('/', function (req, res) {
  res.send('hello, world!')
});

예제 nodejs + express + morgan


4

나의 경우에는:

-console.log()  // works
-console.error() // works
-app.use(logger('dev')) // Morgan is NOT logging requests that look like "GET /myURL 304 9.072 ms - -"

FIX : Visual Studio 코드를 사용하고 있었는데이 코드를 Launch Config에 추가해야했습니다.

"outputCapture": "std"

제안 사항, IDE에서 실행중인 경우 명령 줄에서 직접 실행하여 IDE가 문제를 일으키지 않는지 확인하십시오.


되지 console.log()도 표준 출력에 쓰기?
Old Geezer

0

mongo-morgan-ext 를 사용해 볼 수도 있습니다.

사용법은 다음과 같습니다.

var logger = require('mongo-morgan-ext');

var db = 'mongodb://localhost:27017/MyDB';

var collection = 'Logs'

var skipfunction = function(req, res) {

return res.statusCode > 399;
} //Thiw would skip if HTTP request response is less than 399 i.e no errors.

app.use(logger(db,collection,skipfunction)); //In your express-application

예상되는 출력은 다음과 같습니다.

{
    "RequestID": "",
    "status": "",
    "method": "",
    "Remote-user": "",
    "Remote-address": "",
    "URL": "",
    "HTTPversion": "",
    "Response-time": "",
    "date":"",
    "Referrer": "",
    "REQUEST": { //10
        "Accept": "",
        "Accept-Charset": "",
        "Accept-Encoding": "",
        "Accept-Language": "",
        "Authorization": "",
        "Cache-Control": "",
        "Connection": "",
        "Cookie": "",
        "Content-Length": "",
        "Content-MD5": "",
        "Content-Type": "",
        "Expect": "",
        "Forwarded": "",
        "From": "",
        "Host": "",
        "Max-Forwards": "",
        "Origin": "",
        "Pragma": "",
        "Proxy-Authorization": "",
        "Range": "",
        "TE": "",
        "User-Agent": "",
        "Via": "",
        "Warning": "",
        "Upgrade": "",
        "Referer": "",
        "Date": "",
        "X-requested-with": "",
        "X-Csrf-Token": "",
        "X-UIDH": "",
        "Proxy-Connection": "",
        "X-Wap-Profile": "",
        "X-ATT-DeviceId": "",
        "X-Http-Method-Override":"",
        "Front-End-Https": "",
        "X-Forwarded-Proto": "",
        "X-Forwarded-Host": "",
        "X-Forwarded-For": "",
        "DNT": "",
        "Accept-Datetime": "",
        "If-Match": "",
        "If-Modified-Since": "",
        "If-None-Match": "",
        "If-Range": "",
        "If-Unmodified-Since": ""
    },
    "RESPONSE": {
        "Status": "",
        "Content-MD5":"",
        "X-Frame-Options": "",
        "Accept-Ranges": "",
        "Age": "",
        "Allow": "",
        "Cache-Control": "",
        "Connection": "",
        "Content-Disposition": "",
        "Content-Encoding": "",
        "Content-Language": "",
        "Content-Length": "",
        "Content-Location": "",
        "Content-Range": "",
        "Content-Type":"",
        "Date":"",
        "Last-Modified": "",
        "Link": "",
        "Location": "",
        "P3P": "",
        "Pragma": "",
        "Proxy-Authenticate": "",
        "Public-Key-Pins": "",
        "Retry-After": "",
        "Server": "",
        "Trailer": "",
        "Transfer-Encoding": "",
        "TSV": "",
        "Upgrade": "",
        "Vary": "",
        "Via": "",
        "Warning": "",
        "WWW-Authenticate": "",
        "Expires": "",
        "Set-Cookie": "",
        "Strict-Transport-Security": "",
        "Refresh":"",
        "Access-Control-Allow-Origin": "",
        "X-XSS-Protection": "",
        "X-WebKit-CSP":"",
        "X-Content-Security-Policy": "",
        "Content-Security-Policy": "",
        "X-Content-Type-Options": "",
        "X-Powered-By": "",
        "X-UA-Compatible": "",
        "X-Content-Duration": "",
        "Upgrade-Insecure-Requests": "",
        "X-Request-ID": "",
        "ETag": "",
        "Accept-Patch": ""
    }

}

0

모건을 사용하는 것은 매우 간단합니다. 는 AS 문서는 제안 모건과 원하는 출력을 얻을 수있는 다른 방법이 있습니다. 미리 구성된 로깅 방법과 함께 제공되거나 직접 정의 할 수 있습니다. 예 :

const 모건 = require ( 'morgan')

app.use (모건 ( 'tiny')

이렇게하면 tiny라는 사전 구성이 제공됩니다. 터미널에서 무엇을하는지 알 수 있습니다. 만약 당신이 이것에 만족하지 않고 당신이 더 깊은 것을 원할 경우, 예를 들어 요청 URL을 말하자, 토큰이 들어오는 곳입니다.

morgan.token ( 'url', function (req, res) {return '/ api / myendpoint'})

다음과 같이 사용하십시오.

app.use (morgan ( ': url')

거기에 강조 표시된 문서를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.