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

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

新規登録して質問してみよう
ただいま回答率
85.37%
IBM Cloud

IBM Cloud(旧Bluemix)は、IBM社のクラウドサービスの名称。インフラストラクチャーからアプリケーションまでを構築、管理、実行するクラウド基盤です。

Node.js

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

Express

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

Q&A

解決済

2回答

5819閲覧

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

iarik

総合スコア101

IBM Cloud

IBM Cloud(旧Bluemix)は、IBM社のクラウドサービスの名称。インフラストラクチャーからアプリケーションまでを構築、管理、実行するクラウド基盤です。

Node.js

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

Express

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

0グッド

0クリップ

投稿2019/02/16 12:04

編集2019/02/16 16:28

質問

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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;

投稿2019/03/04 07:49

編集2019/03/04 07:50
iarik

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

投稿2019/02/18 08:36

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iarik

2019/03/04 07:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問