LoginSignup
1
6

More than 5 years have passed since last update.

Node.jsでログを日時名のファイルで指定フォルダ内に書き出す

Last updated at Posted at 2017-04-17

1. 概要

内容は以下の通りです。
・date-utilsを使った日付、時刻の取得
・fsを使ったファイルの作成、書き込み
・mkdirpを使ったフォルダの作成

昔の自分の記事をみるとEdisonでNode.jsを使っていたようなのですが、それすらも忘れており現在勉強中です。

2. 環境

  • Macbook Pro(Retina 13-inch, Mid 2014)
  • macOS Sierra 10.12.4
  • node v7.7.4

3. 参考サイト

  1. Node.jsで現在時刻を取得 - Qiita
  2. pxt | node.jsに入門してみる。3 ~ファイルの読み書き編~
  3. node.jsのいろいろなモジュール21 – mkdirpでディレクトリ作成 | Developers.IO

3. npmでのモジュールのインストール

3.1 date-utilsのインストール

参考サイト1を参考にしました。

インストールは非常に簡単でした。

$ npm install date-utils

3.2 mkdirpのインストール

参考サイト3を参考にしました。

インストールはこちらも簡単です。

$ npm install mkdirp

4. プログラムの作成

4.1 日時の表示(date-utils)

まずは日時を取得して表示するプログラムを作成します。
参考サイト1に書かれているものを動かしてみます。

app.js
require('date-utils');

var dt = new Date();
var formatted = dt.toFormat("YYYYMMDDHH24MISS");
console.log(formatted);

実行はnode app.jsです。

4.2 ファイルの作成(fs)

4.1で取得した日時を名前にしたファイルを作成します。
参考サイト2をベースに参考サイト1を付け加えてみました。

fs_test.js
require('date-utils');
var fs = require('fs');

var dt = new Date();
var formattedDate = dt.toFormat('YYYYMMDDHH24MISS');
var filename = './' + formattedDate + '.txt'

function fileSaveContents( filename, str ){
  var fd = fs.openSync(filename, 'w');
  fs.writeSync(fd, str, 0, 'ascii');
  fs.closeSync(fd);

  return true;
};

console.log( fileSaveContents(filename, formattedDate) );

実行すると同じフォルダに20170416111140.txtのようなファイルが生成されており、中にもファイル名と同じ日付と時刻が書き込まれています。

4.3 ファイルをLogフォルダの中に作成(mkdirp)

参考サイト3を参考にしました。

mkdirp_test.js
require('date-utils');
var fs = require('fs');
var mkdirp = require('mkdirp');

var dt = new Date();
var formattedDate = dt.toFormat('YYYYMMDDHH24MISS');
var filename = './log/' + formattedDate + '.txt'

function fileSaveContents( filename, str ){

  mkdirp.sync('./log', function (err) {
    if (err){
      console.error(err);
    } else {
      console.log('success');
    }
  });

  var fd = fs.openSync(filename, 'w');
  fs.writeSync(fd, str, 0, 'ascii');
  fs.closeSync(fd);

  return true;
};

console.log( fileSaveContents(filename, formattedDate) );

4.4 ファイルに複数のデータを追加する

現状ではファイルには日時データしか書き込まれていません。実際にはログとなるデータを複数書き込みたいと思っています。そこで参考サイト2を見ながら複数のデータを書き込めるようにしました。

機能ごとに分けようと思いました。
とりあえず動きましたが、どういった書き方がいいのかまだ分かっていません。

ファイルにデータを追記する場合の変更点は以下の通りです。

  • fd = fs.openSync(filename, 'a');について書き込み専用モードの'w'から'a'としました。
  • fs.writeSyncからfs.appendFileSync(fd, str + '\n', 'ascii');に変更しました。
test.js
require('date-utils');
var fs = require('fs');
var mkdirp = require('mkdirp');
var filename;
var formattedDate;
var fd; 

function setup(){
  var dt = new Date();
  formattedDate = dt.toFormat('YYYYMMDDHH24MISS');
  filename = './log/' + formattedDate + '.txt'
}

function open(){
  mkdirp.sync('./log', function (err) {
    if (err){
      console.error(err);
    } else {
      console.log('success');
    }
  });

  fd = fs.openSync(filename, 'a');  
}

function write(str){
  fs.appendFileSync(fd, str + '\n', 'ascii');
}

function close(){
  fs.closeSync(fd);
  return true;
}

function fileSaveContents( filename, str ){

  mkdirp.sync('./log', function (err) {
    if (err){
      console.error(err);
    } else {
      console.log('success');
    }
  });

  var fd = fs.openSync(filename, 'w');
  fs.writeSync(fd, str, 0, 'ascii');
  fs.closeSync(fd);

  return true;
};

setup();
open();
write(formattedDate);
write('test');
close();

node test.jsで実行すると、logフォルダの日時ファイルが生成され、1行目に日時、2行目に「test」の文字が書かれています。

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6