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


# 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](http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)
2. [pxt | node.jsに入門してみる。3 ～ファイルの読み書き編～](http://www.pxt.jp/ja/diary/article/268/)
3. [node.jsのいろいろなモジュール21 – mkdirpでディレクトリ作成 ｜ Developers.IO](http://dev.classmethod.jp/server-side/mkdirp/)

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

## 3.1 date-utilsのインストール

[参考サイト1](http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)を参考にしました。

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

```
$ npm install date-utils
```

## 3.2 mkdirpのインストール

[参考サイト3](http://dev.classmethod.jp/server-side/mkdirp/)を参考にしました。

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

```
$ npm install mkdirp
```

# 4. プログラムの作成

## 4.1 日時の表示(date-utils)

まずは日時を取得して表示するプログラムを作成します。
[参考サイト1](http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)に書かれているものを動かしてみます。

``` javascript: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](http://www.pxt.jp/ja/diary/article/268/)をベースに[参考サイト1](http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)を付け加えてみました。

``` javascript: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](http://dev.classmethod.jp/server-side/mkdirp/)を参考にしました。


``` javascript: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](http://www.pxt.jp/ja/diary/article/268/)を見ながら複数のデータを書き込めるようにしました。

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

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

* ```fd = fs.openSync(filename, 'a');```について書き込み専用モードの'w'から'a'としました。
* ```fs.writeSync```から```fs.appendFileSync(fd, str + '\n', 'ascii');```に変更しました。


```javascript: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」の文字が書かれています。