>  기사  >  웹 프론트엔드  >  Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

青灯夜游
青灯夜游앞으로
2021-12-28 10:49:522729검색

Node 서비스에서 로그를 작성하는 방법은 무엇인가요? 다음 글은 Node.js 서비스에서 로그를 작성하는 방법에 대한 실질적인 이해를 제공할 것입니다. 도움이 되길 바랍니다!

Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

노드를 사용하여 서버를 작성할 때 가장 번거로운 것은 위치 문제를 해결하는 것입니다. Chrome 브라우저와 달리 Chrome 브라우저와는 달리 개발 도구를 사용하거나 디버깅 지점을 직접 중단할 수 있습니다. Node 写服务端的时候,比较头疼的是排查定位问题,因为不像 Chrome 浏览器中,我们有直接的报错提示在 dev tool 中,或者我们可以直接打断点调试。

经常我们会遇到在明明我在 test 环境可以啊,为什么 live 环境不行的问题。假如没有日志,对于这种问题,根据毫无头绪。

所以这篇文章,我们来聊聊如何在 Node 服务中写日志。

快速新建一个 koa 项目

先保证你全局安装了 koa2

npm i koa2 -g

然后执行:

koa2 -e node-log # 新建一个项目
cd node-log
npm i # 安装依赖
npm run start # 启动

基础的服务就搭建起来了。访问 http://localhost:3000/,就可以看到以下的页面:

Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

以上是一个快速搭建 koa 服务的方法。这个项目中内置了一个写日志的库——koa-logger。我们先来看看它做了什么东西吧。

koa-logger

这个库比较简单,记录请求的基本信息,比如请求的方法、URl、用时等。作为中间件中使用,注意:推荐放在所有的中间件之前,这个跟 koa 的洋葱模型有关。假如不是第一个,计算时间会不准确。

var logger = require('koa-logger');
app.use(logger());

在我们访问响应的资源的时候,会在控制台输出相应的日志如下:

  <-- GET /
GET / - 14
  --> GET / 200 19ms 234b
  <-- GET /stylesheets/style.css
GET /stylesheets/style.css - 1
  --> GET /stylesheets/style.css 200 3ms 111b
  <-- GET /favicon.ico
GET /favicon.ico - 1
  --> GET /favicon.ico 404 1ms -

默认情况下,日志是通过 console 的方式直接输出到控制台中,假如我们需要对日志做自定义的操作,比如写入到日志文件中等。可以通过类似完成,比如我记录时间:

app.use(logger((str) => {
  console.log(new Date() + str)
  // redirect koa logger to other output pipe
  // default is process.stdout(by console.log function)
}))

结果:

Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  <-- GET /
GET / - 10ms
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  --> GET / 200 20ms 226b
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  <-- GET /stylesheets/style.css
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  --> GET /stylesheets/style.css 200 4ms 111b

koa-log4js

koa-logger 比较轻量,也暴露了相对灵活的接口。但在实际业务中使用,我个人推荐使用 koa-log4js。主要理由如下:

  • koa-logger 看起来只支持中间件的使用方式,而不支持上报特定日志的功能。
  • 内置的功能比较少。比如日志的分类和落盘等。

koa-log4jslog4js 做了一层包装,从而支持 Koa 日志的中间件。它的配置和 log4js 是保持一致的。所以假如你用 log4js 的话,使用上应该是一致的。

使用

安装:

npm i --save koa-log4

先来看使用,根目录新建一个文件夹 log。并且新建一个文件夹 utils,在其中新建文件 logger.js。代码如下:

