質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Node.js

    2355questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Express

    301questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

  • IBM Cloud

    7questions

[Node.js][Express]log4jsを使ったアクセスログとアプリケーションログの出力方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 391

iarik

score 88

質問

node.jsとExpressを使ったWebアプリケーション(フォルダー構成はexpress-generatorで作成)を作っています。
ログの出力をlog4jsを使って出力したいと思い、log4jsのドキュメントから以下URLの記述を真似することでアクセスログをlog4jsを介して出力されることは確認出来ましたが

https://github.com/log4js-node/log4js-node/blob/master/docs/connect-logger.md

routesフォルダー配下にあるrouteメソッドを記述したファイル(index.js)からlog4jsを使ってアプリケーションログを出力したいのですがlogger is not definedと出力されます。

外出しされたjsファイルからlog4jsを呼び出してアプリケーションログを出力する方法についてご教示頂けますでしょうか。

app.js

// import設定
// var createError = require('http-errors');
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const cookieParser = require('cookie-parser');
const log4js = require('log4js');
const helmet = require('helmet');

// Express設定
var app = express();
// テンプレートエンジン設定
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// log設定
log4js.configure({
  appenders: {
    console: { type: 'console' }
  },
  categories: {
    default: { appenders: ['console'], level: 'info' }
  }
});
const appName = require('./package.json').name;
const logger = log4js.getLogger(appName);
app.use(log4js.connectLogger(logger, { level: process.env.LOG_LEVEL || 'auto' }));
// body-parser設定
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// cookie設定
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// helmet設定
app.use(helmet());
app.use(helmet.noCache());

// ルーティング設定
var indexRouter = require('./routes/index');

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.code = 404;
  err.message = 'Not Found';
  next(err);
});
// error handler
app.use(function(err, req, res, next) {
  // render the error page
  const error = {
    code: err.code || 'ERROR',
    message: err.message || err
  };
  res.status(err.status || err.code || 500).render('error');
});

module.exports = app;

index.js

const express = require('express');
const router = new express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  console.log('[GET]call /'); // 問題調査用に記載:リクエストが届いているか確認
  logger.info('[GET]render page');
  res.status(200).render('index', { title: 'Express', body: 'Welcome to Express' });
});

module.exports = router;

www

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 * @param  val is port number.
 * @returns return port number.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
  console.log('[INFO][Express]Listening on ' + bind);
  debug('Listening on ' + bind);
}

ローカルPCのコンソールで出力されたログ

$ node ./bin/www
[INFO][Express]Listening on port 3000
[GET]call /
[2019-02-16T20:36:07.578] [ERROR] demo - [ERROR]call error handler.error is:  {
  "code": "ERROR",
  "message": "logger is not defined"
}
[2019-02-16T20:36:07.610] [INFO] demo - ::1 - - "GET / HTTP/1.1" 500 156 "" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"

環境

node.js:8.15
フレームワーク:Express
稼働環境:IBM Cloud/ローカルPCで動作がokだったらPaaSへ上げています
package.json

  "dependencies": {
    "body-parser": "^1.18.3",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "ejs": "^2.6.1",
    "express": "~4.16.0",
    "express-validator": "^5.3.1",
    "helmet": "^3.15.1",
    "http-errors": "~1.6.2",
    "log4js": "^4.0.2",
    "morgan": "~1.9.0",
    "mqlight": "^2.0.2017081002",
    "request": "^2.88.0"
  }

環境構成

/ROOT FOLDER/
 L app.js
 L package.json
 L /bin/
   L www
 L /public/
 L /routes/
   L index.js
 L /test/
 L /views/
   L index.ejs
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

index.jsでloggerの宣言がないからだと思います。

app.jsで宣言されているようにindex.jsでも宣言するか
モジュール化して読み込めばよいのではと思います。

参考URL
https://qiita.com/tnnsst35/items/7e7129c7758c9c560c41

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/04 16:43

    ご連絡が遅くなり申し訳ございません、参考URLありがとうございました。
    頂いたURLを元にモジュール化して対応致しました。

    キャンセル

0

以下のようなクラスファイルを作成して各ファイルの先頭で呼び出して利用する方法を取りました  
皆様のご参考になれば。

util/Util.js

// import setting
const log4js = require('log4js');
// setting log4js
log4js.configure({
  appenders: {
    out: {
      type: 'stdout',
      layout: {
        type: 'pattern',
        pattern: '%[[%d{yyyy-MM-dd hh:mm:ss.SSS}] [%p] %c -%] %m'
      }
    }
  },
  categories: {
    default: {
      appenders: ['out'],
      level: 'debug'
    }
  }
});
const logger = log4js.getLogger(require('../package.json').name);

// util class
module.exports = class Util {
  /**
   * logging
   * @param {string} level: "INFO" or "ERROR" or "DEBUG"
   * @param {*} msg: logging message
   */
  logging(level, msg) {
    switch (level) {
      case 'info':
        logger.info(msg);
        break;
      case 'error':
        logger.error(msg);
        break;
      case 'debug':
        logger.debug(msg);
    }
  }
};

routes/index.js

const express = require('express');
const router = new express.Router();
// import uitl/function or class
// logging class path is </root>/util/Util.js
const Util = require('../util/Util.js');
const util = new Util();

/* GET home page. */
router.get('/', function(req, res, next) {
  util.logging('info', '[GET:/top]call /');
  util.logging('info', '[GET:/top]render page');
  res.status(200).render('index', { title: 'Express', body: 'Welcome to Express' });
});

module.exports = router;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Node.js

    2355questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Express

    301questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

  • IBM Cloud

    7questions