在express中使用morgan创建和写入日志文件

时间:2015-06-01 20:53:18

标签: javascript node.js express

所以我试图创建一个日志文件,如果它不存在,如果它确实存在,那么我希望摩根将日志写入它。这是代码

$ch = curl_init();
$agent = $_SERVER["HTTP_USER_AGENT"];
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$result = curl_exec($ch);
return $result;  

第一个函数创建日志目录和access.log文件。问题是当我点击路线时它没有记录任何东西来访问.log。它在app.use调用不在fs.exists之前工作,所以我不知道这是不是问题,但是当它不在fs.exists中时它会因为文件尚未创建。

1 个答案:

答案 0 :(得分:0)

您似乎需要使用fs.existsSync。原因是app.use调用由于对fs.exists的异步调用而在事件循环中进一步执行。我的猜测是,在调用fs.exists回调时,您的快速应用程序已经配置并已开始侦听。试试这个:

var fs = require('fs');
var path = require('path');
var logPath = path.join(__dirname, 'log', 'access.log');

if (fs.existsSync(logPath)) {
  app.use(logger('common', {
    stream: fs.createWriteStream(logPath, {flags:'a'});
  }));
  console.log('access.log exists!');
} else {
  fs.mkdirSync(path.dirname(logPath));
  fs.writeFileSync(logPath, {flags:'wx'});
  console.log('access.log created!');
}

由于这似乎是在应用程序启动期间运行的代码,因此使其同步不应该非常昂贵。我确定你可以通过重新构建你的快递应用程序及其所有中间件的方式来使异步设置工作,但它不会为你节省很多,因为这些操作显然需要按顺序发生无论如何app.listen