const path = require(&#39;path&#39;);
const log4js = require(&#39;koa-log4&#39;);
const RUNTIME_PATH = path.resolve(__dirname, &#39;../&#39;);
const LOG_PATH = path.join(RUNTIME_PATH, &#39;log&#39;);

log4js.configure({
  // 日志的输出
  appenders: {
    access: {
      type: &#39;dateFile&#39;,
      pattern: &#39;-yyyy-MM-dd.log&#39;, //生成文件的规则
      alwaysIncludePattern: true, // 文件名始终以日期区分
      encoding: &#39;utf-8&#39;,
      filename: path.join(LOG_PATH, &#39;access.log&#39;) //生成文件名
    },
    application: {
      type: &#39;dateFile&#39;,
      pattern: &#39;-yyyy-MM-dd.log&#39;,
      alwaysIncludePattern: true,
      encoding: &#39;utf-8&#39;,
      filename: path.join(LOG_PATH, &#39;application.log&#39;)
    },
    out: {
      type: &#39;console&#39;
    }
  },
  categories: {
    default: { appenders: [ &#39;out&#39; ], level: &#39;info&#39; },
    access: { appenders: [ &#39;access&#39; ], level: &#39;info&#39; },
    application: { appenders: [ &#39;application&#39; ], level: &#39;all&#39;}
  }
});

// getLogger 传参指定的是类型
exports.accessLogger = () => log4js.koaLogger(log4js.getLogger(&#39;access&#39;)); // 记录所有访问级别的日志
exports.logger = log4js.getLogger(&#39;application&#39;);

简单解释一下,configurelog4js-node 的配置(后文会详解),通过 getLogger 函数传参为日志类型,比如 access 是访问级别日志。

然后在 app.js 中加入:

const { accessLogger, logger } = require(&#39;./utils/logger&#39;);
app.use(accessLogger())

以及 routes/index.js 中加入:

+ const { logger } = require(&#39;../utils/logger&#39;)

router.get(&#39;/&#39;, async (ctx, next) => {
+  logger.info(&#39;我是首页&#39;);
  await ctx.render(&#39;index&#39;, {
    title: &#39;Hello Koa 2!&#39;
  })
})

刷新,可以看到在 log 文件夹中输出两个文件:

Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

分别记录了:

[2021-10-12T10:43:33.914] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 226 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
[2021-10-12T10:43:34.065] [INFO] access - ::1 - - "GET /stylesheets/style.css HTTP/1.1" 200 111 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
[2021-10-12T10:43:33.902] [INFO] application - 我是首页

接下来我们来看看 log4js 的配置。

level

日志的分级,主要作用是更好的展示日志(不同颜色)、有选择的落盘日志,比如在生产中避免一些 debug 的敏感日志被泄露。log4js 默认有九个分级(你可以通过 levels

테스트 환경에서는 할 수 있는데 왜 live 환경에서는 작동하지 않는 문제를 자주 접하게 됩니다. 로그가 없으면 이 문제에 대한 단서가 없습니다.

그래서 이번 글에서는

NodeNode.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다. 서비스에서 로그를 작성하는 방법에 대해 알아보겠습니다.

빠른 koa 프로젝트 만들기

🎜먼저 koa2가 전역적으로 설치되었는지 확인하세요. 🎜
{
  ALL: new Level(Number.MIN_VALUE, "ALL"),
  TRACE: new Level(5000, "TRACE"),
  DEBUG: new Level(10000, "DEBUG"),
  INFO: new Level(20000, "INFO"),
  WARN: new Level(30000, "WARN"),
  ERROR: new Level(40000, "ERROR"),
  FATAL: new Level(50000, "FATAL"),
  MARK: new Level(9007199254740992, "MARK"), // 2^53
  OFF: new Level(Number.MAX_VALUE, "OFF")
}
🎜그런 다음 실행 :🎜
{
  default: { appenders: [ &#39;out&#39; ], level: &#39;info&#39; },
  access: { appenders: [ &#39;access&#39; ], level: &#39;info&#39; },
  application: { appenders: [ &#39;application&#39; ], level: &#39;all&#39;}
}
🎜기본 서비스가 준비되었습니다. http://localhost:3000/를 방문하면 다음 페이지가 표시됩니다: 🎜🎜Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.🎜🎜위 내용은 koa 서비스를 구축하는 빠른 방법입니다. 이 프로젝트에는 내장된 로깅 라이브러리인 koa-logger가 있습니다. 먼저 그것이 무엇을 하는지 살펴보겠습니다. 🎜

koa-logger

🎜이 라이브러리는 비교적 간단하며 요청 방법, URL, 시간 등 미들웨어로 사용 시 주의 사항: 모든 미들웨어 앞에 배치하는 것이 좋습니다. 이는 koa의 양파 모델과 관련이 있습니다. 첫 번째 시간이 아닌 경우 계산된 시간이 부정확해집니다. 🎜
// 日志的输出
appenders: {
  access: {
    type: &#39;dateFile&#39;,
    pattern: &#39;-yyyy-MM-dd.log&#39;, //生成文件的规则
    alwaysIncludePattern: true, // 文件名始终以日期区分
    encoding: &#39;utf-8&#39;,
    filename: path.join(LOG_PATH, &#39;access.log&#39;) //生成文件名
  },
  out: {
    type: &#39;console&#39;
  }
}
🎜응답 리소스에 액세스하면 해당 로그가 다음과 같이 콘솔에 출력됩니다. 🎜rrreee🎜기본적으로 로그는 콘솔을 통해 콘솔에 직접 출력됩니다. 로그 파일에 쓰기 등 로그에 대한 작업을 수행해야 합니다. 예를 들어, 시간을 기록합니다: 🎜rrreee🎜결과: 🎜rrreee

koa-log4js

🎜koa-logger 는 비교적 가볍고 비교적 유연한 인터페이스를 제공합니다. 하지만 실제 비즈니스 용도로 사용하려면 개인적으로 koa-log4js를 사용하는 것이 좋습니다. 주된 이유는 다음과 같습니다. 🎜
  • koa-logger는 미들웨어 사용만 지원하는 것으로 보이며, 특정 로그를 보고하는 기능은 지원하지 않습니다.
  • 내장된 기능이 상대적으로 적습니다. 예를 들어 로그의 분류 및 배치 등이 있습니다.
🎜koa-log4js🎜 맞습니다log4js🎜는 Koa 로그 미들웨어를 지원하기 위해 패키징 계층을 만들었습니다. 해당 구성은 log4js와 일치합니다. 따라서 log4js를 사용하는 경우 사용법이 일관되어야 합니다. 🎜

사용법

🎜설치: 🎜rrreee🎜사용법을 먼저 살펴보고 새 폴더 log를 만듭니다. 루트 디렉토리. 그리고 새 폴더 utils를 만들고 그 안에 새 파일 logger.js를 만듭니다. 코드는 다음과 같습니다. 🎜rrreee🎜간단히 설명하자면, configurelog4js-node의 구성(자세한 내용은 추후 설명하겠습니다)이며, 매개변수는 getLogger 함수 로그 유형입니다. 예를 들어 access는 액세스 수준 로그입니다. 🎜🎜그런 다음 app.js에 🎜rrreee🎜를 추가하고 routes/index.js에 🎜rrreee🎜를 추가합니다. 새로고침하면 log 폴더에 두 개의 파일: 🎜🎜<img src="https://img.php.cn/upload/image/459/158/929/1640659356431805.png" title="1640659356431805.png" alt=" Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.">🎜🎜 각각 기록됨: 🎜rrreeerrreee🎜 다음으로 <code>log4js의 구성을 살펴보겠습니다. 🎜

레벨

🎜로그 분류의 주요 기능은 로그를 더 잘 표시하고(다른 색상) 로그를 선택적으로 배치하는 것입니다. 일부 디버그 민감한 로그가 프로덕션 환경에서 유출되는 것을 방지합니다. log4js에는 기본적으로 다음과 같이 9개의 레벨이 있습니다(레벨을 통해 수정할 수 있음). 🎜rrreee🎜아래 그림과 같이: 🎜🎜🎜🎜

只会输出级别相等或者级别高的日志。比如你配置了 WARN,就不会输出 INFO 的日志。 可以在下面配置的 categories 中配置不同的类型日志的日志级别。

categories

日志类别。必须配置默认日志类别,用于没有命中的情况下的兜底行为。该配置为一个对象,key 值为分类名称。比如上述 demo 中:

{
  default: { appenders: [ &#39;out&#39; ], level: &#39;info&#39; },
  access: { appenders: [ &#39;access&#39; ], level: &#39;info&#39; },
  application: { appenders: [ &#39;application&#39; ], level: &#39;all&#39;}
}

其中每个类别都有两个配置 appenders 是一个字符串数组,是输出配置(后文中会详解),可以指定多个,至少要有一个。level 是上文日志级别。

appenders

解决了日志分级和分类,接下来是日志落盘,也就是输出日志的问题。对应的配置是 appenders,该配置的 key 值为自定义的名称(可以给 categories 中的 appenders 使用),属性值为一个对象,配置输出类型。如下所示:

// 日志的输出
appenders: {
  access: {
    type: &#39;dateFile&#39;,
    pattern: &#39;-yyyy-MM-dd.log&#39;, //生成文件的规则
    alwaysIncludePattern: true, // 文件名始终以日期区分
    encoding: &#39;utf-8&#39;,
    filename: path.join(LOG_PATH, &#39;access.log&#39;) //生成文件名
  },
  out: {
    type: &#39;console&#39;
  }
}

其中,out 指的是通过 console 输出,这个可以作为我们的一个兜底。accesstypedataFile,指的是输出文件,然后配置文件的命名和输出路径。除了这个类型,详情可以看官网,比如 SMTP 通过邮件发送(这个需要 nodemailer

总结配置

日志分级、日志分类以及日志落盘,配置上的关系如下:

Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.

总结

日志对于我们服务端排查定位问题非常重要,本文通过 koa-loggerkoa-log4js 讲解了如何上报日志。

koa-logger 比较轻量,记录请求的基本信息,也提供了一定的自定义能力。

koa-log4js 在日志分级、日志分类以及日志落盘上提供了一定的能力,个人认为基本这个更加适用于生产环境。

更多node相关知识,请访问:nodejs 教程!!

위 내용은 Node.js 서비스에서 로그를 작성하는 방법을 단계별로 가르쳐드립니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제